UNPKG

image-min

Version:

Minify GIF, JPEG and PNG images

124 lines (96 loc) 2.33 kB
'use strict'; var pipeline = require('multipipe'); var spawn = require('win-spawn'); var through = require('through2'); /** * Initialize `Imagemin` with options * * @param {Object} opts * @api private */ function Imagemin(opts) { opts = opts || {}; this.opts = opts; this.optimizer = this._getOptimizer(opts.ext); this.optimizationLevel = opts.optimizationLevel || 7; } /** * Optimize GIF, JPEG, and PNG images * * @api public */ Imagemin.prototype.optimize = function () { var cp = this.optimizer(); var stream = through(); return pipeline(stream, cp.stdin, cp.stdout); }; /** * Get the optimizer for a desired file extension * * @param {String} ext * @api private */ Imagemin.prototype._getOptimizer = function (ext) { ext = ext ? ext.toLowerCase() : null; var optimizers = { '.gif': this._optimizeGif, '.jpg': this._optimizeJpeg, '.jpeg': this._optimizeJpeg, '.png': this._optimizePng }; return optimizers[ext]; }; /** * Optimize a GIF image * * @api private */ Imagemin.prototype._optimizeGif = function () { var args = ['-w']; var gifsicle = require('gifsicle').path; if (this.opts.interlaced) { args.push('--interlace'); } return spawn(gifsicle, args); }; /** * Optimize a JPEG image * * @api private */ Imagemin.prototype._optimizeJpeg = function () { var args = ['-copy', 'none', '-optimize']; var jpegtran = require('jpegtran-bin').path; if (this.opts.progressive) { args.push('-progressive'); } return spawn(jpegtran, args); }; /** * Optimize a PNG image * * @api private */ Imagemin.prototype._optimizePng = function () { var args = ['-strip', 'all', '-quiet']; var optipng = require('optipng-bin').path; var pngquant; if (typeof this.optimizationLevel === 'number') { args.push('-o', this.optimizationLevel); } if (this.opts.pngquant) { pngquant = require('pngquant-bin').path; return spawn(optipng, args).stdout.pipe(spawn(pngquant, ['-'])); } return spawn(optipng, args); }; /** * Module exports */ module.exports = function (opts) { var imagemin = new Imagemin(opts); if (!imagemin.optimizer) { return through(); } return imagemin.optimize(); };