mirror of
https://github.com/lovell/sharp.git
synced 2025-07-09 10:30:15 +02:00
Ensure auto-rotation works with shrink-on-load #3352
Fixes regression in 0.31.0
This commit is contained in:
parent
f5da147a58
commit
fbd4970b57
@ -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.
|
||||||
|
@ -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');
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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');
|
||||||
|
@ -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);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user