diff --git a/src/pipeline.cc b/src/pipeline.cc index 7bd7eb50..83fee51b 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -521,11 +521,21 @@ class PipelineWorker : public Nan::AsyncWorker { // Scale up 8-bit values to match 16-bit input image double const multiplier = sharp::Is16Bit(image.interpretation()) ? 256.0 : 1.0; // Create background colour - std::vector background { - baton->background[0] * multiplier, - baton->background[1] * multiplier, - baton->background[2] * multiplier - }; + std::vector background; + if (image.bands() > 2) { + background = { + multiplier * baton->background[0], + multiplier * baton->background[1], + multiplier * baton->background[2] + }; + } else { + // Convert sRGB to greyscale + background = { multiplier * ( + 0.2126 * baton->background[0] + + 0.7152 * baton->background[1] + + 0.0722 * baton->background[2] + )}; + } // Add alpha channel to background colour if (baton->background[3] < 255.0 || HasAlpha(image)) { background.push_back(baton->background[3] * multiplier); diff --git a/test/fixtures/expected/extend-2channel.png b/test/fixtures/expected/extend-2channel.png new file mode 100644 index 00000000..bcd4cad4 Binary files /dev/null and b/test/fixtures/expected/extend-2channel.png differ diff --git a/test/unit/extend.js b/test/unit/extend.js index 13686c49..c618295f 100644 --- a/test/unit/extend.js +++ b/test/unit/extend.js @@ -60,4 +60,19 @@ describe('Extend', function () { fixtures.assertSimilar(fixtures.expected('addAlphaChanelBeforeExtend.png'), data, done); }); }); + + it('PNG with 2 channels', function (done) { + sharp(fixtures.inputPngWithGreyAlpha) + .background('transparent') + .extend({top: 0, bottom: 20, left: 0, right: 20}) + .toBuffer(function (err, data, info) { + if (err) throw err; + assert.strictEqual(true, data.length > 0); + assert.strictEqual('png', info.format); + assert.strictEqual(420, info.width); + assert.strictEqual(320, info.height); + assert.strictEqual(4, info.channels); + fixtures.assertSimilar(fixtures.expected('extend-2channel.png'), data, done); + }); + }); });