From faeb269e303fbbc9385ec123b3333ba0c02d93e3 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Tue, 19 Apr 2016 16:37:29 +0100 Subject: [PATCH 1/4] Revert "Fix for DIB/BMP images" --- PIL/BmpImagePlugin.py | 21 +++------------------ Tests/images/clipboard.dib | Bin 208436 -> 0 bytes Tests/images/clipboard_target.png | Bin 9493 -> 0 bytes Tests/test_file_bmp.py | 7 ------- libImaging/Unpack.c | 16 ---------------- 5 files changed, 3 insertions(+), 41 deletions(-) delete mode 100644 Tests/images/clipboard.dib delete mode 100644 Tests/images/clipboard_target.png diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 94764855d..e398445fa 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -109,12 +109,7 @@ class BmpImageFile(ImageFile.ImageFile): for idx, mask in enumerate(['r_mask', 'g_mask', 'b_mask', 'a_mask']): file_info[mask] = i32(header_data[36+idx*4:40+idx*4]) else: - # 40 byte headers only have the three components in the bitfields masks, - # ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx - # See also https://github.com/python-pillow/Pillow/issues/1293 - # Note below, None is a key in the SUPPORTED and MASK_MODES structures. - file_info['a_mask'] = None - for mask in ['r_mask', 'g_mask', 'b_mask']: + for mask in ['r_mask', 'g_mask', 'b_mask', 'a_mask']: file_info[mask] = i32(read(4)) file_info['rgb_mask'] = (file_info['r_mask'], file_info['g_mask'], file_info['b_mask']) file_info['rgba_mask'] = (file_info['r_mask'], file_info['g_mask'], file_info['b_mask'], file_info['a_mask']) @@ -135,22 +130,12 @@ class BmpImageFile(ImageFile.ImageFile): # ----------------- Process BMP with Bitfields compression (not palette) if file_info['compression'] == self.BITFIELDS: SUPPORTED = { - 32: [(0xff0000, 0xff00, 0xff, 0x0), - (0xff0000, 0xff00, 0xff, None), - (0xff0000, 0xff00, 0xff, 0xff000000), - (0x0, 0x0, 0x0, 0x0)], + 32: [(0xff0000, 0xff00, 0xff, 0x0), (0xff0000, 0xff00, 0xff, 0xff000000), (0x0, 0x0, 0x0, 0x0)], 24: [(0xff0000, 0xff00, 0xff)], 16: [(0xf800, 0x7e0, 0x1f), (0x7c00, 0x3e0, 0x1f)] } - # From inspecting DIB files from Vista screenshots, the - # file format is a 32 bit color image, where the 'Alpha' - # channel for screenshots is actually a transparency mask - # (255-alpha) where 00 is solid and ff is transparent. I - # can't find documentation of this, but it matches - # imagemagick's conversion of the .dib file into a .png. MASK_MODES = { (32, (0xff0000, 0xff00, 0xff, 0x0)): "BGRX", - (32, (0xff0000, 0xff00, 0xff, None)): "BGRT", (32, (0xff0000, 0xff00, 0xff, 0xff000000)): "BGRA", (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", (24, (0xff0000, 0xff00, 0xff)): "BGR", @@ -160,7 +145,7 @@ class BmpImageFile(ImageFile.ImageFile): if file_info['bits'] in SUPPORTED: if file_info['bits'] == 32 and file_info['rgba_mask'] in SUPPORTED[file_info['bits']]: raw_mode = MASK_MODES[(file_info['bits'], file_info['rgba_mask'])] - self.mode = "RGBA" if raw_mode in ("BGRA", "BGRT") else self.mode + self.mode = "RGBA" if raw_mode in ("BGRA",) else self.mode elif file_info['bits'] in (24, 16) and file_info['rgb_mask'] in SUPPORTED[file_info['bits']]: raw_mode = MASK_MODES[(file_info['bits'], file_info['rgb_mask'])] else: diff --git a/Tests/images/clipboard.dib b/Tests/images/clipboard.dib deleted file mode 100644 index 03dcab81d0d3c0b53227930815216ddbc4d22223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208436 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 diff --git a/Tests/images/clipboard_target.png b/Tests/images/clipboard_target.png deleted file mode 100644 index 46a69654340344332751d73e276bfc83dcbe95af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9493 zcmdUV1y@|n((ax>a2PBh@CHqAf=dS15Zv9}-F>0Eha53wG_kxziN=7-Vw zr0+JHzBHFkoN;|nTb`b5HVheY+CF64NlQNeX+4s`Cy9+H6c(0}LbSQPy$-UX7sf`+ z20O~bAHL?fO#dB-tffU7K&D9;3MQSVub$vPSz1FQcb2#GGlt@_(trp0kR08cjS8Ck;XqFy=jXt7FGxdK8eMjl`O)wa%kbJdg$vWb)2PF=Dy7rZD- zYZlkx6aHz#D}-GaNnD_e1o(;2-v4v$K+!I5e+1JZk+9}p zqX$_e@^sm8kCDiv%`Y{KMkJ`3z{!V9H41d(v5&!6#C3s3kjj=qPE5>Sde1w=y7PF5 z*#zR^;tHGOqPll~;mULlq}OAx5zY#w`L*96brn|T?J@W@E^u{(XbbTp~Izd-Me&85zjYdewJ zF3#Jbc)Y7vcz!ZRc(}hB;Zj@fVYb=b*qA$7+sMITVI<1ndvFEXtJk6gS}rz*P*6xJ z;_aS_B9Z=JNb2_506i?@1DTo^aSTa^iDH=(>_m6Rsb}g)Gx4t`qSXJ z%Q9H2_3r9GZbfK3g#7{oBe|HV?cAimjWLYm8|I#e{oXpKue5#Q(*9Y?%c}})wk%(@VkSNB!y$;#_vio~~oSKL4Vb|4Z zlaKmosaBpZ5+8FwATif%H%l$s^F>cY>tkjYOs`~HyX<2ox8E7|&nMRvBqq}5oyif% z>B098E^RXuTlad*cH?+Aj3v%i_gLRXcKgduW|@Y*m42T4#%~bVyFY&E4jY*+lN54r zb+vW;6!K9>Wb{5~I}j67pSp{*g!HxGqn z9K;Z;fK;<s=cxBP5fF9W7Y+I8;uT0UivZ;l8+K zy!N%M!#K%5#@B!O#g$&{@VG{&edLaF$QvuI8f6$IjPJ3v<{qWJd25PLXyoWa!?e+a*)cD_m2vxq zfX{OzIMr1(uT5`ljNv)c)f?|bJI}AYBUi(}u|EmY!IXD%GdB8__@5_;Q;^>5X`0BR z?aE#0Ggk@T-N>6|C&8X8OoTZnH*57rQEAZ;au%FcIoQ&Z%SW#V+ofZig|;W>n+t>1 zce11cL=c~(kv|i?P8o(HZ`?4o1T&3(y?5fp#`I=S(j;f%}($`yJ}>?X5UgSH6vm z&*>g@v!3KaN~56KtrC*gqu%m&gougFqSIJpkCqg-&2}q*Os{_b^08@4YWDou|ENl=RYv2sFUVI%Abqs_V4t*2=bq5Z+q}81P zd2?w?b#MD<8TpuUpysmeu-BpCetW~k(`vko{}l^XMSZ>Fvq!X(DS%$y!$~XV453g; z#~T#}OH$pJ6zyz!biP`if<^c3r-ry6R>*QZG=X{e_zLx&?jI4bj^;N?_^4reZHixF zd!J@r182UsOt#uBLA86-$8~Pb)5)$&%Q;#=g}WG?;`Qsjx9gN2zK9(b>PAtvkVGVx zzh8wrU#2Psui*`3uL1qIT&~w_K)1`Ew5|JV;tGFijfX(1RugXgj+FPD(@0`kmr`sd zPm6Qy+sszt(3LX1qtcRQHfl!}%d?+)0*lf9ax38?+hrfzVevt^nGZW;n|eNB{bw;k z0JFz5eVaAE{Mk7HPZhb`Eq44Cr3i?Oiypzv(#~Mu_qflu=h2#b`MbI?aP0xq4jiAa zrdK8?boHC&=xii|@qqyN<-!IlOLMYk@-1%(E)__$8)Z~W4M-CSOX1#$kb8ClQU&}- z2}aUAG-f<@!qIVF@lo$RmbFtf*W%qAN}V zeY7lagF&Q!X8Y6S7BLpM*3Ol;Wp)2o%S*M~rIsIgsKuYsUlFdkiA9fUI?^-#%YIaRY*Cb}QV# z(QgD-EHqY{fsr(OFPk0|?;49tWZ>d(0t~F~FCXy&cCOC~iHv3-UflxDw-@MW2*Ab3 zffJfwxs@8-N#TIeQ2)8omIsDlk{@>Jju8Yvst_4msQ2|+|MRp&139G!rbf>XqE@0BuieVFT#w^b=xdy0Wz1VaTd6i?Kx$bSA-eR-UY8>m6lFa^R;e^2GV?`TDM3E zzKt(|)w#}NE1>!^eSkZzx6#uFYc-#zwlP!X0*wR!PWGnUD4}ZQsw!m6#;eHLfgx?a zr;Ev40GacNy|dTivCdJ=GtufTR#OXGfnibEgUgT*t?jh;S=-n2k1h{1z|fke{;uGz z(RI0s6P!~8t*jq#4<^3Z>~8K~rLkNh11}*OyU&}SCue33;shX$9kbxX!4)NkGQ?qn zK!s>0l*i7@4n4mo3u^_=z%mH+C4{zh*G2xY1aW>?f}_g{mS$Xa?;dT0WjW?`Fj_4) z>toK)#w@V(c&7}qZ}aWGfH>-i&=}1&IAAvNkw879_&d-ygfV5Wdx|6B6+9YiXbVRs zc5_slf`abwh!_Amd&M`j9mvTLK7Eat))9cbvOBLdI%rfmff0s@p_ZIl2em0!w0J)l zfqu4m?oq(&hsB>yGT~#hem_gpsxPc?^}18K)Kag^B2mRWh0e3HS`a2&`MtPEGF$#x zarWNc#WsFh&S?~>MWEv(d&r`c9`^((?9q*>b5gv_O5vdvYzs_jUA5UH9quA^abr(g zPbzZy?&nSlta|rJ3@&fsNV|1eGFiTaHHukSFRo zZohxK5wZD$3TzaN^j7}F`0;bSAep|CTnPv-)n-A*Ie^Xrj3o( z>t6{RE=F~M_PL2(vwt#qDi|&HI_Tqf2&(Q0`je{qWr_V>0o+Y2moQTNkT`H6*;XLs ziQQpxN<^ls?eEU0Us5Paw{OUK z5HJw=loeaDpbXp?b|0+hl+mmp0bXb2(y}9MtQI1kBmnf$wC~Ylg#_5$ACk6%@##KJ zE^kb|(xCyZ|l4Nc!nBZ&t6+08IEALadFSz_*s-$wz@7$5L{?u=^5^sv8FEoRmNl0h`6yRu{r!47oJT>Y14z1>3 zHOV}ogUEx;0%18KGq^;B08`d!vz_GYeSz10JuUtBq-M-??WL3-h=2i$H)CkYQ8-5dgHwGeyla{U7G|Ky1p!R!SNpHNpUHQYSR}l^XjA;{ zLba++PV9Bz8=U*@Lh5G@wa0vp)G$+Kt31Dv8U8z>C!t3<5igZS=okiU`jOwzR+$Eu zeGKWy~3KmpcOs8vSdpuu@-q6tSSyq-40=}$u-|jET zG}B67Q=JV<@!ZMk=Ijpab-3IScFE?t(>Kw^0HiBOSr;rfA>(6pH(;$)7mM zG|g%xe{`Zu(V669lc8xrTUDextT!RO3=bL7!@pZl2=PJnwtR?v&+83rQv0yQPrbvo z#~PE&sD_6`oY`mC6ikd4+=bUl6K7>OT7T-Q?(wV?ej|jCF7C8 ze#Z_FJf35UF=7oM{)a#E#$g~4NV+XdW@?LcJtFqQZCpH76v(*k{J{h;pDR=oP-W?O z^(s3hvU$kY&%C3S?qqX%jcOCK`6VI(PmDx(a|+ip)ZMg)D#RVXV)%w!_uMlV>N0eg z2X*nZum}@p=|c^`{xB5cK7w(DpYv8@Ba{rKLq7#lsMF-Cp+ybf0fX4ghDB{`KI}la zsr#IqoJvc1gs^e9Be|BDcX?anPFoKb=jJ)F5y=%Woa9Q^qImFdl}X9Zs8EEN4>fs3 zvH>(SXr>>Mw~v3e2uMv0#y&R(Z4=Nhsui05MnM-oRx5%W|MhL$ZDA2eHp6I;7hT)M)ZE9^3?Vr=WD0M_rOgSM=EKYJ@g$$C zdJD2eEXizul@+Rx3pMD3dR;@S&9q$QpPmFASeWg}7(zTLb$$VFd3tuGlL&%e%+`b7 zun4QPiHQ|+W|s@8seshV3OA9#tX$Y`ZnnwMTyKgxRLnvq&15jowRV(#aB64>3PL4y zRl47LZM_Pt+9FwxPh@iwucO{v1rU+y(&)WflU3ROiA*GLa}Jd@=+J`TOV zPA0Vzei2=MiOh9)%IB4o!60S&V>^0fE*UZ%Gf0%=_-LITgZrapFEwLq26m}){pa(K znJz`R7uc|2m;+&7tU#2o5sW4TJ}6qQGC^*;?0cZtgDh zS({br_x0Tzw;K%TjVdWC&9>LMUe(us_9d%zXfQLUVO~7(TV#EtB~g>>h-sm@G*J7D z!WL?P_T!_OQF%5ok8Gqu}inom+Q$P4mCw*~uw_aK=n%g_VNR+Q(?b#y5w^3f# z>^q;-5q^!%M665ps`ZGOo1aVEkIGNIFTDFjsQ*?774NBjZ$W#vTBwEBMtm|CdEyZ^ z-rd~zCL%G>^dA~JLtA5jZBi+7kcsXEm5kvPA20iH+RK-Nl?lc{Tk@pAyI%7JB}a}r z*Q4@7E7QT~gDePZFd+yJTlpLFHe?eF!#%O!5Y}?(xP)T520y>;?~u{OvUb5KrRHQd z4wJ@ZN|qfSZjlgn(tYQ{KfAVv5736wvvKcY!dKnSd!Y8ANRObj#NL|tRv(pf2n;6u z&U8X1z5lJ11eLN*{l##?hfWnU;YsQl7ckf?EN_@m{mPtuZB;#w;BqG|QZ5XtV}{eVd=x#OVrjbgh%w>B4F#E>`Y*W99I~>r_Ay zrW$lHvz{E#!Z%Su%TNQ$gDh09-&X{XS>r##qcyE6gW(SP44k!lBU1Y34&y#BHOmgQ^t{_mWa(Ywi9txh6qJ6IFrzvmZGQHP)g9GYdY*xX+mclCZG13)M!vdNuc9e_V6bRlcbNIHs50 zh^J&;XetScJ?)<4J(BY8!U`G4v(3!Ev?kY)l;mL4Z4O^*5@(m{r^I`a%#gjOq&ZJ` zda40H^WMKS9h?mvN)05BrPN>R_;PaIl+C82GWAZqDi3}fY$(S3DYD;++itRu_oq6J zHI9}w$QF630C)DMszxe2-wF5Kbi|v9ak6~{CE3+B#rBMT@=EHYjBWHun4W-gFSI=) z-d&tdYcM2Af9{EN3XR3v(9X%}ue6vz>FVV{02CG9V&mf%vgwEh5%BV|rVcl`kKs9b zaBQAgZtftHQFi}cuM2x+i@fz6m0k5CVA@n^`11Q{F#X7@-+)&rQGD-Vb%mSt(NTi2 zV*SXtCy~6_>1o00+FEh7I%Be8!=O2vaij~mRkp0_ahb4*$$Ox^mm1S)$CaJN@6s87 zs}3{h3}>-cXQ7~IcHg5=!N`2C*0!M`+(U50tMnH70BpPa0@X~$9*WiQ&!Z`rnTq-_ z($dkX9NT~86IW{_7eQOwgH&h`1$Xq#Z-2q+B#!%r_DZ>jK*xh*ziaV3*riI^L$L~u zO=%c5uG%skmg7i_OW-W9V3e5gXdEBPeCB?7s7~+ca#xIbadqW3)^M)!o|1O3xV*IU zD2whL=n_pzk-0Z0<}^Q_ms(H%idv6Zu2f=)U+Ta@FuhdgUQSt6RfIsBm7I`kxW$68 z=qCf3)y#BF5*1}PD3!}f_N!d7;@7WV<&BMl4Ey5@BNoU_e-Tfjg2_G|Vc{sXzr~ZB z4jVg1()M6%L2xe7hYc>#CHW|Q|DOP&qo4o&g16)HdVq3+4cUaI$xSW0juRhXC z+eaN4D;i|UHU?s1JPG}{Hv7+SV+D~W!lH5d52;f=evSUCxjL9Tm22b`pO+^Y&F+G! zm}6g%ppR}*6)UcU#2WCX;5^FjqBji^TIudUVreDfaIz}ha%*hnWwa{TQ)F6kIsS{! zM3QBFL#s8Ux$Ju+`9if>RLl|~uRF8r(R}dYqPF*~iCGDavcl<$Iy-@Yn;WI+vQ$-@ z%%ls359z_h#YCc_d4!a)+=h*xdK~u@85Wn86tuJ=Izz!+u``pCWL#YJ!6b37PA(q$ z=joz-C?+Om+z^f|h3_*k)2`yU~gp>z|(dvG#PB z(w1jO2shP#G)GEk#ZtALQH=ZpF!Po7_kUJa{X}%}sU`crJAC_t{YE_ykDAvWrcHo| zWXVmVM8OL0g~XT@)l z@(SNePoHA6bxU#5+v5rmy|c}c05P@-SN6d7FPV)Qj)p|(yU4m!DG);Cf@V;D3k{+GFgqVWi+pMZUIl{u9Qev4w8EBA8r zX^ELIs@*nHU%9hLU_&C<{W_cHt3Iy@ktn0@>1WLxKXXOLphOev1GlMrat(=2GR8Lwmj-M!@Q>o{XV`%``_s1UpDgx@#w8!PZ?hwyGk?l673Ovw^V)sB(dhdAtcO} zdA7HCUqy#^Ysy=_oBQSEhLu%Pft|%tX>1uz(I?8!l8Wu{xWe-S4)GBhbwTQ< z%bcK!s2su*q5Ufj%@Gu)se2`0gTY%Q>4+^oDLcW3cH(@FU6=#MZqGT|6|U}&e!0TN zRUB=1Sd?7@->D@N5}Yf4_*17R#^se?EbUq{X=rG8jvO!hu!*r@zpFF+J1;G0==^Pi zESYLvN0Fh7Q8bd^3t^9w@$zbyAC6OYo@J55MGBVeewhxlzzRR^cVQ{Ls>jjEYYxxI z&!NyVy7ZQ6#2ycA3tVq<)R8WEwE0XxTb^SEC*_Kit6M-5rG=XyK5Q7#Pod+;>3cF0?2v9fTFHa^h_ z0O+sZB8*PVo8nTm^U9sxlvVt-0`1VoY=2v>0zwgs|3bg(6St>Pmj9$s_ZU$F)UR<5v z$w}T@tt`T#wheQSVoT*hR+g*MD3q@Gu+nJw4Qn2@Aep9cp~^+j$1HOs&K&g8oSDd^ zG8}`CiHzNf>*d?|xW`CXxPEiew&;y?FGXOdM2QH6Rs}BkK|zzzVlAX~kx3 zO^Vs+5^2{uZG3K4%#>cglHl`vA@;cf^A|Dx44N0Yu{R5c+`S@MW#HfSRp>MhpFg(1 zA{-pt0tcT&l4bGNjFD{H_vP8@y;J;_AvlZlpKsf*KG)Q1#lXvH-5XSKxhxdaI{&p} zA&1fm0{9Z36$f!pC1dgs4A1^{|_wxoH) zd?5QRhA4{nVaVa8f>(Qa9O7~n@m9tIaOQqDq`#`&-bJl*jMPN<_e>Us|K^J_CXCge zko5;alwRbQIg!A<|OzGa!-VP@Ledf1}DDo1jCKZ54fmckX-+ zUWD7fKXt@Y=V5BgZ-UZI_5wZ}_mX;vP)R`pMQRkD@kPQA4B*rZJ}&mLxg$ZYb5l4{ zGiKw9wL%76@>D0;$cIvZ-(YHG+!-4BY~ienCH+<3WT}^qKmd)=Ef%W|7Hj_?{=+Ti z0D*zqM%`n&MkrO4!~;6U_B*SFfuG;P-nkjR$J&(X{KU_RJuPG&zcn!LV*;Ny#Q+3<)pV za}#8=lO>yeCY(KA%Lq3}BYEvOP=Ou6flQhmLET{L=?^QJR&Q)^mS7JpEnd>{Bv=HK zeq@}}ycZo=)AuL~r%0Rxo)Oto*=HD~ykzMqI?y2yN}1k){v3=9zZ`R-` zTYApVd}o4UVw`n$*LI#_LN{mD8;uLBs!^t7!LQcp3q`1A-hMA3s$?OhRI7qcbGy?ahk>Cc!W> zGlL)HZ;aW930(SY1I4Pic|`&W4_MD%7z2c{}EI2 zvAz&I*8RTzy_~>fP0v$~SVU5jszYV1%Delo`n#jqpXKE2OqmSsN8iQ~!L2APDXFd_ z3aB*fM$>NdU7EK{ir?HcR#sDc2Z7AZ7o!N9no?C&RYhlHe3Rq9?V8_LPg7kARHUY& zLc*hx7KFbY%?{in3`cQg%q=U!vYIJ-d3RM?CuvF!@4@GJA!wZU<$zi&{4Uz|;pQ}n z)dVdjHWr7vG8KbhGVsO3sF9(e{pKH>_mq?xTEx|z!+LS?@dooX7SpP|)}mr!Yk$7K zn^x_lc(~b!O5*q7et3M885s;QzvL@48Au>!V8BRDPL6Sw-T!QZ)!*Iyl97?|4YzV_ zD=R%c`WknJFHW6A2~6mNRvktl5@yGAsTSp4TAlS=KvGiDk4N}GY4FjkN=!JN`PO2_ zV;L_GxO^Ynf9kc7Y;A2#s}AJ6c_6`W`jC&*zU*OSWW=!yj_D`Dn{2WIvU%$&;19NZjS+-zJQn7O!_ snR%T;3;!R0jh(TDsmFf;SU9- Date: Wed, 6 Apr 2016 06:22:12 -0700 Subject: [PATCH 2/4] Fixes DIB image format The DIB image format uses the 40 byte BMP header, followed by 3 masks for RGB channels. We were reading 4 masks, consuming the first pixel of the image. Mostly fixes issue #1293. Remaining issue: alpha channel is actually a transparency mask. --- PIL/BmpImagePlugin.py | 6 +++++- Tests/images/clipboard.dib | Bin 0 -> 208436 bytes Tests/images/clipboard_target.png | Bin 0 -> 9493 bytes Tests/test_file_bmp.py | 7 +++++++ 4 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Tests/images/clipboard.dib create mode 100644 Tests/images/clipboard_target.png diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index e398445fa..950ee13a1 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -109,7 +109,11 @@ class BmpImageFile(ImageFile.ImageFile): for idx, mask in enumerate(['r_mask', 'g_mask', 'b_mask', 'a_mask']): file_info[mask] = i32(header_data[36+idx*4:40+idx*4]) else: - for mask in ['r_mask', 'g_mask', 'b_mask', 'a_mask']: + # 40 byte headers only have the three components in the bitfields masks, + # ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx + # See also https://github.com/python-pillow/Pillow/issues/1293 + file_info['a_mask'] = 0xff000000 + for mask in ['r_mask', 'g_mask', 'b_mask']: file_info[mask] = i32(read(4)) file_info['rgb_mask'] = (file_info['r_mask'], file_info['g_mask'], file_info['b_mask']) file_info['rgba_mask'] = (file_info['r_mask'], file_info['g_mask'], file_info['b_mask'], file_info['a_mask']) diff --git a/Tests/images/clipboard.dib b/Tests/images/clipboard.dib new file mode 100644 index 0000000000000000000000000000000000000000..03dcab81d0d3c0b53227930815216ddbc4d22223 GIT binary patch literal 208436 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 literal 0 HcmV?d00001 diff --git a/Tests/images/clipboard_target.png b/Tests/images/clipboard_target.png new file mode 100644 index 0000000000000000000000000000000000000000..46a69654340344332751d73e276bfc83dcbe95af GIT binary patch literal 9493 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 snR%T;3;!R0jh(TDsmFf;SU9- Date: Tue, 19 Apr 2016 20:26:16 +0100 Subject: [PATCH 3/4] Comments for future people investigating alpha and DIBs --- PIL/BmpImagePlugin.py | 4 +++- Tests/test_file_bmp.py | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/PIL/BmpImagePlugin.py b/PIL/BmpImagePlugin.py index 950ee13a1..eccd29923 100644 --- a/PIL/BmpImagePlugin.py +++ b/PIL/BmpImagePlugin.py @@ -112,7 +112,9 @@ class BmpImageFile(ImageFile.ImageFile): # 40 byte headers only have the three components in the bitfields masks, # ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx # See also https://github.com/python-pillow/Pillow/issues/1293 - file_info['a_mask'] = 0xff000000 + # There is a 4th component in the RGBQuad, in the alpha location, but it + # is listed as a reserved component, and it is not generally an alpha channel + file_info['a_mask'] = 0x0 for mask in ['r_mask', 'g_mask', 'b_mask']: file_info[mask] = i32(read(4)) file_info['rgb_mask'] = (file_info['r_mask'], file_info['g_mask'], file_info['b_mask']) diff --git a/Tests/test_file_bmp.py b/Tests/test_file_bmp.py index 29d59ee44..1e373d037 100644 --- a/Tests/test_file_bmp.py +++ b/Tests/test_file_bmp.py @@ -74,8 +74,9 @@ class TestFileBmp(PillowTestCase): # test for #1293, Imagegrab returning Unsupported Bitfields Format im = BmpImagePlugin.DibImageFile('Tests/images/clipboard.dib') target = Image.open('Tests/images/clipboard_target.png') + # test only the RGB components, as there is no alpha in the DIB file. self.assert_image_equal(im.convert('RGB'), target.convert('RGB')) - self.assert_image_similar(im, target, 1) + if __name__ == '__main__': From 219182beda0368529bebeae6cad5e2b43b30301e Mon Sep 17 00:00:00 2001 From: wiredfool Date: Fri, 29 Apr 2016 21:17:18 +0100 Subject: [PATCH 4/4] Removing all transparency from the test image --- Tests/images/clipboard_target.png | Bin 9493 -> 8120 bytes Tests/test_file_bmp.py | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Tests/images/clipboard_target.png b/Tests/images/clipboard_target.png index 46a69654340344332751d73e276bfc83dcbe95af..60abdf5859bff3517d5dd2c5ffb9354e4a97f6ce 100644 GIT binary patch literal 8120 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 literal 9493 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 snR%T;3;!R0jh(TDsmFf;SU9-