diff --git a/docs/changelog.md b/docs/changelog.md index f8f27c723..fee867152 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,11 @@ Requires libvips v8.11.3 +### v0.29.3 - TBD + +* Ensure correct dimensions when containing image resized to 1px. + [#2951](https://github.com/lovell/sharp/issues/2951) + ### v0.29.2 - 21st October 2021 * Add `timeout` function to limit processing time. diff --git a/src/pipeline.cc b/src/pipeline.cc index 2ca99c00b..bbdf029e7 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -382,11 +382,15 @@ class PipelineWorker : public Napi::AsyncWorker { // Ensure shortest edge is at least 1 pixel if (image.width() / xfactor < 0.5) { xfactor = 2 * image.width(); - baton->width = 1; + if (baton->canvas != Canvas::EMBED) { + baton->width = 1; + } } if (image.height() / yfactor < 0.5) { yfactor = 2 * image.height(); - baton->height = 1; + if (baton->canvas != Canvas::EMBED) { + baton->height = 1; + } } image = image.resize(1.0 / xfactor, VImage::option() ->set("vscale", 1.0 / yfactor) diff --git a/test/unit/resize.js b/test/unit/resize.js index 01c92805e..364d8a505 100644 --- a/test/unit/resize.js +++ b/test/unit/resize.js @@ -605,6 +605,40 @@ describe('Resize dimensions', function () { }); }); + it('Ensure embedded shortest edge (height) is at least 1 pixel', function () { + return sharp({ + create: { + width: 200, + height: 1, + channels: 3, + background: 'red' + } + }) + .resize({ width: 50, height: 50, fit: sharp.fit.contain }) + .toBuffer({ resolveWithObject: true }) + .then(function (output) { + assert.strictEqual(50, output.info.width); + assert.strictEqual(50, output.info.height); + }); + }); + + it('Ensure embedded shortest edge (width) is at least 1 pixel', function () { + return sharp({ + create: { + width: 1, + height: 200, + channels: 3, + background: 'red' + } + }) + .resize({ width: 50, height: 50, fit: sharp.fit.contain }) + .toBuffer({ resolveWithObject: true }) + .then(function (output) { + assert.strictEqual(50, output.info.width); + assert.strictEqual(50, output.info.height); + }); + }); + it('Skip shrink-on-load where one dimension <4px', async () => { const jpeg = await sharp({ create: {