Add support for TIFF float predictor

This commit is contained in:
Lovell Fuller 2017-04-01 10:08:47 +01:00
parent 27fb864ac4
commit 088d36b47b
2 changed files with 58 additions and 50 deletions

View File

@ -838,6 +838,10 @@ class PipelineWorker : public Nan::AsyncWorker {
->set("alpha_q", baton->webpAlphaQuality)); ->set("alpha_q", baton->webpAlphaQuality));
baton->formatOut = "webp"; baton->formatOut = "webp";
} else if (baton->formatOut == "tiff" || isTiff || (matchInput && inputImageType == ImageType::TIFF)) { } 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 // Write TIFF to file
image.tiffsave(const_cast<char*>(baton->fileOut.data()), VImage::option() image.tiffsave(const_cast<char*>(baton->fileOut.data()), VImage::option()
->set("strip", !baton->withMetadata) ->set("strip", !baton->withMetadata)

View File

@ -866,18 +866,13 @@ describe('Input/output', function () {
sharp(fixtures.inputTiffUncompressed) sharp(fixtures.inputTiffUncompressed)
.tiff({ .tiff({
compression: 'lzw', 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' predictor: 'horizontal'
}) })
.toFile(fixtures.outputTiff, (err, info) => { .toFile(fixtures.outputTiff, (err, info) => {
if (err) throw err; if (err) throw err;
assert.strictEqual('tiff', info.format); assert.strictEqual('tiff', info.format);
assert(info.size < startSize); assert(info.size < startSize);
fs.unlinkSync(fixtures.outputTiff); fs.unlink(fixtures.outputTiff, done);
done();
}); });
}); });
@ -886,15 +881,28 @@ describe('Input/output', function () {
sharp(fixtures.inputTiffUncompressed) sharp(fixtures.inputTiffUncompressed)
.tiff({ .tiff({
compression: 'deflate', compression: 'deflate',
force: true,
predictor: 'horizontal' predictor: 'horizontal'
}) })
.toFile(fixtures.outputTiff, (err, info) => { .toFile(fixtures.outputTiff, (err, info) => {
if (err) throw err; if (err) throw err;
assert.strictEqual('tiff', info.format); assert.strictEqual('tiff', info.format);
assert(info.size < startSize); assert(info.size < startSize);
fs.unlinkSync(fixtures.outputTiff); fs.unlink(fixtures.outputTiff, done);
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);
}); });
}); });
@ -903,15 +911,13 @@ describe('Input/output', function () {
sharp(fixtures.inputTiffUncompressed) sharp(fixtures.inputTiffUncompressed)
.tiff({ .tiff({
compression: 'deflate', compression: 'deflate',
force: true,
predictor: 'none' predictor: 'none'
}) })
.toFile(fixtures.outputTiff, (err, info) => { .toFile(fixtures.outputTiff, (err, info) => {
if (err) throw err; if (err) throw err;
assert.strictEqual('tiff', info.format); assert.strictEqual('tiff', info.format);
assert(info.size < startSize); assert(info.size < startSize);
fs.unlinkSync(fixtures.outputTiff); fs.unlink(fixtures.outputTiff, done);
done();
}); });
}); });
@ -919,15 +925,13 @@ describe('Input/output', function () {
const startSize = fs.statSync(fixtures.inputTiffUncompressed).size; const startSize = fs.statSync(fixtures.inputTiffUncompressed).size;
sharp(fixtures.inputTiffUncompressed) sharp(fixtures.inputTiffUncompressed)
.tiff({ .tiff({
compression: 'jpeg', compression: 'jpeg'
force: true
}) })
.toFile(fixtures.outputTiff, (err, info) => { .toFile(fixtures.outputTiff, (err, info) => {
if (err) throw err; if (err) throw err;
assert.strictEqual('tiff', info.format); assert.strictEqual('tiff', info.format);
assert(info.size < startSize); assert(info.size < startSize);
fs.unlinkSync(fixtures.outputTiff); fs.unlink(fixtures.outputTiff, done);
done();
}); });
}); });