From 01ffa803387179351fc09536e518045f033ce1e0 Mon Sep 17 00:00:00 2001 From: Lovell Fuller Date: Tue, 15 Nov 2022 15:00:32 +0000 Subject: [PATCH] Improve extractChannel support for 16-bit output #3453 --- docs/changelog.md | 3 ++ lib/channel.js | 2 +- src/pipeline.cc | 38 +++++++++++++------------ test/fixtures/expected/extract-lch.jpg | Bin 13434 -> 0 bytes test/unit/extractChannel.js | 34 +++++++++------------- 5 files changed, 38 insertions(+), 39 deletions(-) delete mode 100644 test/fixtures/expected/extract-lch.jpg diff --git a/docs/changelog.md b/docs/changelog.md index 60502d645..986b84b49 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -12,6 +12,9 @@ Requires libvips v8.13.3 * Prevent possible race condition awaiting metadata of Stream-based input. [#3451](https://github.com/lovell/sharp/issues/3451) +* Improve `extractChannel` support for 16-bit output colourspaces. + [#3453](https://github.com/lovell/sharp/issues/3453) + ### v0.31.2 - 4th November 2022 * Upgrade to libvips v8.13.3 for upstream bug fixes. diff --git a/lib/channel.js b/lib/channel.js index 7c1cc8014..3771de05e 100644 --- a/lib/channel.js +++ b/lib/channel.js @@ -98,7 +98,7 @@ function extractChannel (channel) { } else { throw is.invalidParameterError('channel', 'integer or one of: red, green, blue, alpha', channel); } - return this.toColourspace('b-w'); + return this; } /** diff --git a/src/pipeline.cc b/src/pipeline.cc index 6b97ef09f..854be0d14 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -701,24 +701,6 @@ class PipelineWorker : public Napi::AsyncWorker { image = sharp::Tint(image, baton->tintA, baton->tintB); } - // Extract an image channel (aka vips band) - if (baton->extractChannel > -1) { - if (baton->extractChannel >= image.bands()) { - if (baton->extractChannel == 3 && sharp::HasAlpha(image)) { - baton->extractChannel = image.bands() - 1; - } else { - (baton->err).append("Cannot extract channel from image. Too few channels in image."); - return Error(); - } - } - VipsInterpretation const interpretation = sharp::Is16Bit(image.interpretation()) - ? VIPS_INTERPRETATION_GREY16 - : VIPS_INTERPRETATION_B_W; - image = image - .extract_band(baton->extractChannel) - .copy(VImage::option()->set("interpretation", interpretation)); - } - // Remove alpha channel, if any if (baton->removeAlpha) { image = sharp::RemoveAlpha(image); @@ -744,6 +726,26 @@ class PipelineWorker : public Napi::AsyncWorker { } } + // Extract channel + if (baton->extractChannel > -1) { + if (baton->extractChannel >= image.bands()) { + if (baton->extractChannel == 3 && sharp::HasAlpha(image)) { + baton->extractChannel = image.bands() - 1; + } else { + (baton->err) + .append("Cannot extract channel ").append(std::to_string(baton->extractChannel)) + .append(" from image with channels 0-").append(std::to_string(image.bands() - 1)); + return Error(); + } + } + VipsInterpretation colourspace = sharp::Is16Bit(image.interpretation()) + ? VIPS_INTERPRETATION_GREY16 + : VIPS_INTERPRETATION_B_W; + image = image + .extract_band(baton->extractChannel) + .copy(VImage::option()->set("interpretation", colourspace)); + } + // Apply output ICC profile if (!baton->withMetadataIcc.empty()) { image = image.icc_transform( diff --git a/test/fixtures/expected/extract-lch.jpg b/test/fixtures/expected/extract-lch.jpg deleted file mode 100644 index f51140357ea24bb12caf3f0c634e0e6d7a01a04b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13434 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 diff --git a/test/unit/extractChannel.js b/test/unit/extractChannel.js index 5271a147b..ee2492572 100644 --- a/test/unit/extractChannel.js +++ b/test/unit/extractChannel.js @@ -54,19 +54,13 @@ describe('Image channel extraction', function () { }); }); - it('With colorspace conversion', function (done) { - const output = fixtures.path('output.extract-lch.jpg'); - sharp(fixtures.inputJpg) - .extractChannel(1) + it('With colorspace conversion', async () => { + const [chroma] = await sharp({ create: { width: 1, height: 1, channels: 3, background: 'red' } }) .toColourspace('lch') - .resize(320, 240, { fastShrinkOnLoad: false }) - .toFile(output, function (err, info) { - if (err) throw err; - assert.strictEqual(320, info.width); - assert.strictEqual(240, info.height); - fixtures.assertMaxColourDistance(output, fixtures.expected('extract-lch.jpg'), 9); - done(); - }); + .extractChannel(1) + .toBuffer(); + + assert.strictEqual(chroma, 104); }); it('Alpha from 16-bit PNG', function (done) { @@ -108,12 +102,12 @@ describe('Image channel extraction', function () { }); }); - it('Non-existent channel', function (done) { - sharp(fixtures.inputPng) - .extractChannel(1) - .toBuffer(function (err) { - assert(err instanceof Error); - done(); - }); - }); + it('Non-existent channel', async () => + await assert.rejects( + () => sharp({ create: { width: 1, height: 1, channels: 3, background: 'red' } }) + .extractChannel(3) + .toBuffer(), + /Cannot extract channel 3 from image with channels 0-2/ + ) + ); });