Skip to content

Commit cf83f44

Browse files
committed
reset exifOrientation
Signed-off-by: Juan Pablo Garcia Ripa <[email protected]>
1 parent 245f1cf commit cf83f44

20 files changed

+113
-35
lines changed

packages/core/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"file-type": "^16.5.4",
3737
"isomorphic-fetch": "^3.0.0",
3838
"mkdirp": "^2.1.3",
39+
"modify-exif": "^0.0.1",
3940
"pixelmatch": "^4.0.2",
4041
"tinycolor2": "^1.6.0"
4142
},

packages/core/src/utils/image-bitmap.js

+16-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
import FileType from "file-type";
22

3-
import EXIFParser from "exif-parser";
43
import { throwError } from "@jimp/utils";
4+
import EXIFParser from "exif-parser";
5+
// modify-exif
56

67
import * as constants from "../constants";
78
import * as MIME from "./mime";
89
import promisify from "./promisify";
910

11+
const EXIF_TAGS = {
12+
ORIENTATION: 0x0112, // decimal: 274
13+
};
14+
1015
async function getMIMEFromBuffer(buffer, path) {
1116
const fileTypeFromBuffer = await FileType.fromBuffer(buffer);
1217

@@ -31,7 +36,7 @@ async function getMIMEFromBuffer(buffer, path) {
3136
* @returns {number} a number 1-8 representing EXIF orientation,
3237
* in particular 1 if orientation tag is missing
3338
*/
34-
function getExifOrientation(img) {
39+
export function getExifOrientation(img) {
3540
return (img._exif && img._exif.tags && img._exif.tags.Orientation) || 1;
3641
}
3742

@@ -127,9 +132,17 @@ function transformBitmap(img, width, height, transformation) {
127132
}
128133
}
129134

130-
img.bitmap.data = data;
131135
img.bitmap.width = width;
132136
img.bitmap.height = height;
137+
138+
// img.bitmap.data = modifyEXIF(data, (_data) => {
139+
// _data["0th"][274] = 1;
140+
// return _data;
141+
// });
142+
143+
img.bitmap.data = data;
144+
145+
img._exif = EXIFParser.create(data).parse();
133146
}
134147

135148
/*
334 KB
Loading
361 KB
Loading
390 KB
Loading
389 KB
Loading
361 KB
Loading
360 KB
Loading
389 KB
Loading
390 KB
Loading
334 KB
Loading
361 KB
Loading
390 KB
Loading
389 KB
Loading
361 KB
Loading
360 KB
Loading
389 KB
Loading
390 KB
Loading

packages/jimp/test/exif-rotation.test.js

+31
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Jimp, getTestDir } from "@jimp/test-utils";
22
import expect from "@storybook/expect";
33

4+
import { getExifOrientation } from "@jimp/core/src/utils/image-bitmap";
45
import configure from "@jimp/custom";
56

67
const jimp = configure({ plugins: [] }, Jimp);
@@ -11,9 +12,34 @@ describe("EXIF orientation", () => {
1112
const regularImg = await imageWithOrientation(1);
1213
const orientedImg = await imageWithOrientation(orientation);
1314

15+
orientedImg.write(
16+
getTestDir(__dirname) + `/Landscape-output-${orientation}-PR.jpg`
17+
);
1418
expect(orientedImg.getWidth()).toBe(regularImg.getWidth());
1519
expect(orientedImg.getHeight()).toBe(regularImg.getHeight());
1620
expect(Jimp.distance(regularImg, orientedImg)).toBeLessThan(0.07);
21+
22+
expect(getExifOrientation(orientedImg)).toBe(
23+
getExifOrientation(regularImg)
24+
);
25+
});
26+
}
27+
28+
for (let orientation = 1; orientation <= 8; orientation++) {
29+
it(`is fixed when EXIF orientation is ${orientation}`, async () => {
30+
const regularImg = await imageWithOrientation(1);
31+
const orientedImg = await imageWithOrientation(orientation);
32+
33+
orientedImg.write(
34+
getTestDir(__dirname) + `/Portrait-output-${orientation}-PR.jpg`
35+
);
36+
expect(orientedImg.getWidth()).toBe(regularImg.getWidth());
37+
expect(orientedImg.getHeight()).toBe(regularImg.getHeight());
38+
expect(Jimp.distance(regularImg, orientedImg)).toBeLessThan(0.07);
39+
40+
expect(getExifOrientation(orientedImg)).toBe(
41+
getExifOrientation(regularImg)
42+
);
1743
});
1844
}
1945
});
@@ -23,3 +49,8 @@ function imageWithOrientation(orientation) {
2349
const path = getTestDir(__dirname) + "/images/exif-orientation/" + imageName;
2450
return jimp.read(path);
2551
}
52+
function imageWithOrientation2(orientation) {
53+
const imageName = `Portrait_${orientation}.jpg`;
54+
const path = getTestDir(__dirname) + "/images/exif-orientation/" + imageName;
55+
return jimp.read(path);
56+
}

yarn.lock

+65-32
Original file line numberDiff line numberDiff line change
@@ -1388,13 +1388,13 @@
13881388
chalk "^4.0.0"
13891389

13901390
"@jimp/bmp@link:packages/type-bmp":
1391-
version "0.22.7"
1391+
version "0.22.8"
13921392
dependencies:
13931393
"@jimp/utils" "link:packages/utils"
13941394
bmp-js "^0.1.0"
13951395

13961396
"@jimp/core@link:packages/core":
1397-
version "0.22.7"
1397+
version "0.22.8"
13981398
dependencies:
13991399
"@jimp/utils" "link:packages/utils"
14001400
any-base "^1.1.0"
@@ -1407,132 +1407,132 @@
14071407
tinycolor2 "^1.6.0"
14081408

14091409
"@jimp/custom@link:packages/custom":
1410-
version "0.22.7"
1410+
version "0.22.8"
14111411
dependencies:
14121412
"@jimp/core" "link:packages/core"
14131413

14141414
"@jimp/gif@link:packages/type-gif":
1415-
version "0.22.7"
1415+
version "0.22.8"
14161416
dependencies:
14171417
"@jimp/utils" "link:packages/utils"
14181418
gifwrap "^0.10.1"
14191419
omggif "^1.0.9"
14201420

14211421
"@jimp/jpeg@link:packages/type-jpeg":
1422-
version "0.22.7"
1422+
version "0.22.8"
14231423
dependencies:
14241424
"@jimp/utils" "link:packages/utils"
14251425
jpeg-js "^0.4.4"
14261426

14271427
"@jimp/plugin-blit@link:packages/plugin-blit":
1428-
version "0.22.7"
1428+
version "0.22.8"
14291429
dependencies:
14301430
"@jimp/utils" "link:packages/utils"
14311431

14321432
"@jimp/plugin-blur@link:packages/plugin-blur":
1433-
version "0.22.7"
1433+
version "0.22.8"
14341434
dependencies:
14351435
"@jimp/utils" "link:packages/utils"
14361436

14371437
"@jimp/plugin-circle@link:packages/plugin-circle":
1438-
version "0.22.7"
1438+
version "0.22.8"
14391439
dependencies:
14401440
"@jimp/utils" "link:packages/utils"
14411441

14421442
"@jimp/plugin-color@link:packages/plugin-color":
1443-
version "0.22.7"
1443+
version "0.22.8"
14441444
dependencies:
14451445
"@jimp/utils" "link:packages/utils"
14461446
tinycolor2 "^1.6.0"
14471447

14481448
"@jimp/plugin-contain@link:packages/plugin-contain":
1449-
version "0.22.7"
1449+
version "0.22.8"
14501450
dependencies:
14511451
"@jimp/utils" "link:packages/utils"
14521452

14531453
"@jimp/plugin-cover@link:packages/plugin-cover":
1454-
version "0.22.7"
1454+
version "0.22.8"
14551455
dependencies:
14561456
"@jimp/utils" "link:packages/utils"
14571457

14581458
"@jimp/plugin-crop@link:packages/plugin-crop":
1459-
version "0.22.7"
1459+
version "0.22.8"
14601460
dependencies:
14611461
"@jimp/utils" "link:packages/utils"
14621462

14631463
"@jimp/plugin-displace@link:packages/plugin-displace":
1464-
version "0.22.7"
1464+
version "0.22.8"
14651465
dependencies:
14661466
"@jimp/utils" "link:packages/utils"
14671467

14681468
"@jimp/plugin-dither@link:packages/plugin-dither":
1469-
version "0.22.7"
1469+
version "0.22.8"
14701470
dependencies:
14711471
"@jimp/utils" "link:packages/utils"
14721472

14731473
"@jimp/plugin-fisheye@link:packages/plugin-fisheye":
1474-
version "0.22.7"
1474+
version "0.22.8"
14751475
dependencies:
14761476
"@jimp/utils" "link:packages/utils"
14771477

14781478
"@jimp/plugin-flip@link:packages/plugin-flip":
1479-
version "0.22.7"
1479+
version "0.22.8"
14801480
dependencies:
14811481
"@jimp/utils" "link:packages/utils"
14821482

14831483
"@jimp/plugin-gaussian@link:packages/plugin-gaussian":
1484-
version "0.22.7"
1484+
version "0.22.8"
14851485
dependencies:
14861486
"@jimp/utils" "link:packages/utils"
14871487

14881488
"@jimp/plugin-invert@link:packages/plugin-invert":
1489-
version "0.22.7"
1489+
version "0.22.8"
14901490
dependencies:
14911491
"@jimp/utils" "link:packages/utils"
14921492

14931493
"@jimp/plugin-mask@link:packages/plugin-mask":
1494-
version "0.22.7"
1494+
version "0.22.8"
14951495
dependencies:
14961496
"@jimp/utils" "link:packages/utils"
14971497

14981498
"@jimp/plugin-normalize@link:packages/plugin-normalize":
1499-
version "0.22.7"
1499+
version "0.22.8"
15001500
dependencies:
15011501
"@jimp/utils" "link:packages/utils"
15021502

15031503
"@jimp/plugin-print@link:packages/plugin-print":
1504-
version "0.22.7"
1504+
version "0.22.8"
15051505
dependencies:
15061506
"@jimp/utils" "link:packages/utils"
15071507
load-bmfont "^1.4.1"
15081508

15091509
"@jimp/plugin-resize@link:packages/plugin-resize":
1510-
version "0.22.7"
1510+
version "0.22.8"
15111511
dependencies:
15121512
"@jimp/utils" "link:packages/utils"
15131513

15141514
"@jimp/plugin-rotate@link:packages/plugin-rotate":
1515-
version "0.22.7"
1515+
version "0.22.8"
15161516
dependencies:
15171517
"@jimp/utils" "link:packages/utils"
15181518

15191519
"@jimp/plugin-scale@link:packages/plugin-scale":
1520-
version "0.22.7"
1520+
version "0.22.8"
15211521
dependencies:
15221522
"@jimp/utils" "link:packages/utils"
15231523

15241524
"@jimp/plugin-shadow@link:packages/plugin-shadow":
1525-
version "0.22.7"
1525+
version "0.22.8"
15261526
dependencies:
15271527
"@jimp/utils" "link:packages/utils"
15281528

15291529
"@jimp/plugin-threshold@link:packages/plugin-threshold":
1530-
version "0.22.7"
1530+
version "0.22.8"
15311531
dependencies:
15321532
"@jimp/utils" "link:packages/utils"
15331533

15341534
"@jimp/plugins@link:packages/plugins":
1535-
version "0.22.7"
1535+
version "0.22.8"
15361536
dependencies:
15371537
"@jimp/plugin-blit" "link:packages/plugin-blit"
15381538
"@jimp/plugin-blur" "link:packages/plugin-blur"
@@ -1558,23 +1558,23 @@
15581558
timm "^1.6.1"
15591559

15601560
"@jimp/png@link:packages/type-png":
1561-
version "0.22.7"
1561+
version "0.22.8"
15621562
dependencies:
15631563
"@jimp/utils" "link:packages/utils"
15641564
pngjs "^6.0.0"
15651565

15661566
"@jimp/test-utils@link:packages/test-utils":
1567-
version "0.22.7"
1567+
version "0.22.8"
15681568
dependencies:
15691569
pngjs "^6.0.0"
15701570

15711571
"@jimp/tiff@link:packages/type-tiff":
1572-
version "0.22.7"
1572+
version "0.22.8"
15731573
dependencies:
15741574
utif2 "^4.0.1"
15751575

15761576
"@jimp/types@link:packages/types":
1577-
version "0.22.7"
1577+
version "0.22.8"
15781578
dependencies:
15791579
"@jimp/bmp" "link:packages/type-bmp"
15801580
"@jimp/gif" "link:packages/type-gif"
@@ -1584,7 +1584,7 @@
15841584
timm "^1.6.1"
15851585

15861586
"@jimp/utils@link:packages/utils":
1587-
version "0.22.7"
1587+
version "0.22.8"
15881588
dependencies:
15891589
regenerator-runtime "^0.13.3"
15901590

@@ -4569,6 +4569,13 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3:
45694569
shebang-command "^2.0.0"
45704570
which "^2.0.1"
45714571

4572+
current-exif-date@^0.0.0:
4573+
version "0.0.0"
4574+
resolved "https://registry.yarnpkg.com/current-exif-date/-/current-exif-date-0.0.0.tgz#13060eec20a24de3607c00cdd743f75a7cab60de"
4575+
integrity sha512-MdCRt6rxQzOssEeHjgfZFpmDydW6zyUAkUuP0gyGr2YZo25WZDM9SMG7gnFEX5zWQ9WNV9hi/V0hrMhDXazTvQ==
4576+
dependencies:
4577+
exif-date "^1.2.0"
4578+
45724579
currently-unhandled@^0.4.1:
45734580
version "0.4.1"
45744581
resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
@@ -5464,6 +5471,11 @@ execa@^4.0.0:
54645471
signal-exit "^3.0.2"
54655472
strip-final-newline "^2.0.0"
54665473

5474+
exif-date@^1.2.0:
5475+
version "1.2.0"
5476+
resolved "https://registry.yarnpkg.com/exif-date/-/exif-date-1.2.0.tgz#cb5ac1c32f26b4f0e7a7f574ed1efca05b8f3d72"
5477+
integrity sha512-gZCcYhgQ/6PD9iAYYQURXJ1zL0BZgiJ60xLxYwe2ont+VPJIWnsjPK2ochLN59kMR77KdiFb+SnmAEocngHC+w==
5478+
54675479
exif-parser@^0.1.12:
54685480
version "0.1.12"
54695481
resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922"
@@ -7080,6 +7092,11 @@ is-glob@^4.0.3, is-glob@~4.0.1:
70807092
dependencies:
70817093
is-extglob "^2.1.1"
70827094

7095+
is-jpg@^1.0.1:
7096+
version "1.0.1"
7097+
resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-1.0.1.tgz#296d57fdd99ce010434a7283e346ab9a1035e975"
7098+
integrity sha512-X5PVpLMBH/OaeTN8quzbcLTlwXCb/6n3tcfYTtEDzp0ZwAlgAOtIAIBHN4mS5OcscMgO8etZ5Ol1mNrXSqwBVQ==
7099+
70837100
is-negative-zero@^2.0.2:
70847101
version "2.0.2"
70857102
resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
@@ -8457,6 +8474,17 @@ mocha@^6.2.0:
84578474
yargs-parser "13.0.0"
84588475
yargs-unparser "1.5.0"
84598476

8477+
modify-exif@^0.0.1:
8478+
version "0.0.1"
8479+
resolved "https://registry.yarnpkg.com/modify-exif/-/modify-exif-0.0.1.tgz#654b862bdaf2e433d845ff1eb24a7b607bec4151"
8480+
integrity sha512-JwiSc/bi2UzGlnx5cD6NFvaWktAw9+pGBWPYax32MAyMHvYLnzYYU8zIdKvLoBHg7eOy+kQE2awybipC7phVDQ==
8481+
dependencies:
8482+
current-exif-date "^0.0.0"
8483+
is-jpg "^1.0.1"
8484+
is-plain-obj "^1.1.0"
8485+
piexifjs "^1.0.4"
8486+
safe-buffer "^5.1.2"
8487+
84608488
modify-values@^1.0.0:
84618489
version "1.0.1"
84628490
resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022"
@@ -9408,6 +9436,11 @@ picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1:
94089436
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
94099437
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
94109438

9439+
piexifjs@^1.0.4:
9440+
version "1.0.6"
9441+
resolved "https://registry.yarnpkg.com/piexifjs/-/piexifjs-1.0.6.tgz#883811d73f447218d0d06e9ed7866d04533e59e0"
9442+
integrity sha512-0wVyH0cKohzBQ5Gi2V1BuxYpxWfxF3cSqfFXfPIpl5tl9XLS5z4ogqhUCD20AbHi0h9aJkqXNJnkVev6gwh2ag==
9443+
94119444
pify@^2.0.0, pify@^2.3.0:
94129445
version "2.3.0"
94139446
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"

0 commit comments

Comments
 (0)