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

@ -864,71 +864,75 @@ describe('Input/output', function () {
it('TIFF lzw compression with horizontal predictor shrinks test file', function (done) { it('TIFF lzw compression with horizontal predictor shrinks test file', function (done) {
const startSize = fs.statSync(fixtures.inputTiffUncompressed).size; const startSize = fs.statSync(fixtures.inputTiffUncompressed).size;
sharp(fixtures.inputTiffUncompressed) sharp(fixtures.inputTiffUncompressed)
.tiff({ .tiff({
compression: 'lzw', compression: 'lzw',
force: true, predictor: 'horizontal'
// note: lzw compression is imperfect and sometimes })
// generates larger files, as it does with this input .toFile(fixtures.outputTiff, (err, info) => {
// if no predictor is used. if (err) throw err;
predictor: 'horizontal' assert.strictEqual('tiff', info.format);
}) assert(info.size < startSize);
.toFile(fixtures.outputTiff, (err, info) => { fs.unlink(fixtures.outputTiff, done);
if (err) throw err; });
assert.strictEqual('tiff', info.format);
assert(info.size < startSize);
fs.unlinkSync(fixtures.outputTiff);
done();
});
}); });
it('TIFF deflate compression with hoizontal predictor shrinks test file', function (done) { it('TIFF deflate compression with hoizontal predictor shrinks test file', function (done) {
const startSize = fs.statSync(fixtures.inputTiffUncompressed).size; const startSize = fs.statSync(fixtures.inputTiffUncompressed).size;
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.unlink(fixtures.outputTiff, done);
fs.unlinkSync(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) { it('TIFF deflate compression without predictor shrinks test file', function (done) {
const startSize = fs.statSync(fixtures.inputTiffUncompressed).size; const startSize = fs.statSync(fixtures.inputTiffUncompressed).size;
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.unlink(fixtures.outputTiff, done);
fs.unlinkSync(fixtures.outputTiff); });
done();
});
}); });
it('TIFF jpeg compression shrinks test file', function (done) { it('TIFF jpeg compression shrinks test file', function (done) {
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.unlink(fixtures.outputTiff, done);
fs.unlinkSync(fixtures.outputTiff); });
done();
});
}); });
it('TIFF none compression does not throw error', function () { it('TIFF none compression does not throw error', function () {