diff --git a/docs/changelog.md b/docs/changelog.md index 15629e02..25fb1df1 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -13,6 +13,8 @@ Requires libvips v8.8.1. [#1834](https://github.com/lovell/sharp/pull/1834) [@jaubourg](https://github.com/jaubourg) +* Ensure image is at least 3x3 pixels before attempting trim operation. + #### v0.23.0 - 29th July 2019 * Remove `overlayWith` previously deprecated in v0.22.0. diff --git a/src/operations.cc b/src/operations.cc index ecb8872d..ea2732ba 100644 --- a/src/operations.cc +++ b/src/operations.cc @@ -250,6 +250,9 @@ namespace sharp { Trim an image */ VImage Trim(VImage image, double const threshold) { + if (image.width() < 3 && image.height() < 3) { + throw VError("Image to trim must be at least 3x3 pixels"); + } // Top-left pixel provides the background colour VImage background = image.extract_area(0, 0, 1, 1); if (HasAlpha(background)) { diff --git a/test/unit/trim.js b/test/unit/trim.js index 8206f0b4..ef6c6f27 100644 --- a/test/unit/trim.js +++ b/test/unit/trim.js @@ -58,6 +58,27 @@ describe('Trim borders', function () { }); }); + it('Attempt to trim 2x2 pixel image fails', function (done) { + sharp({ + create: { + width: 2, + height: 2, + channels: 3, + background: 'red' + } + }) + .trim() + .toBuffer() + .then(() => { + done(new Error('Expected an error')); + }) + .catch(err => { + assert.strictEqual('Image to trim must be at least 3x3 pixels', err.message); + done(); + }) + .catch(done); + }); + describe('Invalid thresholds', function () { [-1, 'fail', {}].forEach(function (threshold) { it(JSON.stringify(threshold), function () {