mirror of
https://github.com/lovell/sharp.git
synced 2025-07-09 18:40:16 +02:00
Add support for TIFF float predictor
This commit is contained in:
parent
27fb864ac4
commit
088d36b47b
@ -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)
|
||||||
|
@ -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();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user