Ensure auto-rotation works with shrink-on-load #3352

Fixes regression in 0.31.0
This commit is contained in:
Lovell Fuller 2022-09-07 14:17:40 +01:00
parent f5da147a58
commit fbd4970b57
6 changed files with 24 additions and 5 deletions

View File

@ -10,6 +10,9 @@ Requires libvips v8.13.1
[#3349](https://github.com/lovell/sharp/pull/3349) [#3349](https://github.com/lovell/sharp/pull/3349)
[@marcosc90](https://github.com/marcosc90) [@marcosc90](https://github.com/marcosc90)
* Ensure auto-rotation works with shrink-on-load and extract (regression in 0.31.0).
[#3352](https://github.com/lovell/sharp/issues/3352)
### v0.31.0 - 5th September 2022 ### v0.31.0 - 5th September 2022
* Drop support for Node.js 12, now requires Node.js >= 14.15.0. * Drop support for Node.js 12, now requires Node.js >= 14.15.0.

View File

@ -428,7 +428,7 @@ function extend (extend) {
* @throws {Error} Invalid parameters * @throws {Error} Invalid parameters
*/ */
function extract (options) { function extract (options) {
const suffix = isResizeExpected(this.options) || isRotationExpected(this.options) ? 'Post' : 'Pre'; const suffix = isResizeExpected(this.options) || this.options.widthPre !== -1 ? 'Post' : 'Pre';
if (this.options[`width${suffix}`] !== -1) { if (this.options[`width${suffix}`] !== -1) {
this.options.debuglog('ignoring previous extract options'); this.options.debuglog('ignoring previous extract options');
} }

View File

@ -557,6 +557,7 @@ namespace sharp {
VImage RemoveExifOrientation(VImage image) { VImage RemoveExifOrientation(VImage image) {
VImage copy = image.copy(); VImage copy = image.copy();
copy.remove(VIPS_META_ORIENTATION); copy.remove(VIPS_META_ORIENTATION);
copy.remove("exif-ifd0-Orientation");
return copy; return copy;
} }

View File

@ -92,7 +92,10 @@ class PipelineWorker : public Napi::AsyncWorker {
} }
// Rotate pre-extract // Rotate pre-extract
if (baton->rotateBeforePreExtract) { bool const shouldRotateBefore = baton->rotateBeforePreExtract &&
(rotation != VIPS_ANGLE_D0 || flip || flop || baton->rotationAngle != 0.0);
if (shouldRotateBefore) {
if (rotation != VIPS_ANGLE_D0) { if (rotation != VIPS_ANGLE_D0) {
image = image.rot(rotation); image = image.rot(rotation);
} }
@ -167,7 +170,7 @@ class PipelineWorker : public Napi::AsyncWorker {
// - input colourspace is not specified; // - input colourspace is not specified;
bool const shouldPreShrink = (targetResizeWidth > 0 || targetResizeHeight > 0) && bool const shouldPreShrink = (targetResizeWidth > 0 || targetResizeHeight > 0) &&
baton->gamma == 0 && baton->topOffsetPre == -1 && baton->trimThreshold == 0.0 && baton->gamma == 0 && baton->topOffsetPre == -1 && baton->trimThreshold == 0.0 &&
baton->colourspaceInput == VIPS_INTERPRETATION_LAST; baton->colourspaceInput == VIPS_INTERPRETATION_LAST && !shouldRotateBefore;
if (shouldPreShrink) { if (shouldPreShrink) {
// The common part of the shrink: the bit by which both axes must be shrunk // The common part of the shrink: the bit by which both axes must be shrunk

View File

@ -300,7 +300,7 @@ describe('Partial image extraction', function () {
const s = sharp(); const s = sharp();
s.on('warning', function (msg) { warningMessage = msg; }); s.on('warning', function (msg) { warningMessage = msg; });
const options = { top: 0, left: 0, width: 1, height: 1 }; const options = { top: 0, left: 0, width: 1, height: 1 };
s.extract(options); s.extract(options).extract(options);
assert.strictEqual(warningMessage, ''); assert.strictEqual(warningMessage, '');
s.extract(options); s.extract(options);
assert.strictEqual(warningMessage, 'ignoring previous extract options'); assert.strictEqual(warningMessage, 'ignoring previous extract options');
@ -311,7 +311,7 @@ describe('Partial image extraction', function () {
const s = sharp().rotate(); const s = sharp().rotate();
s.on('warning', function (msg) { warningMessage = msg; }); s.on('warning', function (msg) { warningMessage = msg; });
const options = { top: 0, left: 0, width: 1, height: 1 }; const options = { top: 0, left: 0, width: 1, height: 1 };
s.extract(options); s.extract(options).extract(options);
assert.strictEqual(warningMessage, ''); assert.strictEqual(warningMessage, '');
s.extract(options); s.extract(options);
assert.strictEqual(warningMessage, 'ignoring previous extract options'); assert.strictEqual(warningMessage, 'ignoring previous extract options');

View File

@ -406,4 +406,16 @@ describe('Rotation', function () {
fixtures.assertSimilar(fixtures.expected('rotate-and-flop.jpg'), data, done); fixtures.assertSimilar(fixtures.expected('rotate-and-flop.jpg'), data, done);
}); });
}); });
it('Auto-rotate and shrink-on-load', async () => {
const [r, g, b] = await sharp(fixtures.inputJpgWithLandscapeExif3)
.rotate()
.resize(8)
.raw()
.toBuffer();
assert.strictEqual(r, 60);
assert.strictEqual(g, 73);
assert.strictEqual(b, 52);
});
}); });