Skip to content

Commit

Permalink
Fix rotate-then-extract for EXIF orientation 2 (#3218)
Browse files Browse the repository at this point in the history
  • Loading branch information
jakob0fischl authored May 15, 2022
1 parent 51b4a7c commit 54d9dc4
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 15 deletions.
18 changes: 10 additions & 8 deletions src/pipeline.cc
Original file line number Diff line number Diff line change
Expand Up @@ -95,16 +95,18 @@ class PipelineWorker : public Napi::AsyncWorker {
if (baton->rotateBeforePreExtract) {
if (rotation != VIPS_ANGLE_D0) {
image = image.rot(rotation);
if (flip) {
image = image.flip(VIPS_DIRECTION_VERTICAL);
flip = FALSE;
}
if (flop) {
image = image.flip(VIPS_DIRECTION_HORIZONTAL);
flop = FALSE;
}
}
if (flip) {
image = image.flip(VIPS_DIRECTION_VERTICAL);
}
if (flop) {
image = image.flip(VIPS_DIRECTION_HORIZONTAL);
}
if (rotation != VIPS_ANGLE_D0 || flip || flop) {
image = sharp::RemoveExifOrientation(image);
}
flop = FALSE;
flip = FALSE;
if (baton->rotationAngle != 0.0) {
MultiPageUnsupported(nPages, "Rotate");
std::vector<double> background;
Expand Down
51 changes: 44 additions & 7 deletions test/unit/extract.js
Original file line number Diff line number Diff line change
Expand Up @@ -168,14 +168,51 @@ describe('Partial image extraction', function () {
});
});

it('Rotate with EXIF mirroring then extract', function (done) {
sharp(fixtures.inputJpgWithLandscapeExif7)
.rotate()
.extract({ left: 0, top: 208, width: 60, height: 40 })
.toBuffer(function (err, data) {
if (err) throw err;
fixtures.assertSimilar(fixtures.expected('rotate-mirror-extract.jpg'), data, done);
describe('Apply exif orientation and mirroring then extract', () => {
[
{
name: 'EXIF-1',
image: fixtures.inputJpgWithLandscapeExif1
},
{
name: 'EXIF-2',
image: fixtures.inputJpgWithLandscapeExif2
},
{
name: 'EXIF-3',
image: fixtures.inputJpgWithLandscapeExif3
},
{
name: 'EXIF-4',
image: fixtures.inputJpgWithLandscapeExif4
},
{
name: 'EXIF-5',
image: fixtures.inputJpgWithLandscapeExif5
},
{
name: 'EXIF-6',
image: fixtures.inputJpgWithLandscapeExif6
},
{
name: 'EXIF-7',
image: fixtures.inputJpgWithLandscapeExif7
},
{
name: 'EXIF-8',
image: fixtures.inputJpgWithLandscapeExif8
}
].forEach(({ name, image }) => {
it(name, function (done) {
sharp(image)
.rotate()
.extract({ left: 0, top: 208, width: 60, height: 40 })
.toBuffer(function (err, data) {
if (err) throw err;
fixtures.assertSimilar(fixtures.expected('rotate-mirror-extract.jpg'), data, done);
});
});
});
});

describe('Invalid parameters', function () {
Expand Down

0 comments on commit 54d9dc4

Please sign in to comment.