Ensure withMetadata skips default profile for RGB16 #3773

This commit is contained in:
Lovell Fuller 2023-08-24 18:13:00 +01:00
parent 44a0ee3fd3
commit 95635683ac
6 changed files with 29 additions and 11 deletions

View File

@ -109,8 +109,8 @@ await sharp(pixelArray, { raw: { width, height, channels } })
## withMetadata
Include all metadata (EXIF, XMP, IPTC) from the input image in the output image.
This will also convert to and add a web-friendly sRGB ICC profile unless a custom
output profile is provided.
This will also convert to and add a web-friendly sRGB ICC profile if appropriate,
unless a custom output profile is provided.
The default behaviour, when `withMetadata` is not used, is to convert to the device-independent
sRGB colour space and strip all metadata, including the removal of any ICC profile.

View File

@ -4,6 +4,11 @@
Requires libvips v8.14.4
### v0.32.6 - TBD
* Ensure `withMetadata` does not add default sRGB profile to RGB16 (regression in 0.32.5).
[#3773](https://github.com/lovell/sharp/issues/3773)
### v0.32.5 - 15th August 2023
* Upgrade to libvips v8.14.4 for upstream bug fixes.

File diff suppressed because one or more lines are too long

View File

@ -162,8 +162,8 @@ function toBuffer (options, callback) {
/**
* Include all metadata (EXIF, XMP, IPTC) from the input image in the output image.
* This will also convert to and add a web-friendly sRGB ICC profile unless a custom
* output profile is provided.
* This will also convert to and add a web-friendly sRGB ICC profile if appropriate,
* unless a custom output profile is provided.
*
* The default behaviour, when `withMetadata` is not used, is to convert to the device-independent
* sRGB colour space and strip all metadata, including the removal of any ICC profile.

View File

@ -789,6 +789,7 @@ class PipelineWorker : public Napi::AsyncWorker {
// Apply output ICC profile
if (baton->withMetadata) {
if (image.interpretation() == VIPS_INTERPRETATION_sRGB || !baton->withMetadataIcc.empty()) {
image = image.icc_transform(
baton->withMetadataIcc.empty() ? "srgb" : const_cast<char*>(baton->withMetadataIcc.data()),
VImage::option()
@ -796,6 +797,7 @@ class PipelineWorker : public Napi::AsyncWorker {
->set("embedded", TRUE)
->set("intent", VIPS_INTENT_PERCEPTUAL));
}
}
// Override EXIF Orientation tag
if (baton->withMetadata && baton->withMetadataOrientation != -1) {
image = sharp::SetExifOrientation(image, baton->withMetadataOrientation);

View File

@ -794,6 +794,17 @@ describe('Image metadata', function () {
assert.strictEqual(intent, 'Perceptual');
});
it('withMetadata does not add default sRGB profile to RGB16', async () => {
const data = await sharp(fixtures.inputJpg)
.resize(32, 24)
.toColorspace('rgb16')
.withMetadata()
.toBuffer();
const metadata = await sharp(data).metadata();
assert.strictEqual(undefined, metadata.icc);
});
it('File input with corrupt header fails gracefully', function (done) {
sharp(fixtures.inputJpgWithCorruptHeader)
.metadata(function (err) {