From 5d140d949f73f8bb42f3a090114deb8972dd5b3b Mon Sep 17 00:00:00 2001 From: Nathan Graves Date: Thu, 26 Apr 2018 11:49:08 -0700 Subject: [PATCH] Add support for Group4 (CCITTFAX4) compression to TIFF output (#1208) --- docs/api-output.md | 2 +- lib/output.js | 4 ++-- test/unit/io.js | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/docs/api-output.md b/docs/api-output.md index 4f37602a..0f97e86d 100644 --- a/docs/api-output.md +++ b/docs/api-output.md @@ -213,7 +213,7 @@ Use these TIFF options for output image. - `options` **[Object][15]?** output options - `options.quality` **[Number][18]** quality, integer 1-100 (optional, default `80`) - `options.force` **[Boolean][16]** force TIFF output, otherwise attempt to use input format (optional, default `true`) - - `options.compression` **[Boolean][16]** compression options: lzw, deflate, jpeg (optional, default `'jpeg'`) + - `options.compression` **[Boolean][16]** compression options: lzw, deflate, jpeg, ccittfax4 (optional, default `'jpeg'`) - `options.predictor` **[Boolean][16]** compression predictor options: none, horizontal, float (optional, default `'horizontal'`) - `options.xres` **[Number][18]** horizontal resolution in pixels/mm (optional, default `1.0`) - `options.yres` **[Number][18]** vertical resolution in pixels/mm (optional, default `1.0`) diff --git a/lib/output.js b/lib/output.js index 528c2028..878a3ac3 100644 --- a/lib/output.js +++ b/lib/output.js @@ -326,10 +326,10 @@ function tiff (options) { } // compression if (is.defined(options) && is.defined(options.compression)) { - if (is.string(options.compression) && is.inArray(options.compression, ['lzw', 'deflate', 'jpeg', 'none'])) { + if (is.string(options.compression) && is.inArray(options.compression, ['lzw', 'deflate', 'jpeg', 'ccittfax4', 'none'])) { this.options.tiffCompression = options.compression; } else { - const message = `Invalid compression option "${options.compression}". Should be one of: lzw, deflate, jpeg, none`; + const message = `Invalid compression option "${options.compression}". Should be one of: lzw, deflate, jpeg, ccittfax4, none`; throw new Error(message); } } diff --git a/test/unit/io.js b/test/unit/io.js index 64d5d496..59209214 100644 --- a/test/unit/io.js +++ b/test/unit/io.js @@ -1083,6 +1083,22 @@ describe('Input/output', function () { }); }); + it('TIFF ccittfax4 compression shrinks b-w test file', function (done) { + const startSize = fs.statSync(fixtures.inputTiff).size; + sharp(fixtures.inputTiff) + .toColourspace('b-w') + .tiff({ + squash: true, + compression: 'ccittfax4' + }) + .toFile(fixtures.outputTiff, (err, info) => { + if (err) throw err; + assert.strictEqual('tiff', info.format); + assert(info.size < startSize); + fs.unlink(fixtures.outputTiff, done); + }); + }); + it('TIFF deflate compression with horizontal predictor shrinks test file', function (done) { const startSize = fs.statSync(fixtures.inputTiffUncompressed).size; sharp(fixtures.inputTiffUncompressed)