From 4c172d25f6af96b67496a2ad2292e40e3dbb3008 Mon Sep 17 00:00:00 2001 From: Lovell Fuller Date: Mon, 4 Jul 2016 21:33:44 +0100 Subject: [PATCH] Allow images with alpha channel to use LAB sharpen #490 --- docs/changelog.md | 4 ++++ src/operations.cc | 6 +++++- test/fixtures/expected/sharpen-rgba.png | Bin 0 -> 7268 bytes test/unit/sharpen.js | 20 ++++++++++++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/expected/sharpen-rgba.png diff --git a/docs/changelog.md b/docs/changelog.md index e5da75dd..c805fecf 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -38,6 +38,10 @@ Requires libvips v8.3.1 [#486](https://github.com/lovell/sharp/issues/486) [@kapouer](https://github.com/kapouer) +* Allow images with an alpha channel to work with LAB-colourspace based sharpen. + [#490](https://github.com/lovell/sharp/issues/490) + [@jwagner](https://github.com/jwagner) + #### v0.15.0 - 21st May 2016 * Use libvips' new Lanczos 3 kernel as default for image reduction. diff --git a/src/operations.cc b/src/operations.cc index cdbc12cf..6adfe165 100644 --- a/src/operations.cc +++ b/src/operations.cc @@ -244,9 +244,13 @@ namespace sharp { return image.conv(sharpen); } else { // Slow, accurate sharpen in LAB colour space, with control over flat vs jagged areas + VipsInterpretation colourspaceBeforeSharpen = image.interpretation(); + if (colourspaceBeforeSharpen == VIPS_INTERPRETATION_RGB) { + colourspaceBeforeSharpen = VIPS_INTERPRETATION_sRGB; + } return image.sharpen( VImage::option()->set("sigma", sigma)->set("m1", flat)->set("m2", jagged) - ); + ).colourspace(colourspaceBeforeSharpen); } } diff --git a/test/fixtures/expected/sharpen-rgba.png b/test/fixtures/expected/sharpen-rgba.png new file mode 100644 index 0000000000000000000000000000000000000000..841511cac3090cb1e035d1134e3e4e9f92f53ea3 GIT binary patch literal 7268 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 0); assert.strictEqual('jpeg', info.format); assert.strictEqual(320, info.width); @@ -86,6 +105,7 @@ describe('Sharpen', function() { .resize(320, 240) .sharpen(true) .toBuffer(function(err, sharpened, info) { + if (err) throw err; assert.strictEqual(true, sharpened.length > 0); assert.strictEqual(true, sharpened.length > notSharpened.length); assert.strictEqual('jpeg', info.format);