From 18e204df05b534220a1e6330bd398c9c5a358f1d Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 7 May 2021 21:23:29 +1000 Subject: [PATCH] Removed DPI rounding from JPEG loading --- Tests/images/iptc_roundDown.jpg | Bin 21019 -> 0 bytes Tests/test_file_jpeg.py | 9 --------- src/PIL/JpegImagePlugin.py | 7 +++++-- 3 files changed, 5 insertions(+), 11 deletions(-) delete mode 100644 Tests/images/iptc_roundDown.jpg diff --git a/Tests/images/iptc_roundDown.jpg b/Tests/images/iptc_roundDown.jpg deleted file mode 100644 index f98206f1826f1844f1767cbb694f830de4ed403c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21019 zcmeFYc|26_|37?Y27~MdV_##2$TDO%2xDh#k;+zPC|OcbG7@F%*(WiWv1=t%N{b~? z_Owa%U5b({_ZfP>KcDY?-+$b{`@i4g@jH*lne%d;>s;rxJYUOooy+#n_5wh1Ae=sP zI*f2SSV}`h70@=Zv}Ixf7>BPI)B|8O3HS33J|1>P40;@Z?nw=+}002u%MSvB2 zEi1qcfdVWb6$G9T( zWU&1kIDp;hK%zHbcR*EH4cG_%%^35as~|wRygPa>*nIOZO$BL%Yr7*xfxUq=IKWVp zs=B%=EDZ`EK)M|4!}OPa4APMF-98WoC)e3`-qH=WL$B|SKLpaO*LTNc49WIiH2dE^ zBVZqZ`uAOGs;Us`f24v^ccsFD>Vo~H?|@7}X#W`#`d>8czi1}fE)Ub-_$>d`4*yFt zUduSf#Q*?n!VO4)G&^`Q?5(SMKvz{;N?lD?4Wo@MLiO&vkof`y+4# zV1_X|x{J<>uq#<>uw(7ZelXM~DdU@*<^?BI4qbl9K#F zGIBB!a$*va5)kk)I18MMm6b~Z!HbaiUp}^*0bW+%JV1p(qyZ=|1jY;5ehDcCnPrCT z91P|e2M7@+kV95B_B}iR6as@mLB2u8!8=h5_%QJ@^GT~2v+z55!(~Dc>M`j>tgCEu)Ivn(rPSx#*T3B5Pli;7*>QydePlyY_b~oZvsA{J?w&Vn6G=686xdS^#4tu z%m2S5`d6TT<=OrKaKIp-!C<_A5ioisahljZlH__t4tKj9;I|tS%f~a3b9lZ8KYo27 z(T5r$)}v*#L=Q4-&^+ck$b2g`!Z(Uz&%PdS{lqNaUomgqeHi*}k0o5kyB?-kScDB; zLR3hw*T3EPdGV5!5k1_O@@E6~fG=mw_qS|&&4zpA(@w2ElE6Tiw3#-<+DojY30ER; zW5`vaBnFSF9#?xt?0D?V{)!85y8KNsNJ&zYvq^`3q@;XP=_~ii$gE>Fo9I`oRGwVq zn-SoaP|NRAm((M3`y_3_c*UZQ@#qDvv+DSH4Zh?R4jygi|Bt;(4vUVawAakt*;&0~|mR%YGc@epIo zSEoS!kd6Q|opLV&Zb_>w+Y{Y<6xSS**#ZUd_HSGVpby?1yKm;Q z{n0uO+QrvNA_8qTE4MEjr2j@fYnwVGff{gaMO;SX(SAl3&axhj5L@lilkZ3h>eV>2 z4e%px$}}a9<00;DYw;nUMhZQBXAYkb7xk<^ey0ARP1JjVb7c*0Wp8`f84(4vF)KrN zX-C$oUWi&;y=W0U_^SO*|2T2s2`TthHy3wJ_(P*sotiA)<#X}-mD@)?{%Yy;=3 zRF8|>Us5~z^YG1wmQJ@Tmj*8BNkm;#%xMyTv-IML#<#+20xTJ$;#v`&7auGHCm03k zKajrPF0MPc8FgIoPL%{fucRx}^UU=-RWo)~8Ul9ckx{B&B3`Y9KRxHX)Xnr;U#~;PBt5t4Li(IM z&|ybz%25pJ-ed{Tnt^hz)#l?DqeepB>D=-d<+L|`YT8H+dTxW9_ulMVYLlfO6fbBp z;rncm_l~e$Es~^|^qR9<665zR>Rtb(;#-|Q$$M}v&K!3YNCp9Z)$=FDI_5hcCCi!& z7^j&LHKsOCnjIvqFCI0XyggHIsNVe`+Iy|dNln4p*2FiA1^$f`;n*w|MxK7*8~Al^ z&~@t{xj(B}Bl2W!!${*z)#c3a_@{Xvi5_o~D_`#IT}{^7 zjMudFD}r$Z+5dOIh!B^`f??M-A&Ji5FxgTtjsWZeF0Z zE5u9`yj`+T#Eg+^WOrcznmt5Eb9|}yX zdCE6y`!yuswrUm6xycSaxOL@-~`|_Ko#r%1=Vb9uL>lPob~j;-g)G(J7b2@yx&C zFM0>gzOb`!TuU&b6FoM9*3QW@JxnR`FZ{iJ=S?Ii<)5n%6d1n(%jv)5ex><+{;b{#>`8 zv@X-W9U*yO@#i$r)h29+2nUSZ*&+vHY%@tswkSH zm{3Ivob&&46KUoSfsPyTmzDHZr%;Aqlriyo_ViR8c;UBJ?6H+=}YOA5jSsV9Dd$f`FVgHCv;hTJ! zhnRbYJ=wx?l!Y6|Q_@=jGRN|)&^AzGS2|^TqSk`LCAHIXZ==p)pofs7A2ofe3i;N~ z=%$Vmi}bu-t7S5FCUx-9XC(K$wM$Sj(>Bm;W@dZ!2qA@UvxNN98_mj;{Awoo<%vg2 zoNw+;{|qV%{>}r{8-X0$LLB@MVpd~5tTbowAkW%-41RZm+t>3FedKq}8OrgEqNh_? zuR6AvIQq@)^n}3^`7S%MtGM!*yIyNGP#|^0tzIFC9b;?#$H>7w`a-SvEvj-A;|t7*NZe ze$V{pgi`Fg!EBBAsj^-=GOtALM{naX;iC!u)~Juywoa^nSKErJFb+6vc@#(g8hBdI znPV>N+UYmiZ-R~9)&-rv=kD8^Csj`g?L<^NW_#%@tobg}6_$h!5cAKT9ui2k=r@II zIPhkWvo-t4OuDXALr=-iybCT1#pEp9os>R29@4wiFygKIE}TwFC_UUJ^NHzYUa>c;`jxajc8+&bWUtNN!meNj`T4xnJR1OhIgF(-EQZ zgzg+UZj;(1)6-&DzRDu=C9Im~mn2hDedveYep${g=_9myeLrriH+zoQMMm?f*M5wC zaEx}~2GdEySvBdVMu9-b2RCdVnv>0)=R~K{W9Q~t0tNdHWNc2*!X?B8UDqXLPV5O2 z8Bbl}V)=Ub+V7)wA!gNK9s2j~W|e=o@b^}Jc@^SZSTWBWG2d&c-)l7`Z@w>VG0aJz zs3-pL{qk>7jn@8I?^sN5+6%2lt+aQVSME081hwCj7f-bTTv_NNi8%$Qgui^tXy=l> zSFba7-Cpu0Y8mrK$hK_=h`;{qo47q23}(Wym0Vwjg88QZz9$nxS4lS z=c-eYpR5HFq!P%OB;MS!c&_N@_Y?ak4;Ne#cYLMt64ocsSUmUOr|T%PW+4B2=h7?v zu*0@t;&|F*-HChW%l5(EQ|%`F#$D;1uImr7a^Fm(ACPYQtZj76Q>4JT&O+1bXji_K z@<7d4d=?+>7=SQH72m9~a2V)nsUTaQ&zCTM_S?>|u3oWjk@#A%#vtjVb;80F`8-`o z?j%>pyP-cKOSQ_b$|n7WChd=Lv3FM`hBI?3pMA_N88y%ybE!Kd+xVR|_;;J9|3=uF zEAZ|3kFm~yLRf6Q5#9T2_7#&7a`#-d@};ihVvt{~{VMiOB>2j$3&*}SwU%6br#8#U zDl2MXrHQ2tmQ$awJ^Z*0NW0CvmD~&nSW}#b8r2HuYRwTTk?oNC^-*eP+XkO+j2Yq|K`Kz50y{S>dT%L$l|U^zR=r`HD5Pj^i+B zYh0=T%t}(nMHdR4JB!$8K60!x42>?*wwB0&I4{f|L`mnTiwg%a;m31Q{BQ(mGkS>!R^Y*LlTz~g# z@wdigJ%2H0P5>^vWIH8pKhc{eFV7vy+D3=zJZpYy*MGHPET!#x`S(cfHxz!JeBU`! z$s92kX;vB@7MoP)QOpcaJ^d!P(^x7AGF-tvV&8{ogr!cIy<`uGNiP_X$&XoZEHbS> z(*>mDO(w_3F~#8e zcRuCweyo!+LcI;}8}ckD1Cd6YnKjJ9k;JcBiK!gm7~#5Hancm2wV+V0K$kaH`%(i$ zZ@=GJwBgyq!NtMO!^O$P$IHWyM2R2;1(9m9d&N<@8V3408rlc2I8Qt5K{vAl+7722 z-H!SA6Z{QrLn4Cx&U+sB_l5BC@gW6}`$a_d`MRjqGu@Efa1dQsM|TS{!T?c*^g{Y$N-88{riI^0*+W_ z1mi~;K;Qv7c!xFwawSXgz%Rb4mC87=MxYh^R9RhsX z0b=nL3&&(~m_F*QunY+mizU2-J!7HNJBa?=O#aip*Kv+~SA4a$@T?2Gd)ei6RNRA! ztm9ro%XIh4tl&0q>Ajrfe7=iD_!C#xgs~Gk&k&71 zt2XCU6gDo{Zv&nmf4fTO{4)zhpq+0n~W@XauW0*ycgT2^&a$n)x;3P1)dcX;?8c);!2oq=xb4nFpnN$oHK zYQqD)>jHlv4wojY9Svz<@O5QZ8VBfPQa98Q=hH*+LS%yWAq5uZz?%GrqpKyYqJU~* z&o)q^uzSdA zSf2Xf(ehz%GA3z-Oh1}mI48S7Fr6h9uKg(7YNX86v?`BD&ZkZsK^o*~M)ElxX_ek( zM+!73_}c3v!N0L#7kCWsktR^R&7}A27!OSZ`Pm5$Am0r2?H~XJOQUr~w0;FSAv1x9 zoV*U=143YMeWgocwVcm5V6Ghm1BRxM78V_<#t3=t1{nUye%HLUBs2l(h>a^wYuWLX9pr&V-wCRYSh1+R zJIZP)j$!-2V3V2JtxBiDFnJ8Wfd;dcKkPFRgA15%Tw1=AsaAZatZe<|Mu0;X7+q4) z+rXz=#rsz+x2A7ZOLUSy!}0I_hq4%f+Yx8{Pbl1pe`ZpkSs8wt2AWY2v{5Z+z8y^c zV@8nO6s_#XV^kCs*2L5eb&3P_B3L!7u`L@QFwIoCQ0)j{P)E#(cr9{3*>tIfgV({S z#OR6Rw4x)f_w?HL!p)9Z-)+G4sqv9R26+PYCOt<=rOlv%*JBd@bx9~AYJe>4Isn5J zcU+T!eTFZ9tm2V78r-?{*XS|%Cx~Vdt)mPN0Iu{<01u58Kt42r&O$#yysZ2U8 z>;@McU>Yp~CStmMau-gc48d}GVqFm zCASDniGoOU#Im4TzyY8RL;z-;VZ*#Mn3jQKO`5(Xkk8$kdH;0V=_%Ke@Q`rvZl}x; zELW9UlCrgkOxBMxvMWi2{jU0LTk?{mEt8_4O-@}|p{cbp8z_yYUOpxC3(Lfkil|F-S%>0ex#n**jfA8W=1mwlJFE9%_s* z^41D4O<4)S!C*Bi+Ef_giUYIgBkBE0&nm5z2QqxK?M>S&ld7N16`kcY7rrApe%jQ{ zB}Pnapl*OQk|W*K^}eshpzV6~lUJz|&OzG!@a|~El&7+G*Sd|CXAb;%I`}Z_Psz-Y zT!XyiQ{A<0MACox`u~XF444`-0uPw4L1ZvM!bt5%Mi5{?8kCn&CV{;`5w+KC-139u zL6|Rrm{_s{(b64;W1>1hV~sJuqhx9M7*eTzzzZfkugR1xXSN+Do->T_i4Qv;P@=># znSARuZ*%5J!=@@c`nuVtB-X0Th&q#xrdrPuzjU;%#X7s0Zt6>VZ&Y#D`5uiM15uQ* z4KyCH+U!}m^+}?$^})1G(E@==r_-?o) z#pYdp5CRVYWdYgm!NL)KP7qFLTFYn(iihJIt+@+8v?Yk~m`S1ROH2H23)mm;DmkI$ zWn@+Us#JoWc*hTqm+0h_>E3>0zfq=>)X3`P|&7(&|cpb0?lWjIJK zh%sqIL4W*S6%@}^O;LLhF^w=R`@O29iY~oym{10`ONwWb(q64f;KfH79$-r0bja>F zWanfQhna^J_XkNc%WaNIu%5P>K6%lepLG9LU!UeXt74l3^FN{vN1p|2h>dX6n-DHz0jK9*eD$7t&(N?xHuj>j^`XcAcPNmYDt_dMFpYJbo){emSYy-^n zoj6**K8b%Mt0^l;kt?p=jXR9sBLxPTe>3uK>9XUupd33n7*z9LyD&uaX4r>Oo|{~M z+!qWMidGsn#*Fag1x@J(u95@A*s%_cQE%((EP5-1csb2`A@Z$r9}-gzR>x$Yo{vi6z|%`0sSKNs*t z=}ucsph)tbsIEXG{w@i@kcP;?iCay?U_iO{ouA^DFto`>5yvjE619fYMP-9CpE?;X z!m=aWKSkI-rO#iC#qXL=dDk02Pv7acTXl@1G$(H)m;rm`ZB>QpRER+BiQJc6D(7i1 z%Ta1WPJjs0iM&Vm>L+k};qSgzVoZLMSzk@nS?V)4XRO`Dx5zMu*2GsBzpBJuWtoa4 z-xcVwlT5b{COo{Sgi;LU)YHt9!HY0S)7}sutSlwxWkY_TsO;Bg%0Jx}u(KBS)j3M6 zIAmgR?%c^s?qWW*3l|;31(_=4Bv$*_2luvU_`G}h^ZJODi0o{HKn-)h(4Jhn>)WDR z4PCen#}N7A>a_pF0EQC4h`bBaTF|G!B)e-qpB?1xRDu6mR4eHnB}iE%svLp_s~2V% zVy9fiEW7`*Z~7VAM+pozg^XtC4+!eWy2}A8b8aTdb$olXf=>P7D4#69-2U+}Ce3Up zO;g)2;I&)|{%VTi2EIBrwoBer?p2AVTs&HB4$Dedz&=kS17w_Io1$X%!^ry2qlrV; zY1w=Vb^&`eK0a{Cv%lLy6#nSdc6*13%xj1(xj4)ygqvGC;8jO080qdOtj)823K6aZJU8J-> zD0LkWOzMUa3CO1MQrNXp3ZRGQ#~s8UfXm-M#I1Tqr!@X5l$BokzSt}g_xpsVzW{eA z@^ho+(a|Aoxp1l(R9H0dOqtiuN@X=u-x_PtEU)H~KA4Gcwqr{241Sb8jm__i=#mms z0}&-ofUx(}e~4j=u_2_lDdE_A51DVWaJppJdH)K?xI=CgF4hs27%hu+X?kF^uV!uV zZh1GRV6vv3Jn6~St-4whc$&|>i`3@*>sGm|eVBs%-7oxA2l`)$ZGVT3Zv&1)|(SFg;>;o~wM z`Odh7)=MdEU# zC(=G*-qCewq#1A$uPNG!3}puV?fDP>$qWwAJV_yx-!rzR6j!@nUJ4Slv$#$7Y+q=v zIB|+unkLO@tlz5keYJ?=+R+2Sihhq=^^=_L+R1&5<%mtU(xKrROJosO>1qIcS5FL1eHyj? z1#Z10!o%zP5;N%)8VDEB#S(;a^DTjpE|um;KEtdN*?SWnXg|}WJ|^e!{1U=AU$g1$ zmZEk;$TkiTvI+Gks3g>jEPZAT|b3zUU zW#6=Gd>xB0c_nc2-eXS=FHhEbE$iF=dcFl0=n?tc9z1_6@o;Tg)Toh1ZO()5QSWn> zwQDl_G>FB)&#rbDuj2=HLyI!Fl(HLI8OfgxX2#w54=ky@`0)#>4LFH7x>L%7d83`m zn!mbIJyRG~Xhk3d^j-Bhp3-Wk=2ir8X3w_%l%1U}ZA}K$aA1JY>{e|7{5?J9_vX;C zT*I~U+IMH)Bj(4NG>n(q+e6DJ^#bi-@gv;>?bqcM#1(IT(Z*acZ4nkQkIhW_;lV3L zmFo4wMa-F5Ldd!ffZ1M{5T=$DZCDHVkkF(Cn)V8n1>uw*<7hy$A7GXi_+oo)Wwh!^ zc640jt?qV@j<34@-!Na)7x#~bxR%NsT0PvJ$`vqfDE~Nh>Ef5a(aUvo6;OU36m*Q{Qr2j1^ z{;8Bq!F&s@Bqg<#NfYrd@hy%0xr?~Y2`Bq|aF$%fRg2V_~ zLhoB?bi1t3I)^rTa3-;KV1atG9HL?20r;w%uXGbE)5}gn{LBit^bM}>BAEN-fS61M zPA;wCcd+8+iM3n7MV^HGbqqjaYZd!@bZybo0|>#lNW zR*-G6Gqe@}47#_3wJ9G3c2Fwn)FXC%>a z?E&o9m`shu=mo*qq4hy>vCsJN+|}3c8C3!G*|W*L$15jICj6=*fnla)|+ znQX$<&kk@RsZ26y?0{CPm8nQUKgl~rue?-~=3hx>G9ToX7~m(8Bh?U#t>zzm&juva z{|u3#RrMmgWubo9CbzVfAhfLqlzpv*mnSE-A9+TvPy z=ic69yhm?4ZOk5DHXE8N{4-nOB7|04yEhW<^m}08KntJe5sN)$Pb1oj1gaI$dVFI= z1MEsBTv|Jx5DDh%Ff8-_UJ^gKN^gXZ0L|7Y2(f8rDeqzVYHy!Mq6*VRzM-e+#<{J{ zl|r0PY$BaZ4<{oU7i_w9S`J!G2@98+%C*sznbl0Qbev+{q#C)u*K=CVS|1#D#vhc! zvzE&h8Qd=#OLwSH436xxX}J3y6IALXYaQn*UC|o;R;Nm4M8W=8Z;i*3V<{^I&9CRI z-LHeCM2cclZ%|S*C4!rbo4MHmGD7cdx(?~CvuaTaI1hSvcS zhYZXPymI=G2*eL?yCA;Yv-r#m@hfZ-#<=@aehwB@&wG(Dx`Lv~3 zCoZ3m-8t7H@X0TvHvG2gG?V~FhZ7{B@6-@1r>}DmZl7RGapS>PV-(YvW@z~%0H)Ji zvG6Wzs;^02{@77w;R?CrH;_v4Lli>DCl8yxeWH4{&V(Bo6p8p#vz8pxsad9V4@%V8P4*w?EcsRe&9=%H3DI{EIcB0gW^)}YPyg^F z^OYs*P@7d$x9Qm72lvW!>_UvS&wrxPRB0#PnE))aFvbDVyg5PmA>7jJ?^AN%BFS zPg+A=j_~0M0p2gk^7DPDzy~9p5^qLHg~i%;iUq+6~}k#)NX($MO|pK{*} zzB)ExKK@GR8HYM2lXIGL;{&b(3Y^Y|W8+8qu(?Bb)D=C)L!3Q^0>i8xi;-D=V#d7M zSW;KU3Rf=hc00}tN0G)isf$xw2R?2pmiRE;B)&Cz>SXby_Qs~ zm%;f_1Wd!}w8F;qUJc!CfQvZINpa=NzRIB*rPwXi-_*{V?9y28j#%&IHS-<9DWqE& zI=T|Y<8wTJb?u?R!>qa|d7Z{6R~vI{X(wV>(42tlL(kTzDm}3QY3lnWbI6}&k>lhT zmtS0*?(WXZ`6BzQP47F}6=kP0ANm3(mSwlERATInohPEEKe^oF;sm<1JuQ(zn=@mY z9G$nrBtx8OGb^R>@wfG3?OW7a+lz8oidB4p1BNRtAAgtf!42zJD>XisEtTRvN2%~tI%GI0nPTi?$_Hw=_F@i>pI9T4$IGtH&bs`|yp;jW3 zRpPI2b{t+7dqW9JXP|H5#aB1*Uj96ltnV)BT@|u_v_S%&Ou~-XA z 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 diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index ab799c13fb7..eb566e68730 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -656,15 +656,6 @@ def test_save_tiff_with_dpi(self, tmp_path): reloaded.load() assert im.info["dpi"] == reloaded.info["dpi"] - def test_load_dpi_rounding(self): - # Round up - with Image.open("Tests/images/iptc_roundUp.jpg") as im: - assert im.info["dpi"] == (44, 44) - - # Round down - with Image.open("Tests/images/iptc_roundDown.jpg") as im: - assert im.info["dpi"] == (2, 2) - def test_save_dpi_rounding(self, tmp_path): outfile = str(tmp_path / "temp.jpg") with Image.open("Tests/images/hopper.jpg") as im: diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index f449a2dc0e0..6d4bc70c5f1 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -33,6 +33,7 @@ # import array import io +import math import os import struct import subprocess @@ -162,15 +163,17 @@ def APP(self, marker): dpi = float(x_resolution[0]) / x_resolution[1] except TypeError: dpi = x_resolution + if math.isnan(dpi): + raise ValueError if resolution_unit == 3: # cm # 1 dpcm = 2.54 dpi dpi *= 2.54 - self.info["dpi"] = int(dpi + 0.5), int(dpi + 0.5) + self.info["dpi"] = dpi, dpi except (KeyError, SyntaxError, ValueError, ZeroDivisionError): # SyntaxError for invalid/unreadable EXIF # KeyError for dpi not included # ZeroDivisionError for invalid dpi rational value - # ValueError for x_resolution[0] being an invalid float + # ValueError for dpi being an invalid float self.info["dpi"] = 72, 72