From 5277eec027b3957b395c3c8d59ce41b2b7ab30b2 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 8 Mar 2019 19:26:01 +1100 Subject: [PATCH] Added support for RGBA bitfield compression --- Tests/images/rgb32bf-rgba.bmp | Bin 0 -> 32650 bytes Tests/test_file_bmp.py | 12 ++++++++++++ src/PIL/BmpImagePlugin.py | 4 +++- 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 Tests/images/rgb32bf-rgba.bmp diff --git a/Tests/images/rgb32bf-rgba.bmp b/Tests/images/rgb32bf-rgba.bmp new file mode 100644 index 0000000000000000000000000000000000000000..467c2570b1b786737282c47c540cff641721d94a GIT binary patch literal 32650 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

x!;wQP*@` zH?*Xix~1D%)*ao|J+0`z9_XQhV4D3j`)T&m?5EjJv!7-^&3>BwH2Z1x)9k0&dkpf3 z#~Dv~9Py&Z3a?MIpJqSJewzI>`)T&m?0b(L{(kwXz1zHmr`b=lpJqSJewzI>`)T&m z?5F>WuldvLr`b=x#eSOoH2Z1x)9k0&PkT(&r#8)gn*B8UY4+1^vF{xd(R*IS^jqww z*-x{dWAG%c zNjG&%x3#Q0x~qFy(S1G8L#-+ZX4ucLpJ6}4eun)F`x*8#>}S}|u%BT+!+wVS4106X zQ|6c#%_FbRu%BT+!+wVS4Eq`OGwgfw$lot-+8@6CPq}{cJ}%Cf-_Nk0VL$U0`x*8# z>}S}|u%B@-=)W&B>}S}|u%BT+^A`Kw@h`pS(DWXMJ6zuUoDSdqr(U0%n+wisUKeyx zm$abEx}vLE)HPk#4K3-WZt1p`bw_t~Pb<2w2YRSgJyH}T1}vY%x?%YK%9?|X{hFMsYfdh_E? z&H8#c%YK&qEc@BF*w3<`Wk1V))`7rpEVJxq+0U|{eT#kXSf}3erFxIK9xiWwUWaf0 z?_OUxb0)Z`OIpxnUC~u7>YA?WhL&_ww{%;}x}&?grxo4T13lEL9_g`yV2=G9`#JV= z?C03ev7ci<$9|6e9Q!%;bL{8X&#|9lZ{NIV|GRD|DZN2Bl z^&Ve8Tn_K&&%HjpzuxtwvuA?^UDg#{)uOKHx^8GmH+4(5wX8e3t9x3}eLc`at?H2; z>xqJ3p8Y)gdG_<{=h@G*pJzYMexCh2`+4^B?C06fv!7=_&wif$Jo|a}^X%u@&$FLr zKhJ*thgJG>w@vTk50@kJ?C06fv!7=_&wlZfHq2bxXIktUJ1^ds@+bJX9Dn ziPjVZ3+xxzFR))=zrcQh{Q~<1_6zJ6*e|eOV86hAf&Bve1@;T<7uYYbUtqt$eu4c0 z`vvw3z18@BIou|PfB#dj-~9Mf3+xxzFR))=zwj3O1;6~^-%;r#T^}x2&YusiYEjp8T{pC(o4TdjTGk!i)jh4~z8>hIR`p1a z^+aoWsvuZozsP=({UZBC_KWNn*)OtRWWUIMk^Lh3MfQvA7uheeUu3_?ev$nm`$hJP z>=)TDvR^!0m7hGe^TQ2)!YhZ{=F0x-_zsP>^kJ}%<|C=BGr@noW{UZC`&qoiJ zKX#voxBstRzj;4b=jVe(UDI{l(2{QImTqfVcXU_xw4(cZpod!3BR$p=t?8+rDF~L> zFR@=@zr=ot{Sx~n_Dk%S*e|hPV!y=6FlycuVGZOXhe>=6Fj# z`ZxZE##+2^A-JaNx}hcA)GgiCvhL`v?rBB$^*|4`sz-XPCtA}}J=1dq!7}@0_RH*- z*)OwSX1~mSnf)^RW%kSLm)S3~UuM6|ewqC;`(^ga?3dXuvtMSv%zl~u^5G`>$#(2^ z-R32{%zl~uGW%ur%j}ogFSB1}zwEJ{<+nVxv&?>({qi5Tf79n++5CRF+Z#SuHpe?$ z-h96||GvzAnf>xx?3dXuvtMSv%zl~uGW%ur%j}ogFSB1}f6?=P4wpB_y5_d)x}hcA z)GgiCvhL`v?rBB$^*|4`sz-XPCtA}}J=1foD+pHDudrWXzrucn{R;aP_ABgH*sri( zVZXwDh5ZWq74|DW_Z9Xl>{r;YuwP-n!hVJQ3j3AARr>?>Zu1geVZXwDh5ZWq74|Fa zSJG6cbbrPCeue!?w>NyS!hXdZ?{N9?`~Ud$-t8;wSJX9DniPrQ~&-7gDdZ8d#WxvXPmHjIFRragwSJ|(!UuD0_ewF{r>Z zvR`Gt%6^soD*ILTtL#_Vud-kLqwCh~y3I>?mHjIFRragwSJ|(!UuD0_e)Yfjn!n0^ zmHp~Z?ccQfw^j4|RragwSG&F8gH`sc>{re44wu7^JG?%8`zrfY_N#BPUuD0_ewF{r>ZvR`Gt%6|2~_?mxXVIf%3P2JLME$fc%>Yi3~Uk~(9t9qozdZINw)iXWU zx?bp|f?$pP8v8Z&YwXw9ud!cazs7!z{Tll<_G|3d*srl)W533Jjr|(?HTG-l*VwPI zUt_<+ILrud`ogzs`Q0{W|+~_Ur7|*{`!-XTQ#Vo&7rd zb@uD**V(VLUuVD0ex3dL;i~*a><_okk3FuhvtMVw{!{zI!M|HKzh7s+&VHT!I{Wpm zwYLS>ud`ogzs`RBEpxne_Ur7||HAfvXuWP;xf0ycZ7u7L?&_XabYBnjP^)^R$9keQ zJ=HTk*ScQlrCw=6L9oGogZ&2k4fY%CH`s5m-(bJNeuMo6`wjLR>^InNu-{<6!G44N z2Kx>68|*jOZ?NBBzj3(vf3W}Ydj5A`|KU!(a(#pS2K$ZwY=8JZyBnUPy}^Ei{RaCD z_8aUsy4KznV86kBgZ&2k4fY$JqkXvict6`AGnWWULNll><9P4=7YH`#Bp-(85Oy)D3gll><9P4=7YH`#A`e*T-wCi_kH zoBtc^e>~Q$#l_&ZmUTyWbx$k0uLpXlRXx&UJ<*z;>Y1KvT`%-fue71p`cy%%#eR$Z z7W*ysTkN;kZ?WHEzr}uw{TBNz_FL??*l)4lV!y?Hi~Sb+E%saNx7cs7-(tV@<5l{L zzJ6-U<9b`{x7cs7-}=w?|Geecj4k$C?6=r&vEO39#eR$ZR@d6w0_?ZgZ?WHEzr}uw z{TBNz$7cL^*ExHv4V%+w8a5Z?oTKzs-J| z{Wkk;_S@{Y*>AJo{!46*|8yVkZ#y<)+vEA$?6=u(v)^XF{U7$ExHv4VIG+;ox~*m1 z(Ouositg)y9%@yO^jJ@{rl)$Q=UUebz0@mh=(Rr8XWCQ{6xbKo7uXlr7uXlr7uXlr z7uXlr7uXlr7uXlr7uXlr7uXlr7uXlr7uXlr7uXlr7aWsSa73h@1;=C+*caFr*caFr zY@-7Ef@87@j>#%GCab`{z`nq~z`nq~z`nq~z`nq~(CrN$6xbKo7uXlr7uXlr7uXlr z7uXjZlT~m`R)KwieSv+!b6*M`BPrO91;=C+9FtXWOjf}huV9W>FvlyH;}y*D3g&nP zbG(8%Ucnr%V2)QXf4FhuMzExtx~1D%)*ao|J+0`z9_XP~^+=EPL~DAgXL_!6z0ga& z(uQ8^Q+=jQeXbxVvM;hPvM;hPvM;hPvM;hPvM;hPvM;hPvM;hPvM;hPvM;hPvM;hP zvM;hPvM;hPvM;hPvM;hPvM;hPvM=_A55h(EMfOGZMfOGZMfOGZMfOGZMfOGZMfOGZ zMfOGZMfOGZMfOGZMfOGZMfOGZMfOGZMfOGZMfOGZMfSyRZ}_0dzR14FzR14FzR14F zzR14FzR14FzR14FzR14FzR14FzR14FzR14FzR14FzR14FzR14FzR14FzR14Ferahb zxT#yZt!3TOUER})?(2abYE_T)SWmR3r+TL6TGtD`)GKZ1wLaBn+SKRzLP1bsUt(Wk zUt(WkUt(WkUt(WkUt(WkUt(WkUt(WkUt(WkUt(WkUt(WkUt(WkUt(WkUt(WkUt(Wk zUt(WkU+N7XgiGv8>`UxR>`UxR>`UxR>`UxR>`UxR>`UxR>`UxR>`UxR>`UxR>`UxR z>`UxR>`UxR>`UxR>`UxR>`UF=@Ii@viG7KEiG7KEiG7KEiG7KEiG7KEiG7KEiG7KE ziG7KEiG7KEiG7KEiG7KEiG7KEiG7KEiG7KEiG7Lv&6_uaTe_`f-O*j$(~9ovfgWmA zkMvkiw5F$ersrDM3%%4UZRoW=)o0q&=lVilDhSH#%k0bS%k0bS%k0bS%k0bS%k0bS z%k0bS%k0bS%k0bS%k0bS%k0bS%k0bS%k0bS%k0bS%k0bS%k0bS%e~=)aG8CXeVKik zeVKikeVKikeVKikeVKikeVKikeVKikeVKikeVKikeVKikeVKikeVKikeVKikeVKik zeYx8kJ}9#)T$oov7Ts6PxVaCwXPR>saM+2 zYkjKEw5iYag}&65f?$XJ4*MPUJM4GZ@37xtzr%iq{SNyb_B-r%*zd64VZXzEhy4!w z9rioyci8W+-(kPQeuw=I`yKW>?04Aju-{?7(;Ger@37xtzr%iq{SNyb_B-r%*zd64 zVZXzEhy4!w9rioyci8W+-(kPQeuw=I`yKW>?04Aju-{?7!+wYT4*MPUJKf&!!4CT! z_B-r%*zd64VZXzEhy4!w9rioyci8W+-(kPQeuw=I`yKW>?04Aju-{?7!+wYT4*MPU zJM4GZ@37xtzr+6a?c2e!?&z-WX+`(-Ko7O5M|!L$TGLZK({rusgN9QX zbA6#NwWY5V1Qqrb_7(OO_7(OO_7(OO_7(OO_7(OO_7(OO_7(OO_7(OO_7(OO_7(OO z_7(OO_7(OO_7(OO_7(OO_7(P(-ta-V!oI@3!oI@3!oI@3!oI@3!oI@3!oI@3!oI@3 z!oI@3!oI@3!oI@3!oI@3!oI@3!oI@3!oI@3!oI@3((Mf&RM=P8SJ+qBSJ+qBSJ+qB zSJ+qBSJ+qBSJ+qBSJ+qBSJ+qBSJ+qBSJ+qBSJ+qBSJ+qBSJ+qBSJ+qBSJ*EvF9&yY zSNF7{`+A^cWwpecVNHEewY0& z`(5_C?04DkvfpLD%YK*rF8f{fyX<$_@3P-zzsr7?{Vw}m_PgwN+4siZWxvaQm;EmL zUG}@|@7%c)+|@m;=)NB4p;q-skM%@rda7r7u64c8OTE&DUh7kRrcHgWFZ89h^p(EW zHwuC(`zre?`zre?`zre?`zre?`zre?`zre?`zre?`zre?`zre?`zre?`zre?`zrgY zb+59ovahnQvahnQvaj}r55iUURrXc(RrXc(RrXc(RrXc(RrXc(RrXc(RrXc(RrXc( zRrXc(RrXc(RrXc(RolMGzRJGJzRJGJzRJGZ?F}DP*;mdZ33| z)gwLD6Rqi~p6R*P^+GT8N*j8uPxYBL^|`*#m)g=-`dZ&;TR~7`Ut?cmUt?cmUt?cm zUt?cmUt?cmUt?cmUt?cmUt?cmU$YK1_BHl3_BHl3_BHl3_BHl3_BHl3_BHl3_O;&d zLAb`g#=geB#=geB#=geB#=geB#=geB#=geB#=geB#=geBW;@l`*VxzC*VxzC*VxzC z*VxzC*VxzC*Vxy(z2Soz`x^Ti`x^Ti`x^Ti`x^Ti`x^Ti`x^Ti`x^Ti`x^Ti`xEwG zl{WNRpXxJh>T`XeFSVtw^tHaxwtlT3sI#xLud}bSud}bSud}bSud}bSud}bSud}bS zud}bSud}bSud}bSud}bSud}bSud}bSud}bSud}bSud}cBh7ZDZ_I37k_I37k_I37k z_I37k_I37k_I37k_I37k_I37k_I37k_I37k_I37k_I37k_I37k_I37k_I394Zg2RY z&c4pR&c4pR&c4pR&c4pR&c4pR&c4pR&c4pR&c4pR&c4pR&c4pR&c4pR&c4pR&c4pR z&c4pR&c4pR&VFTOCAhB#dZ<-B(qlc*nx5*Jo@-q%^ir?1q1XCUpJ`K{>kECUEq$f0 z^^LamYyCz+&|u$S-(cTh-(cTh-(cTh-(cTh-(cTh-(cTh-(cTh-(cTh-(cTh-(cTh z-(cTh-(cTh-(cTh-(cTh-(cV94IhLX>>KPG>>KPG>>KPG>>KPG>>KPG>>KPG>>KPG z>>KPG>>KPG>>KPG>>KPG>>KPG>>KPG>>KPG>>KPG-QMs)gMEX2gMEX2gMEX2gMEX2 zgMEX2gMEX2gMEX2gMEX2gMEX2gMEX2gMEX2gMEX2gMEX2gMEX2gMEX2gZ=&c_k#y| zs8v1EV?EKDp6Z#NYh5q&Qm?e3*ZNeSX;Yu;3w^0AeWkDUjkfh`{YKv^2%7Ah?3?VH z?3?VH?3?VH?3?VH?3?VH?3?VH?3?VH?3?VH?3?VH?3?VH?3?VH?3?VH?3?VH?3?VH z?3?VHz2Sp!lYNtYlYNtYlYNtYlYNtYlYNtYlYNtYlYNtYlYNtYlYNtYlYNtYlYNtY zlYNtYlYNtYlYNtYlYNtYv)da!XtHmzZ?bQ)Z?bQ)Z?bQ)Z?bQ)Z?bQ)Z?bQ)Z?bQ) zZ?bQ)Z?bQ)Z?bQ)Z?bQ)Z?bQ)Z?bQ)Z?bQ)Z?b>z;6dJ1-+TkKoxTkKox zTkKoxTkKoxTkKoxTkKoxTkKoxTkKoxTkKoxTkKoxTkKoxTkKoxTkKoxTkKoxTkKox zTixF9L5qEheT#jIeT#jIeT#jIeT#jIeT#jIeT#jIeT#jIeT#jIeT#jIeT#jIeT#jI zeT#jIeT#jIeT#jIeT)6WhYy2QJnVxH1FZ5Ecw4vAfRG(>6pX&>KsV#k_ zul0?#^=th`->RVBDhT%2@3G%wzsG)${T};0_IvF2*zd95W536KkNqC|J@$L-_t@{T z-($bWevkbg`#tu1?DyF3vEO6A$9|9f9{WA^d%fX<@E-d;_IvF2*zd95W536KkNqC| zJ@$L-_t@{T-($bWevkbg`#tu1?DyF3vEO6A$9|9f9{WA^d+hhv@3G%wzt`;zAMCN; zW536KkNqC|J@$L-_t@{T-($bWevkbg`#tu1?DyF3vEO6A$9|9f9{WA^d+hhv@3G%w zzsG)${T};0_IvDCS672adaNf}(^EaubFJ%zUh0)L^je?lGi~Z~eW5S4rLXk0zR|XR zt>5Td74%#EPR>xu-Z{IRH|(8v_Sx^V_dCA*p7D3z-DkhgexLn5`+fHN?DyI4v)^aG z&wii%KKp(4`|S7G@3Y@$Z!T*-{oQx_?DyF_BdK*iIM`?Jm`E>S=Sqw^Z`wQi?DyI4 zv-f+}-`!`w&wii%KKp(4`|S7G@3Y@$zt4W3{XYAB_WSJj+3&O8XTQ(h;|bsGv)^aG z&%QVQKKuP{Z+PcQbiPLR`|S7G@3Y@$zt4W3{XYAB_WSJj+3&O8XTQ&WpZz}jefIn8 z_u22W-)FziexLn5`+fHN?DyIC#@}bZ&;HS)N5Nw~(VCv>nVxH1FZ5Ecw4vAfRG(>6 zpX&>KsV#k_ul0?#^=th`->RVB>Ua7_1wosAn|+&on|+&on|+&on|+&on|+&on|+&o zn|+&on|+&on|+&on|+&on|+&on|+&on|+&on|<55x7oMZw|m0};Wqm=`!@SF`!@SF z`!@SF`!@SF`!@SF`!@SF`!@SF`!@SF`!@SF`!@SF`!@SF`!@SF`!@TwZQo|!X5a4i zh7a28+w9xy+w9xy+w9xy+w9xy+w9xy+w9xy+w9xy+w9xy+w9xy+w9xy+w9xy+w9xy z+w9xy+w9xy+w9xyAN!amTGLZK({rusgN9QXbA6#NwWY80wZ74|ey!i= zTlIdv{9FA_|ES*29G#Vzz4P=rSKvGE9I!uN@AvvUx4^sa9&}_6O__ z*dMSzV1K~=zCx4-*0cVOMS-Gkon&JW7oxf0(w zV1K~=fW31oynDd@fc*jc1NH~(57-~DKVW~r{($`f`vdj|w$lOo1NH~(57-~D_ZZ@L z2kZ~nAF%f|=lk&wy1n6@AJsWp*&nb!V1K~=fc*jc1NH~(57-~DKVW~r{($`f`vdj| z><`!<*q#UM57-~DKVW~r{($`f`vdj|><_;Gx@Q}(fAZu>u%@SarsrDM3%%4UZRoW= z)o0q&=lVilYD-_~Yki|_{aU}#w<_qj`knq!Mg5b4pu@hyzQex5zQex5zQex5zQex5 zzQex5zQex5zQex5zQex5zQex5zQex5zQex5zQex5zQex5zQev_+jrP^dcz0d4*L%K z4*L%K4*L%K4*L%K4*L%K4*L%K4*L%K4*L%K4*L%K4*L%K4*L%K4*L%K4*L%K4*L%K z4*QOMuhZ=fA9UDv*mu}>*mu}>*mu}>*mu}>*mu}>*mu}>*mu}>*mu}>*mu}>*mu}> z*mu}>*mu}>*mu}>*mu}>?E4+|Yin!4Q$5pjt?Pwe>XkP1TA%7OZR&GN{QbUG`n}&ZqKjmwlIgmwlIgmwlIgmwlIgmwlIgmwlIgmwlIg zmwlIgmwlJLpBsGFW#47rW$*ip17CB#f4*pM3$X99@3QZ*@3QZ*@3QZ*@3QZ*@3QZ* z@3QZ*@3QZ*@3QZ*@3QZ*@3QZ*@3QZ*@3QZ*@3QZ*@3QZH|8=h$Jbn5!c&6uC*9*PW vD{bhtKGkR1)aUv_UusKV>1%zXZT(um(YGq-xB8v_QAPce{-^%=>C^uYdwUG* literal 0 HcmV?d00001 diff --git a/Tests/test_file_bmp.py b/Tests/test_file_bmp.py index 5fc6d9f36..ec651ae8c 100644 --- a/Tests/test_file_bmp.py +++ b/Tests/test_file_bmp.py @@ -90,3 +90,15 @@ class TestFileBmp(PillowTestCase): self.assertEqual(reloaded.format, "DIB") self.assertEqual(reloaded.get_format_mimetype(), "image/bmp") self.assert_image_equal(im, reloaded) + + def test_rgba_bitfields(self): + # This test image has been manually hexedited + # to change the bitfield compression in the header from XBGR to RGBA + im = Image.open("Tests/images/rgb32bf-rgba.bmp") + + # So before the comparing the image, swap the channels + b, g, r = im.split()[1:] + im = Image.merge("RGB", (r, g, b)) + + target = Image.open("Tests/images/bmp/q/rgb32bf-xbgr.bmp") + self.assert_image_equal(im, target) diff --git a/src/PIL/BmpImagePlugin.py b/src/PIL/BmpImagePlugin.py index 19aa6db29..53020b86d 100644 --- a/src/PIL/BmpImagePlugin.py +++ b/src/PIL/BmpImagePlugin.py @@ -180,6 +180,7 @@ class BmpImageFile(ImageFile.ImageFile): SUPPORTED = { 32: [(0xff0000, 0xff00, 0xff, 0x0), (0xff0000, 0xff00, 0xff, 0xff000000), + (0xff, 0xff00, 0xff0000, 0xff000000), (0x0, 0x0, 0x0, 0x0), (0xff000000, 0xff0000, 0xff00, 0x0)], 24: [(0xff0000, 0xff00, 0xff)], @@ -188,6 +189,7 @@ class BmpImageFile(ImageFile.ImageFile): MASK_MODES = { (32, (0xff0000, 0xff00, 0xff, 0x0)): "BGRX", (32, (0xff000000, 0xff0000, 0xff00, 0x0)): "XBGR", + (32, (0xff, 0xff00, 0xff0000, 0xff000000)): "RGBA", (32, (0xff0000, 0xff00, 0xff, 0xff000000)): "BGRA", (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", (24, (0xff0000, 0xff00, 0xff)): "BGR", @@ -200,7 +202,7 @@ class BmpImageFile(ImageFile.ImageFile): raw_mode = MASK_MODES[ (file_info["bits"], file_info["rgba_mask"]) ] - self.mode = "RGBA" if raw_mode in ("BGRA",) else self.mode + self.mode = "RGBA" if "A" in raw_mode else self.mode elif (file_info['bits'] in (24, 16) and file_info['rgb_mask'] in SUPPORTED[file_info['bits']]): raw_mode = MASK_MODES[