From 088d36b47b7bc5a76735d5f6ac0afaaffb761d4f Mon Sep 17 00:00:00 2001 From: Lovell Fuller Date: Sat, 1 Apr 2017 10:08:47 +0100 Subject: [PATCH] Add support for TIFF float predictor --- src/pipeline.cc | 4 ++ test/unit/io.js | 104 +++++++++++++++++++++++++----------------------- 2 files changed, 58 insertions(+), 50 deletions(-) diff --git a/src/pipeline.cc b/src/pipeline.cc index c20e8883..4856782f 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -838,6 +838,10 @@ class PipelineWorker : public Nan::AsyncWorker { ->set("alpha_q", baton->webpAlphaQuality)); baton->formatOut = "webp"; } else if (baton->formatOut == "tiff" || isTiff || (matchInput && inputImageType == ImageType::TIFF)) { + // Cast pixel values to float, if required + if (baton->tiffPredictor == VIPS_FOREIGN_TIFF_PREDICTOR_FLOAT) { + image = image.cast(VIPS_FORMAT_FLOAT); + } // Write TIFF to file image.tiffsave(const_cast(baton->fileOut.data()), VImage::option() ->set("strip", !baton->withMetadata) diff --git a/test/unit/io.js b/test/unit/io.js index fe211f19..668fc720 100644 --- a/test/unit/io.js +++ b/test/unit/io.js @@ -864,71 +864,75 @@ describe('Input/output', function () { it('TIFF lzw compression with horizontal predictor shrinks test file', function (done) { const startSize = fs.statSync(fixtures.inputTiffUncompressed).size; sharp(fixtures.inputTiffUncompressed) - .tiff({ - compression: 'lzw', - force: true, - // note: lzw compression is imperfect and sometimes - // generates larger files, as it does with this input - // if no predictor is used. - predictor: 'horizontal' - }) - .toFile(fixtures.outputTiff, (err, info) => { - if (err) throw err; - assert.strictEqual('tiff', info.format); - assert(info.size < startSize); - fs.unlinkSync(fixtures.outputTiff); - done(); - }); + .tiff({ + compression: 'lzw', + predictor: 'horizontal' + }) + .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 hoizontal predictor shrinks test file', function (done) { const startSize = fs.statSync(fixtures.inputTiffUncompressed).size; sharp(fixtures.inputTiffUncompressed) - .tiff({ - compression: 'deflate', - force: true, - predictor: 'horizontal' - }) - .toFile(fixtures.outputTiff, (err, info) => { - if (err) throw err; - assert.strictEqual('tiff', info.format); - assert(info.size < startSize); - fs.unlinkSync(fixtures.outputTiff); - done(); - }); + .tiff({ + compression: 'deflate', + predictor: 'horizontal' + }) + .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 float predictor shrinks test file', function (done) { + const startSize = fs.statSync(fixtures.inputTiffUncompressed).size; + sharp(fixtures.inputTiffUncompressed) + .tiff({ + compression: 'deflate', + predictor: 'float' + }) + .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 without predictor shrinks test file', function (done) { const startSize = fs.statSync(fixtures.inputTiffUncompressed).size; sharp(fixtures.inputTiffUncompressed) - .tiff({ - compression: 'deflate', - force: true, - predictor: 'none' - }) - .toFile(fixtures.outputTiff, (err, info) => { - if (err) throw err; - assert.strictEqual('tiff', info.format); - assert(info.size < startSize); - fs.unlinkSync(fixtures.outputTiff); - done(); - }); + .tiff({ + compression: 'deflate', + predictor: 'none' + }) + .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 jpeg compression shrinks test file', function (done) { const startSize = fs.statSync(fixtures.inputTiffUncompressed).size; sharp(fixtures.inputTiffUncompressed) - .tiff({ - compression: 'jpeg', - force: true - }) - .toFile(fixtures.outputTiff, (err, info) => { - if (err) throw err; - assert.strictEqual('tiff', info.format); - assert(info.size < startSize); - fs.unlinkSync(fixtures.outputTiff); - done(); - }); + .tiff({ + compression: 'jpeg' + }) + .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 none compression does not throw error', function () {