image_optim
Optimize (lossless compress) images (jpeg, png, gif, svg) using external utilities:
- advpng from AdvanceCOMP (will use zopfli on default/maximum level 4)
- gifsicle
- jhead
- jpegoptim
- jpegtran from Independent JPEG Group's JPEG library
- optipng
- pngcrush
- pngout
- pngquant
- svgo
Based on ImageOptim.app.
Documentation for latest version and master.
Gem installation
gem install image_optim
Bundler
Add to your Gemfile
:
gem 'image_optim'
With version:
gem 'image_optim', '~> 0.11'
If you want to check latest changes:
gem 'image_optim', :git => 'git://github.com/toy/image_optim.git'
Binaries location
Simplest way for image_optim
to locate binaries is to install them in common location present in PATH
(see Binaries installation).
If you cannot install to common location, then install to custom one and add it to PATH
.
Specify custom bin location using XXX_BIN
environment variable (JPEGOPTIM_BIN
, OPTIPNG_BIN
, …).
Besides permanently setting environment variables in ~/.profile
, ~/.bash_profile
, ~/.bashrc
, ~/.zshrc
, … they can be set:
- before command:
PATH="/custom/location:$PATH" image_optim *.jpg
for example:
PATH="/Applications/ImageOptim.app/Contents/MacOS:$PATH" image_optim *.jpg
- inside script:
ENV['PATH'] = "/custom/location:#{ENV['PATH']}"; ImageOptim.optimize_images([…])
for example:
ENV['PATH'] = "/Applications/ImageOptim.app/Contents/MacOS:#{ENV['PATH']}"; ImageOptim.optimize_images([…])
Binaries installation
Linux - Debian/Ubuntu
sudo apt-get install -y advancecomp gifsicle jhead jpegoptim libjpeg-progs optipng pngcrush pngquant
If you get an old version of pngquant
, please check how to install up-to-date version or compile from source at http://pngquant.org/.
Linux - RHEL/Fedora/Centos
sudo yum install -y advancecomp gifsicle jhead libjpeg optipng pngquant
You may also need to install libjpeg-turbo-utils
instead of libjpeg
:
sudo yum install -y libjpeg-turbo-utils
You will also need to install jpegoptim
and pngcrush
from source:
jpegoptim
Replace X.Y.Z
with latest version number from http://www.kokkonen.net/tjko/projects.html#jpegoptim.
JPEGOPTIM_VERSION=X.Y.Z
cd /tmp
curl -O http://www.kokkonen.net/tjko/src/jpegoptim-$JPEGOPTIM_VERSION.tar.gz
tar zxf jpegoptim-$JPEGOPTIM_VERSION.tar.gz
cd jpegoptim-$JPEGOPTIM_VERSION
./configure && make && make install
pngcrush
Replace X.Y.Z
with latest version number from http://sourceforge.net/projects/pmt/files/pngcrush/.
PNGCRUSH_VERSION=X.Y.Z
cd /tmp
curl -O http://iweb.dl.sourceforge.net/project/pmt/pngcrush/$PNGCRUSH_VERSION/pngcrush-$PNGCRUSH_VERSION.tar.gz
tar zxf pngcrush-$PNGCRUSH_VERSION.tar.gz
cd pngcrush-$PNGCRUSH_VERSION
make && cp -f pngcrush /usr/local/bin
OS X: Macports
sudo port install advancecomp gifsicle jhead jpegoptim jpeg optipng pngcrush pngquant
OS X: Brew
brew install advancecomp gifsicle jhead jpegoptim jpeg optipng pngcrush pngquant
pngout installation (optional)
You can install pngout
by downloading and installing the binary versions.
Note: pngout is free to use even in commercial soft, but you can not redistribute, repackage or reuse it without consent and agreement of creator. license
svgo installation (optional)
svgo
is available from NPM.
npm install -g svgo
Usage
From shell
image_optim *.{jpg,png,gif,svg}
image_optim -h
From ruby
Initialize optimizer (or you can call optimization methods directly on ImageOptim
):
image_optim = ImageOptim.new
image_optim = ImageOptim.new(:pngout => false)
image_optim = ImageOptim.new(:nice => 20)
Optimize image getting temp path:
image_optim.optimize_image('a.png')
Optimize image in place:
image_optim.optimize_image!('b.jpg')
Optimize image data:
image_optim.optimize_image_data(data)
Multiple images:
image_optim.optimize_images(Dir['*.png']) do |unoptimized, optimized|
if optimized
puts "#{unoptimized} => #{optimized}"
end
end
image_optim.optimize_images!(Dir['*.*'])
image_optim.optimize_images_data(datas)
From rails
ImageOptim::Railtie
will automatically register sprockets preprocessor unless you set config.assets.image_optim = false
or config.assets.compress = false
(later for partial rails 3 compatibility).
You can provide options for image_optim used for preprocessor through config config.assets.image_optim = {nice: 20, svgo: false}
(ruby1.8 style: {:nice => 20, :svgo => false}
).
Check available options in options section.
Image optimization can be time consuming, so depending on your deployment process you may prefer to optimize original asset files.
Configuration
Configuration in YAML format will be read and prepanded to options from two paths:
$XDG_CONFIG_HOME/image_optim.yml
(by default~/.config/image_optim.yml
).image_optim.yml
in current working directory
Example configuration:
nice: 20
pngout: false # disable
optipng:
level: 5
Options
:nice
— Nice level (defaults to10
):threads
— Number of threads or disable (defaults to number of processors):verbose
— Verbose output (defaults tofalse
)
Worker can be disabled by passing false
instead of options hash.
:advpng =>
:level
— Compression level:0
- don't compress,1
- fast,2
- normal,3
- extra,4
- extreme (defaults to4
)
:gifsicle =>
:interlace
— Turn interlacing on (defaults tofalse
)
:jhead =>
Worker has no options
:jpegoptim =>
:strip
— List of extra markers to strip::comments
,:exif
,:iptc
,:icc
or:all
(defaults to:all
):max_quality
— Maximum image quality factor0
..100
(defaults to100
)
:jpegtran =>
:copy_chunks
— Copy all chunks (defaults tofalse
):progressive
— Create progressive JPEG file (defaults totrue
):jpegrescan
— Use jpegtran through jpegrescan, ignore progressive option (defaults tofalse
)
:optipng =>
:level
— Optimization level preset:0
is least,7
is best (defaults to6
):interlace
— Interlace,true
- interlace on,false
- interlace off,nil
- as is in original image (defaults tofalse
)
:pngcrush =>
:chunks
— List of chunks to remove or:alla
- all except tRNS/transparency or:allb
- all except tRNS and gAMA/gamma (defaults to:alla
):fix
— Fix otherwise fatal conditions such as bad CRCs (defaults tofalse
):brute
— Brute force try all methods, very time-consuming and generally not worthwhile (defaults tofalse
)
:pngout =>
:copy_chunks
— Copy optional chunks (defaults tofalse
):strategy
— Strategy:0
- xtreme,1
- intense,2
- longest Match,3
- huffman Only,4
- uncompressed (defaults to0
)
:pngquant =>
:quality
— min..max - don't save below min, use less colors below max (both in range0..100
; in yaml -!ruby/range 0..100
) (defaults to100..100
):speed
— speed/quality trade-off:1
- slow,3
- default,11
- fast & rough (defaults to3
)
:svgo =>
Worker has no options
Contributing
If you would like to contribute - that is great and you are very welcome. Please check few notes about CONTRIBUTING.
Copyright
Copyright (c) 2012-2014 Ivan Kuchin. See LICENSE.txt for details.