grunt-respimg
v1.1.0
Published
A responsive image workflow for optimizing and resizing your images
Downloads
90
Maintainers
Readme
grunt-respimg
A responsive image workflow for optimizing and resizing your images.
This plugin will:
- Efficiently resize PNGs, JPEGs, and non-animated GIFs to widths that you specify
- Rasterize SVGs and PDFs to PNGs at widths that you specify
- Optimize all your input and output images (PNGs, JPEGs, GIFs, and SVGs)
The output images should be visually indistinguishable from those output by Photoshop’s Save for Web…, but with (much) smaller average file sizes.
This plugin is heavily indebted to (and has portions borrowed liberally from):
Getting Started
This plugin requires Grunt ~0.4.5
.
If you haven’t used Grunt before, be sure to check out the Getting Started guide, as it explains how to create a Gruntfile as well as install and use Grunt plugins.
Installing ImageMagick
To use this grunt task, you’ll need to have ImageMagick installed. If you want this grunt task to be able to rasterize PDFs, you’ll need to install it with GhostScript support.
If you’re using a Mac with Homebrew, you can install ImageMagick like this:
brew install imagemagick --with-ghostscript
If you don’t have a Mac or aren’t using Homebrew, you should be able to find ImageMagick in your favourite package manager, or download it from the ImageMagick site.
Installing image optimizers
If you plan to use image optimization with this plugin (which I recommend you do, and which is the default), you’ll probably to install the image optimizers first. With this plugin you can use image_optim, picopt, and/or ImageOptim. Unfortunately, installing them can be a bit…complicated.
If you’re not able to get these working, or if you don’t care about image optimization, you can turn optimization off by setting optimize: false
in your Gruntfile options:
respimg: {
nooptim: {
options: {
optimize: false
},
files: [{
expand: true,
cwd: 'path/to/input',
src: ['raster/**.{jpg,gif,png,svg,pdf}'],
dest: 'path/to/output'
}]
}
}
These installation assumptions assume you’re on a Mac, but the instructions should be relatively similar for Linux systems as well. I’m not sure about Windows:
First, download and install pngout. To install pngout, you’ll need to move it to somewhere in your PATH. E.g.,
mv ~/Downloads/pngout-20150319-darwin/pngout /usr/local/bin/
Then, download and install ImageOptim (Mac only). To install ImageOptim, decompress the .tbz2 file you downloaded from the site, and drag the ImageOptim.app
to your Applications folder.
Using your favorite package manager (e.g. Homebrew on OS X), install cairo, optipng, jpeg, and gifsicle:
brew install cairo optipng jpeg gifsicle
Using gem
(the Ruby gem package manager), install image_optim and image_optim_pack:
gem install image_optim image_optim_pack
If you get a permissions error, you may need to use sudo
.
sudo gem install image_optim image_optim_pack
Using pip
(a Python package manager), install picopt:
pip install picopt
If you’re on a Mac, the Cairo install may be a bit wonky, so you may need to do this:
export PKG_CONFIG_PATH=/opt/X11/lib/pkgconfig
Installing the plugin
Once you’ve installed the optimizers (or if you’re not going to do optimization), you may install this plugin with this command:
npm install grunt-respimg --save-dev
Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:
grunt.loadNpmTasks('grunt-respimg');
The “respimg” task
Overview
In your project’s Gruntfile, add a section named respimg
to the data object passed into grunt.initConfig()
.
grunt.initConfig({
respimg: {
options: {
// Task-specific options go here.
},
your_target: {
// Target-specific file lists go here.
},
},
});
Options you should care about
The only option you should really care about setting is widths
:
options.widths
Type: int[]
Default value: [ 320, 640, 1280 ]
The widths that images should be resized to.
options.widthAsDir
Type: bool
Default value: false
Save resized images under a directory with the same name of the width instead adding the width to the filename.
options.optimize
Type: false
, object
When multiple programs are used for optimization, they are run in the following order:
- svgo
- image_optim
- picopt
- ImageOptim
Note: options.optimize.svg
, options.optimize.rasterInput
, and options.optimize.rasterOutput
are deprecated, but should still work. Please switch your syntax to use the new optimize
options below.
options.optimize.input
Type: object
options.optimize.input.svgo
Type: int
or null
Possible values: null
, 0
–9
Default value: 0
The number of times input files should be run through SVGO optimization.
options.optimize.input.image_optim
Type: int
or null
Possible values: null
, 0
–9
Default value: 0
The number of times input files should be run through image_optim optimization.
options.optimize.input.imageOptim
Type: int
or null
Possible values: null
, 0
–9
Default value: 0
The number of times input files should be run through imageOptim optimization.
options.optimize.input.picopt
Type: int
or null
Possible values: null
, 0
–9
Default value: 0
The number of times input files should be run through picopt optimization.
options.optimize.output
Type: object
options.optimize.output.svgo
Type: int
or null
Possible values: null
, 0
–9
Default value: 0
The number of times output files should be run through SVGO optimization.
options.optimize.output.image_optim
Type: int
or null
Possible values: null
, 0
–9
Default value: 0
The number of times output files should be run through image_optim optimization.
options.optimize.output.imageOptim
Type: int
or null
Possible values: null
, 0
–9
Default value: 0
The number of times output files should be run through imageOptim optimization.
options.optimize.output.picopt
Type: int
or null
Possible values: null
, 0
–9
Default value: 0
The number of times output files should be run through picopt optimization.
Options you probably don’t need to care about
For the most part, you should probably use the default options. They are designed to produce images that are generally visually indistinguishable from Photoshop’s Save for Web…, but at a smaller file size.
options.alpha
Type: String
or null
Possible values: null
, Activate
, Associate
, Background
, Copy
, Deactivate
, Disassociate
, Extract
, Off
, On
, Opaque
, Remove
, Set
, Shape
, Transparent
Default value: null
Gives control of the alpha/matte channel of an image. – ImageMagick: Command-line Options (alpha)
options.background
Type: String
or null
Possible values: null
or an ImageMagick-compatible color
Default value: null
Set the background color. – ImageMagick: Command-line Options (background)
options.colorspace
Type: String
or null
Possible values: null
, CMY
, CMYK
, Gray
, HCL
, HCLp
, HSB
, HSI
, HSL
, HSV
, HWB
, Lab
, LCHab
, LCHuv
, LMS
, Log
, Luv
, OHTA
, Rec601YCbCr
, Rec709YCbCr
, RGB
, scRGB
, sRGB
, Transparent
, xyY
, XYZ
, YCbCr
, YCC
, YDbDr
, YIQ
, YPbPr
, YUV
Default value: sRGB
Set the image colorspace. – ImageMagick: Command-line Options (colorspace)
options.dither
Type: String
or null
Possible values: null
, FloydSteinberg
, None
, plus
, Riemersma
Default value: None
Apply a Riemersma or Floyd-Steinberg error diffusion dither to images when general color reduction is applied via an option, or automagically when saving to specific formats. – ImageMagick: Command-line Options (dither)
options.filter
Type: String
or null
Possible values: null
, Bartlett
, Bessel
, Blackman
, Bohman
, Box
, Catrom
, Cosine
, Cubic
, Gaussian
, Hamming
, Hann
, Hanning
, Hermite
, Jinc
, Kaiser
, Lagrange
, Lanczos
, Lanczos2
, Lanczos2Sharp
, LanczosRadius
, LanczosSharp
, Mitchell
, Parzen
, Point
, Quadratic
, Robidoux
, RobidouxSharp
, Sinc
, SincFast
, Spline
, Triangle
, Welch
, Welsh
Default value: Triangle
Use this type of filter when resizing or distorting an image. – ImageMagick: Command-line Options (filter)
options.filterSupport
Type: float
or null
Default value: 2
Set the filter support radius. Defines how large the filter should be and thus directly defines how slow the filtered resampling process is. All filters have a default ‘prefered’ support size. Some filters like
Lagrange
and windowed filters adjust themselves depending on this value. With simple filters this value either does nothing (but slow the resampling), or will clip the filter function in a detrimental way. – ImageMagick: Command-line Options (filter)
options.interlace
Type: String
or null
Possible values: null
, GIF
, JPEG
, line
, none
, partition
, plane
, PNG
Default value: Triangle
the type of interlacing scheme. – ImageMagick: Command-line Options (interlace)
options.jpegFancyUpsampling
Type: String
or null
Possible values: null
, off
, on
Default value: off
ImageMagick: Command-line Options (define)
options.pngCompressionFilter
Type: int
or null
Possible values: null
, 0
–9
Default value: 5
valid values are 0 through 9. 0-4 are the corresponding PNG filters, 5 means adaptive filtering except for images with a colormap, 6 means adaptive filtering for all images, 7 means MNG "loco" compression, 8 means Z_RLE strategy with adaptive filtering, and 9 means Z_RLE strategy with no filtering. – ImageMagick: Command-line Options (define)
options.pngCompressionLevel
Type: int
or null
Possible values: null
, 0
–9
Default value: 9
valid values are 0 through 9, with 0 providing the least but fastest compression and 9 usually providing the best and always the slowest. – ImageMagick: Command-line Options (define)
options.pngCompressionStrategy
Type: int
or null
Possible values: null
, 0
–9
Default value: 1
valid values are 0 through 4, meaning default, filtered, huffman_only, rle, and fixed ZLIB compression strategy. If you are using an old zlib that does not support Z_RLE (before 1.2.0) or Z_FIXED (before 1.2.2.2), values 3 and 4, respectively, will use the zlib default strategy instead. – ImageMagick: Command-line Options (define)
options.pngExcludeChunk
Type: String
or null
Possible values: null
, all
, date
, none
, or the name(s) of chunk(s) to be excluded
Default value: all
ancillary chunks to be excluded from … PNG output.
The value can be the name of a PNG chunk-type such as bKGD, a comma-separated list of chunk-names (which can include the word date, the word all, or the word none). Although PNG chunk-names are case-dependent, you can use all lowercase names if you prefer.
options.pngPreserveColormap
Type: Boolean
or null
Default value: true
Use the existing image->colormap. Normally the PNG encoder will try to optimize the palette, eliminating unused entries and putting the transparent colors first. If this flag is set, that behavior is suppressed. – ImageMagick: Command-line Options (define)
options.posterize
Type: int
or null
Default value: 136
reduce the image to a limited number of color levels per channel. – ImageMagick: Command-line Options (posterize)
options.quality
Type: int
or null
Possible values: null
, 0
–100
Default value: 82
JPEG/MIFF/PNG compression level. – ImageMagick: Command-line Options (quality)
options.resizeFunction
Type: String
or null
Possible values: null
, adaptive
, distort
, geometry
, interpolative
, liquid
, resize
, sample
, scale
, thumbnail
Default value: thumbnail
-adaptive-resize … Resize the image using data-dependent triangulation.
-distort … distort an image
-geometry … Set the preferred size and location of the image.
-interpolative-resize … The "
-interpolative-resize
" operator is practically identical to the previous Adaptive Resize operator. However this operator will use the current "-interpolate
" setting rather than a fixed 'Mesh' interpolation method.
– Resize or Scaling -- IM v6 Examples (Interpolative Resize)
-liquid-rescale … rescale image with seam-carving.
-resize … Resize an image.
-sample … minify / magnify the image with pixel subsampling and pixel replication, respectively.
-scale … minify / magnify the image with pixel block averaging and pixel replication, respectively.
-thumbnail … Create a thumbnail of the image.
options.strip
Type: Boolean
or null
Default value: null
No-optim default value: true
strip the image of any profiles or comments. – ImageMagick: Command-line Options (strip)
options.svgoPlugins
Type: Object[]
Default value: [ { removeUnknownsAndDefaults : false } ]
…to customize SVG optimisation, you can disable/enable any SVGO plugins listed at the SVGO repository.
To disable plugins with the Gruntfile.js, look for the plugin name at the SVGO repository and copy the plugin name (minus the file extension). Then set its value in the JSON to false in comma-separated objects.
options.unsharp
Type: object
sharpen the image with an unsharp mask operator. – ImageMagick: Command-line Options (unsharp)
options.unsharp.radius
Type: float
or null
Default value: 0.25
The radius of the Gaussian, in pixels, not counting the center – ImageMagick: Command-line Options (unsharp)
options.unsharp.sigma
Type: float
or null
Default value: 0.08
No-optim default value: 0.25
The standard deviation of the Gaussian, in pixels – ImageMagick: Command-line Options (unsharp)
options.unsharp.gain
Type: float
or null
Default value: 8.3
No-optim default value: 8
The fraction of the difference between the original and the blur image that is added back into the original – ImageMagick: Command-line Options (unsharp)
options.unsharp.threshold
Type: float
or null
Default value: 0.045
No-optim default value: 0.065
The threshold, as a fraction of QuantumRange, needed to apply the difference amount – ImageMagick: Command-line Options (unsharp)
Usage Examples
Default Options
In this example, the default options are used to resize images to 320px, 640px, and 1280px wide.
grunt.initConfig({
respimg: {
default: {
files: [{
expand: true,
cwd: 'src/img/',
src: ['**.{gif,jpg,png,svg}'],
dest: 'build/img/'
}]
}
},
});
If src/img/
contained four files — testGif.gif
, testJpeg.jpg
, testPng.png
, and testSvg.svg
— then build/img/
would end up with 13 files:
testGif-w320.gif
testGif-w640.gif
testGif-w1280.gif
testJpeg-w320.jpg
testJpeg-w640.jpg
testJpeg-w1280.jpg
testPng-w320.png
testPng-w640.png
testPng-w1280.png
testSvg.svg
(this is an optimized version of the originaltestSvg.svg
)testSvg-w320.png
testSvg-w640.png
testSvg-w1280.png
Custom widths
You probably don’t really want to use the default widths. You should use widths that make sense for your project.
grunt.initConfig({
respimg: {
default: {
options: {
widths: [
200,
400
]
},
files: [{
expand: true,
cwd: 'src/img/',
src: ['**.{gif,jpg,png,svg}'],
dest: 'build/img/'
}]
}
},
});
If src/img/
contained four files — testGif.gif
, testJpeg.jpg
, testPng.png
, and testSvg.svg
— then build/img/
would end up with 9 files:
testGif-w200.gif
testGif-w400.gif
testJpeg-w200.jpg
testJpeg-w400.jpg
testPng-w200.png
testPng-w400.png
testSvg.svg
(this is an optimized version of the originaltestSvg.svg
)testSvg-w200.png
testSvg-w400.png
Contributing
In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using Grunt.
Release History
1.1.0
- PDF rasterization
- Turn off all optimization with
optimize: false
- SVG bug fixes
- README improvements
1.0.1
- Readme fixes for npm…
1.0.0
- Better, smarter defaults!
- New image optimization options, including ones that (should) work on Linux and Windows!
- More detailed install instructions!
- Excitement!
- Adventure!
0.2.0
- New option:
widthAsDir
- Better validation of options + unit tests
- README improvements
0.1.0
- README changes
- Publish with npm
0.0.1
- Initial testing release. Probably filled with with bugs.
0.0.0
- Super basic pre-0.0.1 release. Sorta working, most options ignored.