Skip to content

Commit

Permalink
Ensure greyscale images can be trimmed #3386
Browse files Browse the repository at this point in the history
  • Loading branch information
lovell committed Sep 26, 2022
1 parent 70e6bb0 commit d1004ee
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 7 deletions.
3 changes: 3 additions & 0 deletions docs/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ Requires libvips v8.13.1
* Ensure AVIF output is always 8-bit.
[#3358](https://github.com/lovell/sharp/issues/3358)

* Ensure greyscale images can be trimmed (regression in 0.31.0).
[#3386](https://github.com/lovell/sharp/issues/3386)

### v0.31.0 - 5th September 2022

* Drop support for Node.js 12, now requires Node.js >= 14.15.0.
Expand Down
17 changes: 10 additions & 7 deletions src/operations.cc
Original file line number Diff line number Diff line change
Expand Up @@ -289,17 +289,20 @@ namespace sharp {
background = image.extract_area(0, 0, 1, 1)(0, 0);
multiplier = 1.0;
}
if (background.size() == 4) {
if (HasAlpha(image) && background.size() == 4) {
// Just discard the alpha because flattening the background colour with
// itself (effectively what find_trim() does) gives the same result
backgroundAlpha[0] = background[3] * multiplier;
}
background = {
background[0] * multiplier,
background[1] * multiplier,
background[2] * multiplier
};

if (image.bands() > 2) {
background = {
background[0] * multiplier,
background[1] * multiplier,
background[2] * multiplier
};
} else {
background[0] = background[0] * multiplier;
}
int left, top, width, height;
left = image.find_trim(&top, &width, &height, VImage::option()
->set("background", background)
Expand Down
26 changes: 26 additions & 0 deletions test/unit/trim.js
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,32 @@ describe('Trim borders', function () {
assert.strictEqual(trimOffsetLeft, -13);
});

it('Ensure greyscale image can be trimmed', async () => {
const greyscale = await sharp({
create: {
width: 16,
height: 8,
channels: 3,
background: 'silver'
}
})
.extend({ left: 12, right: 24, background: 'gray' })
.toColourspace('b-w')
.png({ compressionLevel: 0 })
.toBuffer();

const { info } = await sharp(greyscale)
.trim()
.raw()
.toBuffer({ resolveWithObject: true });

const { width, height, trimOffsetTop, trimOffsetLeft } = info;
assert.strictEqual(width, 16);
assert.strictEqual(height, 8);
assert.strictEqual(trimOffsetTop, 0);
assert.strictEqual(trimOffsetLeft, -12);
});

it('Ensure trim of image with all pixels same is no-op', async () => {
const { info } = await sharp({
create: {
Expand Down

0 comments on commit d1004ee

Please sign in to comment.