Ensure 16-bit PNG output uses correct bitdepth #2958

This commit is contained in:
Max Gordon 2021-10-31 22:22:35 +01:00 committed by Lovell Fuller
parent 2a0077c481
commit 2deced0fb9
2 changed files with 14 additions and 2 deletions

View File

@ -824,7 +824,7 @@ class PipelineWorker : public Napi::AsyncWorker {
->set("filter", baton->pngAdaptiveFiltering ? VIPS_FOREIGN_PNG_FILTER_ALL : VIPS_FOREIGN_PNG_FILTER_NONE)
->set("palette", baton->pngPalette)
->set("Q", baton->pngQuality)
->set("bitdepth", baton->pngBitdepth)
->set("bitdepth", sharp::Is16Bit(image.interpretation()) ? 16 : baton->pngBitdepth)
->set("dither", baton->pngDither)));
baton->bufferOut = static_cast<char*>(area->data);
baton->bufferOutLength = area->length;
@ -993,7 +993,7 @@ class PipelineWorker : public Napi::AsyncWorker {
->set("filter", baton->pngAdaptiveFiltering ? VIPS_FOREIGN_PNG_FILTER_ALL : VIPS_FOREIGN_PNG_FILTER_NONE)
->set("palette", baton->pngPalette)
->set("Q", baton->pngQuality)
->set("bitdepth", baton->pngBitdepth)
->set("bitdepth", sharp::Is16Bit(image.interpretation()) ? 16 : baton->pngBitdepth)
->set("dither", baton->pngDither));
baton->formatOut = "png";
} else if (baton->formatOut == "webp" || (mightMatchInput && isWebp) ||

View File

@ -112,6 +112,18 @@ describe('PNG', function () {
});
});
it('16-bit grey+alpha PNG roundtrip', async () => {
const after = await sharp(fixtures.inputPng16BitGreyAlpha)
.toColourspace('grey16')
.toBuffer();
const [statsBefore, statsAfter] = await Promise.all([
sharp(fixtures.inputPng16BitGreyAlpha).stats(),
sharp(after).stats()
]);
assert.deepStrictEqual(statsAfter.channels[1], statsBefore.channels[1]);
});
it('Valid PNG libimagequant palette value does not throw error', function () {
assert.doesNotThrow(function () {
sharp().png({ palette: false });