From 1ba774ae7faf93355b85c7b005fbaf0b0e66d426 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 4 Mar 2019 11:49:39 +1100 Subject: [PATCH] Added ImageOps exif_transpose method --- Tests/images/hopper_orientation_2.jpg | Bin 0 -> 4695 bytes Tests/images/hopper_orientation_2.webp | Bin 0 -> 3686 bytes Tests/images/hopper_orientation_3.jpg | Bin 0 -> 4698 bytes Tests/images/hopper_orientation_3.webp | Bin 0 -> 3744 bytes Tests/images/hopper_orientation_4.jpg | Bin 0 -> 4701 bytes Tests/images/hopper_orientation_4.webp | Bin 0 -> 3718 bytes Tests/images/hopper_orientation_5.jpg | Bin 0 -> 4961 bytes Tests/images/hopper_orientation_5.webp | Bin 0 -> 3552 bytes Tests/images/hopper_orientation_6.jpg | Bin 0 -> 4951 bytes Tests/images/hopper_orientation_6.webp | Bin 0 -> 3676 bytes Tests/images/hopper_orientation_7.jpg | Bin 0 -> 4958 bytes Tests/images/hopper_orientation_7.webp | Bin 0 -> 3732 bytes Tests/images/hopper_orientation_8.jpg | Bin 0 -> 4956 bytes Tests/images/hopper_orientation_8.webp | Bin 0 -> 3678 bytes Tests/test_imageops.py | 28 +++++++++++++++++++++++++ src/PIL/ImageOps.py | 28 +++++++++++++++++++++++++ 16 files changed, 56 insertions(+) create mode 100644 Tests/images/hopper_orientation_2.jpg create mode 100644 Tests/images/hopper_orientation_2.webp create mode 100644 Tests/images/hopper_orientation_3.jpg create mode 100644 Tests/images/hopper_orientation_3.webp create mode 100644 Tests/images/hopper_orientation_4.jpg create mode 100644 Tests/images/hopper_orientation_4.webp create mode 100644 Tests/images/hopper_orientation_5.jpg create mode 100644 Tests/images/hopper_orientation_5.webp create mode 100644 Tests/images/hopper_orientation_6.jpg create mode 100644 Tests/images/hopper_orientation_6.webp create mode 100644 Tests/images/hopper_orientation_7.jpg create mode 100644 Tests/images/hopper_orientation_7.webp create mode 100644 Tests/images/hopper_orientation_8.jpg create mode 100644 Tests/images/hopper_orientation_8.webp diff --git a/Tests/images/hopper_orientation_2.jpg b/Tests/images/hopper_orientation_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02b4f392e6f52d3b987d6e4f3d630ca87253d62b GIT binary patch literal 4695 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 E0NJS>RsaA1 literal 0 HcmV?d00001 diff --git a/Tests/images/hopper_orientation_3.jpg b/Tests/images/hopper_orientation_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01717d980da1ce09c7d3202b276a47cecec37704 GIT binary patch literal 4698 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 literal 0 HcmV?d00001 diff --git a/Tests/images/hopper_orientation_3.webp b/Tests/images/hopper_orientation_3.webp new file mode 100644 index 0000000000000000000000000000000000000000..9537ff68e04fd437eac7e20b2bfa6e090f2bf44b GIT binary patch literal 3744 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 K000000000Iuu#?j literal 0 HcmV?d00001 diff --git a/Tests/images/hopper_orientation_4.jpg b/Tests/images/hopper_orientation_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e0bb4e1a7e43bb60b999d22d35784a8d4d38fe4 GIT binary patch literal 4701 zcmbW&c{J4TzX0%$eK!hOLx`F|Ukt_)S+XyYY=sbELP&N~wvfn{?3KneF(dmr$}*P9 zzLl}g*oN%;IzRn>=iGbF{p;TQe$Mlp^DO6m-mmlid-hPet?h3ZOlke}h5*v;jtXdIowrMg|53CMHH^RxUPH78X{% z^PC{Ai~Pbu7x@JRMZ{$!MMR~<1O=}sU6uMr77B$5ODbQ7$*IZ6L*@P^p<-fUVr60F zWn<%&yCir??*AN=Z@@W5;2H3YhDsEmK1W4!j*8L-2%i;ANA>UcPr+wgwqm7~ZzLV`Xh)Yv=O7)$O6Xho}FO zfTw{$!68x6F|jY=;uBKS(lg#!Jc^{=+(3|0DY!u5)KDYFb(vT86(a zD(b+$@N=|umt^VBYnn4S`ErWNJ!j<7N_k(_%p@jnvCi%6*Ux-G96ED(<1g*svi}_{ z^8Y3KFW7&(#sF3ts~#qb)PB?Gfe$oEYgUs?3L2O= z3Y;P}vPu=MdtQap!fovy)v#wF9&^7dt4q1NnjRmgPzZ_+)AmiiW>BZRWB;`W$J5-T zu|A(Rtvjfo?0V$gamVsm`3`L2(6T?ws?ST5X%~*x7vy@bk>xq4C6%m_^X>Ffb=8}B zI0y_&$&1ejVGoDr(I_lBNbRSOP3Di-c{RT2|B)h<{0eX8l(2P7;_7?*PH4E;|DB^9 zImO`z%jYiMx4slWs_UE2+(G}$iS$mMcdwbL+JRPDe$-cT_F>_sZlmbb@ z8Yf%#s$UXWPA+Iw@5y0GN5ea2C;8K)$*klMjO7`p?vE0feCNhkk@q! zJx38gWVPdERIl+U(8W>jU3u4F$Qq zU)#HCtvwy5GbvNnIb-yd$VJ-0K0Xhr*!N<{DeaYQzf=P|Ow~Bt8P;@g-vWn8k=3Pj z*mFE2pX5H@7NGz!!3rVP`0I9%oPB7J-+)$N_vyx>hM0rTSnXobhk((F*O9Mt)3R^l zFNsxo-seNEUX}fZG$)%-IrHUD>ZB??NHLvtg`FijTqYx4IC4Q>QUF#>p}Jzbu_cbv z6@1%sCDMDoJtc2 z)EP;Pt`~mXS_LvEydMwq#;xz7!ckN1d%L4buC@|KsxRnt86|~gN7EwB>{d=MhN<8- ziZJze-mpo~Qvm&18rp)@Ye$an1P`s{iEKg$(DG=#N$(-S*7yNwjlE-o7kba$nAn{k z8*5Lx&R7U7(G(_GK1-baGM|!J8j?n{SyXfJ>hp8li&Lx^Td&g9U%p}`o)NhP^N^m- zY3s^;e=~loC=ahh_3lkXW3a}IJ+Hn4@`%?uKqvg)>`VWNy|?huzl4WNk0nU0-76BpXL*=5M+t47cikdtKs7 zkUX#i_qpxJ{m~H`m5ZoCzV|@cj8>i~+;yt2)em%8jr7fSD=hT1(}`3)QoeuLkA)qC zQoyaZPslWhxtGV64g% zpvi!{|3%4Kmsk$Zi-eO|v-~~(9d!CCH@$oUVIWNPGn~oiB*Y5D|vt6==AU>6n+)yZ9G+EL$$iBlV=1 zobh&>I83t2It7Sa^YIp`Z%pp2v}WxRY3)?cASZ&gJBx&>2!`23B}pDb{vr7c5-U`;vgFxdzfT|IjF|u;7md?Mn9a&aOIQpRE_+7G{*6^)_`pZfB#zJ$ zV&O3`ZL~%*55?r#_Z}ua_{lsz|GHwalIbl&T%&=z&#SfCT7OMde3mz(CGH-%5_CF zvVF7FcV0(t+!Z}S+$FV)VWRs~#!s?H#(tND3hb7NjYBr{`SauL<57&XmOK}9iNmvT zF;aYiS1EwT>@c{rU{dr6u009TD#TRtg?i0Gr?&o-OYI|q2rp-N_Ri%ZI6r&S#H}Z! zjlla5X*=a;ACoI-023CAi=MF<5YE>6eR$jGwt+I)UV^#|FW~`#M&DfRi2ugNc@5vKu9NEQ4Awr<7iiio}naRo$sSm>?ZxJ5B^yXDw?E|u_ zs;2=Db^5(94?=Bcs)J{!!tghgurQb7ugt!V@eQel6G_1f>od<+KU7v(>TH3&D_uE! zI-jOp-&7Yr8Pxd6RkbjV0x<7l&p!Dbl{#A45lWBrq>4{K6H-DiWw z9tZ|QDkE&6M)xgD_) zN%u^Yx#y)_OHFTfyGPdEIeXJCC#YBbTo&dCkhb{cL9RKHvh9HHdfa||U>SDW-H>|% z=}fN5d3oLXJJ$bDx(YM-DPblx4)vqMB8rKi7#-Zjj23Jq7%dXiM#iPgX_0(Y4car2e4?tfL#^-~!HS#Qk=*mM2 zS_d1k*5IL+DuU8#M8%m-Cx|s+4qn<8M#5 z83@#0Dk%WZ5A?)ZP5-#>^SMis1*ni^1q#5{i>}QU(fKy3qR0z!u{D|rCe~c_{j|h5 zV^{#bU&!#O*N)5O#~KY&4HqYSx!k2D{fk2f2g>IVb4p1>E38lVDg? zd_TFKyF%L?G2kjD;_^&on{0nEqbt8a%J^5FlT6nBi!6hO@VBnWB~W%8ryCof&ZMNG&TFLGun`Kn| zzCA7R z*MGn}XGR+ixr^V(QZq+yeK)C$uqlZh^syj99#-Z_m&uE zd-5@RHK3XTa0e`MQCI&7tsZxaj{xt-nkJtILP2)kIqNlT+0jjozb{Y=!w-62Me%iY zz*bTUT0X%eSR49ejCnFuf_;ayAD5r&QKm`RA2Ed9Emzzf#?)aL@Oj=+2QLMm9TAH? zg*mH=Yx%F}Sk2VeZ~iLIc5J~|TMcxdV0!YvRCy`m#p)XD48)su!>9a&mU!`-f24_4 zTi7)jj`%G96fStGDb-pp3|&Rru>x19o8L5(ZtIpBP)n7)oRwryYB#76P-NRN;iP%U zJiV&MQ$iRcIIvi!eqSsQ4ZE)|Kg#f0y$~1p4?02Ic)^_-*Vv?5(S^sQUE`y>_fxZ4Qn5c{Ine<%0oMp)V(NCoMBp;g#{ z2Dp9!LjP|N8KZ!b?}FGE4GO&15CwE-p}Gi&!c1TnkSg!77h z^gMMmG?EgH3)Vvmqw~*xpghI`DvgEz?3S@MAS%P<2}m2<$h9gZP-r0ZkNWCfr?BQ& z{i16*e5$VnD=jTnS3_cpkoK|AbZ?Ntj6Q%QJ}fd-eM$kAtrfauju%F9UPH!ErqJm^ up%;0|%Bp3$2s=3t*TnCSY6T$;=MA#`a`_(_;K~R%+jB8%dbi3bzyAd!eHgI- literal 0 HcmV?d00001 diff --git a/Tests/images/hopper_orientation_4.webp b/Tests/images/hopper_orientation_4.webp new file mode 100644 index 0000000000000000000000000000000000000000..ca7b8cd302c6cdeea77d537ec1ea56ba25630b1c GIT binary patch literal 3718 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 literal 0 HcmV?d00001 diff --git a/Tests/images/hopper_orientation_5.jpg b/Tests/images/hopper_orientation_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fd32afc27fadf678321d1c5ee4cd67607fb8e9ea GIT binary patch literal 4961 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 literal 0 HcmV?d00001 diff --git a/Tests/images/hopper_orientation_5.webp b/Tests/images/hopper_orientation_5.webp new file mode 100644 index 0000000000000000000000000000000000000000..a3164a90d2d17c09b92e3d56f84cb5375774ec24 GIT binary patch literal 3552 zcmV<64IlDSNk&H44FCXFMM6+kP&il$000080001g004gg09H^qAd(FL0I)LvodGI< z0Du5KZ7!2Vq#~h~i9Uot2E?Yy)us*dg8rY*&e!_M$U<qz6yYF|%-thuVd*NW8skVi=0`e*_mA ziM6-U%ZH3^tY4H-+x1`ajhDoLC2Y^4VX{Vkk6Lz!ry6Eq*y$yO?Ft<#uiBeV4U=O) z|6;!}sZdf*-Uin$3CclJF>T}CReRs;1epUdwiHB}sxO&uyd`JPrn^`YOAr`;H28PL zL17X?BbkX1(*V33!MJG7H8>9YzRmLGH7gUKm(LEL)`0?ST9|g+&Nv?y$ZV_UFbJ=`(mgVKMSW6CBYKghLmt3B1q2X$VrEL@Pd zhx_>nON}nEN=Xw;|egZrl+YF03B+wG_&W%#rCz5k#49q-yyB@%7Emt3y5-Va;sG_Q)vzdOxj zy5`UrRpe{Uwd2^DGeE@ee{e>uIzqZUZc_ATi9GCjQC9suzQ-N63ZLyc0#E6Ch-F5f z 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 a00;m80096J0RsR5000050000000020h2ZP} literal 0 HcmV?d00001 diff --git a/Tests/images/hopper_orientation_6.jpg b/Tests/images/hopper_orientation_6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..22a0961982729865c36fef52a207d3312b7c8a96 GIT binary patch literal 4951 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 literal 0 HcmV?d00001 diff --git a/Tests/images/hopper_orientation_6.webp b/Tests/images/hopper_orientation_6.webp new file mode 100644 index 0000000000000000000000000000000000000000..3e24c5bcb5ad6875521fcfc723f6e57c36f6d4d6 GIT binary patch literal 3676 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 literal 0 HcmV?d00001 diff --git a/Tests/images/hopper_orientation_8.jpg b/Tests/images/hopper_orientation_8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e6b8c2c1c072719ca96cf1269d99f29cd6b10f61 GIT binary patch literal 4956 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 literal 0 HcmV?d00001 diff --git a/Tests/images/hopper_orientation_8.webp b/Tests/images/hopper_orientation_8.webp new file mode 100644 index 0000000000000000000000000000000000000000..3cce80a47ec4363af0d308162692bd909f1830d6 GIT binary patch literal 3678 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 literal 0 HcmV?d00001 diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py index c5e48c431..c0ac12f6c 100644 --- a/Tests/test_imageops.py +++ b/Tests/test_imageops.py @@ -3,6 +3,12 @@ from .helper import PillowTestCase, hopper from PIL import ImageOps from PIL import Image +try: + from PIL import _webp + HAVE_WEBP = True +except ImportError: + HAVE_WEBP = False + class TestImageOps(PillowTestCase): @@ -62,6 +68,9 @@ class TestImageOps(PillowTestCase): ImageOps.solarize(hopper("L")) ImageOps.solarize(hopper("RGB")) + ImageOps.exif_transpose(hopper("L")) + ImageOps.exif_transpose(hopper("RGB")) + def test_1pxfit(self): # Division by zero in equalize if image is 1 pixel high newimg = ImageOps.fit(hopper("RGB").resize((1, 1)), (35, 35)) @@ -218,3 +227,22 @@ class TestImageOps(PillowTestCase): (0, 127, 0), threshold=1, msg='white test pixel incorrect') + + def test_exif_transpose(self): + exts = [".jpg"] + if HAVE_WEBP and _webp.HAVE_WEBPANIM: + exts.append(".webp") + for ext in exts: + base_im = Image.open("Tests/images/hopper"+ext) + + orientations = [base_im] + for i in range(2, 9): + im = Image.open("Tests/images/hopper_orientation_"+str(i)+ext) + orientations.append(im) + for im in orientations: + transposed_im = ImageOps.exif_transpose(im) + self.assert_image_similar(base_im, transposed_im, 17) + + # Repeat the operation, to test that it does not keep transposing + transposed_im2 = ImageOps.exif_transpose(transposed_im) + self.assert_image_equal(transposed_im2, transposed_im) diff --git a/src/PIL/ImageOps.py b/src/PIL/ImageOps.py index b93f6f35d..afbe3e2c0 100644 --- a/src/PIL/ImageOps.py +++ b/src/PIL/ImageOps.py @@ -522,3 +522,31 @@ def solarize(image, threshold=128): else: lut.append(255-i) return _lut(image, lut) + + +def exif_transpose(image): + """ + If an image has an EXIF Orientation tag, return a new image that is + transposed accordingly. Otherwise, return a copy of the image. + + :param image: The image to transpose. + :return: An image. + """ + if not hasattr(image, '_exif_transposed') and hasattr(image, '_getexif'): + exif = image._getexif() + if exif: + orientation = exif.get(0x0112) + method = { + 2: Image.FLIP_LEFT_RIGHT, + 3: Image.ROTATE_180, + 4: Image.FLIP_TOP_BOTTOM, + 5: Image.TRANSPOSE, + 6: Image.ROTATE_270, + 7: Image.TRANSVERSE, + 8: Image.ROTATE_90 + }.get(orientation) + if method is not None: + transposed_image = image.transpose(method) + transposed_image._exif_transposed = True + return transposed_image + return image.copy()