From ecfbff8197ca77dcf56f5ddeb706138ff61b1fe8 Mon Sep 17 00:00:00 2001 From: Mirco Miranda Date: Tue, 5 Nov 2024 06:36:18 +0000 Subject: [PATCH] PCX: support for more formats Added support for: - (R/O) 1 bit, 3 planes (ICONDOC.pcx) -> test case from internet archive - (R/O) 2 bits, 1 planes (CGA_FSD.pcx) -> test case from internet archive - (R/W) 8 bits, 4 planes (dice_rgba.pcx) -> supported by ImageMagick and GIMP 3 Fix write support for: - Grayscale 8/16-bits (saved as indexed) - Alpha 8 (saved as indexed) - RGB 16-bits depth (saved as RGB 24/32) --- autotests/read/pcx/CGA_FSD.pcx | Bin 0 -> 13615 bytes autotests/read/pcx/CGA_FSD.png | Bin 0 -> 10151 bytes autotests/read/pcx/ICONDOC.pcx | Bin 0 -> 34940 bytes autotests/read/pcx/ICONDOC.png | Bin 0 -> 8808 bytes autotests/read/pcx/dice_rgba.pcx | Bin 0 -> 6279 bytes autotests/read/pcx/dice_rgba.png | Bin 0 -> 4822 bytes autotests/write/rgba.pcx | Bin 0 -> 1896 bytes src/imageformats/pcx.cpp | 108 +++++++++++++++++++++++++------ 8 files changed, 89 insertions(+), 19 deletions(-) create mode 100644 autotests/read/pcx/CGA_FSD.pcx create mode 100644 autotests/read/pcx/CGA_FSD.png create mode 100644 autotests/read/pcx/ICONDOC.pcx create mode 100644 autotests/read/pcx/ICONDOC.png create mode 100644 autotests/read/pcx/dice_rgba.pcx create mode 100644 autotests/read/pcx/dice_rgba.png create mode 100644 autotests/write/rgba.pcx diff --git a/autotests/read/pcx/CGA_FSD.pcx b/autotests/read/pcx/CGA_FSD.pcx new file mode 100644 index 0000000000000000000000000000000000000000..242429a608dd91550366fc6beedea481101497de GIT binary patch literal 13615 zcmY+L4{V#~o!?(mYWG$aBGYxYwCk|fk8S}=8M10_s3&Tolgg=!3(zQa?pmP3(p;9@ z-3|zL#d^0txG-n3b^t}fgHpEQ~4UCo`-TQTMW4_8?Zy~oWjCd zL)1v0d1yUT5%>AMbbDB1Q55+;zyH7Q@Av$krxPDL60`VU=Ex1}+>vd0YYm4(`5As; z{_9_S{;B6KeCZ2c`TBEDKmWp4E`0q9UwrDHJoA;M+2_9SRm;kK|1f49dCodwZS!MU zKmM9!eZu-%zuS*}%PM^TRqMF*E$b>jG5$OJ;&1S7^Ov7K^VWa+{{Q~?x2&I7j(1ZP zO`#E%bXO0;g5ThMe%o_xW#6`JKi|mOg$b231>-deYVld!G+n*V!|ng5Z|gtTyJvMv zHyd4VTRE=n-nO#VE4F1~i^0`mjmPe&u&xjF_F6rxn2fo`+Fm%zkE!dS-Ve4t->3wv z+&3-TvDYVD{lJNxTG88{s-~gM^Q?bh`uaz@Ij#Fuy91r0+sMmDsOaY#l#*V%CN6I?oA9b%fG22&(b=_Xjy|fwXgWr*dvDg421KuOV zHO#l|0wF_L!NKz10L__c7s2A=_;ZH?u7@VY=fZdp{qBk`dCz~(Gs+qh`dik5 zmC>8V(wk#?^L+p=r(ddytg$pVYR3q=C3w_ z1`-Jc-Pp1wAN|&wElWLpG<(#YJxbhpCWqF#cUp{C(;tZ)2N?*~_0JkZvtRX9G4Ff6 z9c-ycm=UG1Eyy9&k*uYEyq55=ZlF%-yF}~Yk(zDYPwD@we~vc$$l4aWi;u9f@yb;% zFv{K%@fu@Ox^GIn5H_JZlvARpL8g0-s; z>iRxXbuyUm{W^9;^TXGXmCy)%llNxyo~PXFBS|6MFq0zm6jU3NFltBSZ(7bty{Tpr zUhe3MHnwy5${AcUI1T%D6~zx=BmN(`{YGQBp!cdKP%CSJKXH9zTQiq3lllPacq<~_ z)D$F}UA~NtM7J+aS z0Adl58iO=gYzGoGtG?YqDvX$y=6V8AqbUOByxHvx7x>!ICW!9<<;OQ-2*1Mckh51PP<6 z#zVmOtT`cZQ()QlY=a3-%k=ESI<*FXJ--@87tZ?Bs43i@uK>;_Qc=v_7K>pKbjv7=kz%o(gI=IV>_ z5E?Z?zS|bw{nx}OTf>^@fwk5n35+#`-|sc>{r|MavbJ~Bc5`L}Du=q43H1ZrWobn| z*wuZCMB5DOSW=)>kg-=u2C9^l=pVDp-2Wnjp7zv=m)E;j9@E{`l)kI?@#>Ip5jV0b z7ZD#oC6qtKJ9WJcxOqXo@rcf!S+1u%x1d|6s(Lq#*}*Z;SSru}Ia1J|BvewOC{)DR zNG1`&&p=>x&-Q^gOZOM_L5hGg?K#0qfCh)*xE;&ZcM3Bry15orr&h(J7Bg5M3juXP zIL%8GeaLQxDRbE1yKYql>q#WF#-=9c79>$fbe?Niqz+j#H#v99icJF}Gl+Zn%30L! z8PZ04)2XLZRs8x$WKjYK!AmM4fg-3q(0hg4Y!JgqmKmD_QUpRaB`<|XlZ=v}ixdbF zE8c1-g+}*r5{7DG03jth?Cas_G{yo~1O)~q5&?rR3OMW)OZx8Bgz+Bn07-q3r0GwAW?_~ z^Bcig*mXmiI0+J>gBW_q>OmRX)a6YD%k(m$S_Q|iq3JD8nf%q;Na5M}(&bX7Tw^(K z(~=+%N)i-xJ{9G_8w8XOqn|oR9z9py@EzYI=}`lfr(2}l?%@JN*~RIo6q;Vhqx}kE zg^+?lM7|DU-~!aGRgrbi@s%4~w-&YpkZC*)2w#4Hbzs>|D&1Kr3(K%l7D4KKi8+zb z^n@ay5fL7xARQZW(vgH>7vrhq#C2=(I@v*4HvkDdpxmILDdmu%U$2?2SPv`LS%$uE1ny`I>zQ&`tL72u>R(d?eI@f!k*t2ASf%OgAnJzhvR>4epcfi^7zJug z0!--Q6rv6Hi2wIMizIM2q_{RSW(s85%uFFFDQ7`_OSxwubsq#0+jdf+>9STVEWSD9 z2TP0pBPMX@Mg_B5NtX~gYmG%+!Gb_sgmz+&IjDm~z{R%J@ciVe?v{o6z;sLEGYl~@ zv;<@i#3!}}^wC>H8o&7ir&Bo}5ueoeGC+`dL>aSy*igpQHL(O{6;pSr@-Bl>L9SF3;a3_P!1yoUfwT-Igu$$uj>xc-N6bH zB{)^Yt%I3|&?f)I<_5#`(qR#}Ad>MWU6ldyGx{FCHu+2%DKt9J_ik9W=Lba09UxgC zV}Io|;?~oKhDQQYVwu3xy?GHh6MfKvDOLn0I)Wrn7 zy7WF#&5z<_F(j=eR|s&TgyKW6?nxQ>04v1<28~P&}$cOYB^+Cmq5dy(SduP2vG_Rital~<&3zW@C|DygemKY&`V>-$PS_x(O%MfQ5sU47bXR1rB{mjrp>82 zc^7r@Y{T?D798&;BP`HyKn!5T9XukPl7vMM*R~@h7UjZLP;7Rbbivhw_m%KApG(G98OU4+Leyxf8$_Nmkt1+dw-Lss_g4`~8M)CBsZ zHIn89tV&54ctn)$m#Evr^#Tzil$G&s( z153@KT5f(htLZ%WB|$0~!mLCv zMbb3t!TER)sR`LGecWD=EG^Sa!%Admr^B08=6_fdgz%LJW@V-|>RG0tR6<-}i_ihd zXi!S}5D4m5GNuP3B)mU++Y0n821-a#!>)uJJq6*_lbKjO3OY&RU1g@vZoqV(?{Q;@ z%q@0sHQmh3Mj=C&Mb!36Jkd(Yj0zhzhv|9a>FsY{`P=DK{hB;iyKS+DAQ{WF>_>mx+c$&Ej%LUV8rNW3N?ANW(?-e?%k^&Zf$E7Jl#!>*0I}&p=UPXdt^@-hWj2 zT_aP;r=L1GerahE$5397qrG70-5C;1?;yMro65C7A@k-nVk|0#|jC@(|(YaZp&SLz9@>8h%gz z6x9E{Klsg;t%8$%VVLwIV>;91*-XDdpTiZgQc8&GyL=YzqOJ1yQ6K7E~l> zh{nh$UGC5IpP5Ux7gLTJH^&-Fad|wfMigb+J*0JtNaBn4tpvMWv=d^4=75Cjhxl{P zPn{(gT73Mouj#+gAN}61|BJ6(IvI;QG?L@rIC-QIe>yFuZ~a1bem_!uGE$w*NSH!# z8W_`~2c_pKBnrX$bo$*__2I>HX6cf3;gZ`>_7mgr6J}}o(rczt6Dlk@n36YBG#uu@ zWX9gNW~<236IENhh@cNmcQ)@%*UOCB^ha;U&p-acuN_w>y*=VsAoLwYc_!S1eDhcWmXeUoxG|Tamj`z;Xu1YBTn9w+}d@@r>FOEo5 zbcZ2{>6F8DAxxFuzv{6SDJt8XH;-R@UY$H*U%*1nrKh&yOBeo`M2+rSQ-5yhol^vY zL~B|wWL9_B;jLB@2>bTquw~J�gZ-waj=Ue(d;Ty31tvwpG)+0x%uYt-o4|*gnt? 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 AVgLXD literal 0 HcmV?d00001 diff --git a/autotests/read/pcx/CGA_FSD.png b/autotests/read/pcx/CGA_FSD.png new file mode 100644 index 0000000000000000000000000000000000000000..1820198ce1a1b58a79c2b792a41653485f6dcc58 GIT binary patch literal 10151 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 VEe9C>GvxpP002ovPDHLkV1kpWe%b&4 literal 0 HcmV?d00001 diff --git a/autotests/read/pcx/ICONDOC.pcx b/autotests/read/pcx/ICONDOC.pcx new file mode 100644 index 0000000000000000000000000000000000000000..64e78e81c16c2cc44eb421d2c8fdce3796fca9e9 GIT binary patch literal 34940 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 literal 0 HcmV?d00001 diff --git a/autotests/read/pcx/ICONDOC.png b/autotests/read/pcx/ICONDOC.png new file mode 100644 index 0000000000000000000000000000000000000000..adf574f64c42c0983d8ebab64ce08a45c6d911aa GIT binary patch literal 8808 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

%&G`)Dw=Jy#W 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 literal 0 HcmV?d00001 diff --git a/autotests/read/pcx/dice_rgba.png b/autotests/read/pcx/dice_rgba.png new file mode 100644 index 0000000000000000000000000000000000000000..88c53a8c49362d246a28dbacd96da27d9b497e30 GIT binary patch literal 4822 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 literal 0 HcmV?d00001 diff --git a/autotests/write/rgba.pcx b/autotests/write/rgba.pcx new file mode 100644 index 0000000000000000000000000000000000000000..b0b22c78f84eb4bd216be4b2af0597e2d426b9f6 GIT binary patch literal 1896 zcmb7FYfuwc6y6jfL1V;11gQuzR?rG9s2RpbapWJ^}e!Bc@^nLHQ%gr1Y$?g@pn znK_MM(IJ6jZNt|I_%?)V!zY4q6I`5y_D=R(9n+3O!$5;i7@UVk021h^NGaM5zr$rP zVxW^$hWok^9G>T~N*r}WR_O1-4^h`>R1&xW{ptmdGzDBu7q5@UP9|kYLUv{zbi=I* z&zWnpr;H8(fL^c=WZ6uazam+ZCfO1Z92Ai(k;*DtRTahcMItU?FpCBH^IcNlK0H)P z;pRbEo*a6h6Q05|)z3L!&16N`&Wc;I<>0nl@2RdS0A--hD}a~KCl`*>VG1xqcTxQJ zneaFC$QGx|QsvmcE5p$z`CFbK4W7VrDn!SOT2v1PxDGwKUib^2m!S*(fQRrHm6|Zg zTX+ov@DIF!=eq*RT{5z#-TO3I8&Nmn~N!4H-CYvPOH_^m{_n4UzwC^$?gPuj@KUVp!#ahPlDhI8LrgA zikfn{G)*cmuWmpyzJ;zFX~xdTh}B4(b#8y_#^OW2z}ZHkU%9Vl*(~Bl zP0MjY(`Ln$wZS#?CxP~w^qL&F36{1F>Kk)w@}3mdxG|YK+<10l7x;>_V02~t3EH-u z86|WQ+UW##Lg!$d=g_HXM8GFDw$@f09dn5Z4GWkXwb6(OH$ori57jmqnNH@@Kv`TE zjq<+1;=U+#pg1%rGCMkGgnRaIts;j~m+ns8UqypfbI|`oCnnP1TFK7+B_quHXpom! zcq46>CPa&uuB3?LiE|lJe@5v-XL~RI5&FNlmVJ1=q3uRxgSJ#ok@Y;>OoMe!6i@XD zUFYw?@{QWcY!#ei@okiP2MvZhhqk!^=t;BEk>ZNOC*ka|atg!6Wbsll+u_{lBe^Od zEIIH!S*toMJF214NFokj6+zL4q%Bz_iDd>MbD)|{OB4lLW8-La4Ou4+Ttw04jY+v> z>_|2d=#*FGLK?*lqHEREmQh^W0MJshn?j+>gvs-lQN&Nit!k3nQLM-$G3g45(6x`q zQ+)G;w!9aT^#R@#2_&RfDxiqC6G!6Ca`jE5pb7L8pU{$S?Fp8dMtaj&rcW^WF4%|0 zL|(+fOT_juxA%ehL!PFETy9~f&vzis4t$oUZzczthjRxJIot-c~TimJ-o# z07IHdGM^^^k<2U zZMZ78;K4B0z8IeWI@8L)bTM{gY%e0yW8Q3E!ZJ}yFMcrl37eHG+7&(?liovWJGvL| S7JBCjcpT&Z{$}t0ZT|rp;FJmg literal 0 HcmV?d00001 diff --git a/src/imageformats/pcx.cpp b/src/imageformats/pcx.cpp index c34c1de..fd04334 100644 --- a/src/imageformats/pcx.cpp +++ b/src/imageformats/pcx.cpp @@ -92,12 +92,18 @@ public: fmt = QImage::Format_Mono; } else if (Bpp == 1 && NPlanes == 4) { fmt = QImage::Format_Indexed8; + } else if (Bpp == 1 && NPlanes == 3) { + fmt = QImage::Format_Indexed8; } else if (Bpp == 4 && NPlanes == 1) { fmt = QImage::Format_Indexed8; + } else if (Bpp == 2 && NPlanes == 1) { + fmt = QImage::Format_Indexed8; } else if (Bpp == 8 && NPlanes == 1) { fmt = QImage::Format_Indexed8; } else if (Bpp == 8 && NPlanes == 3) { fmt = QImage::Format_RGB32; + } else if (Bpp == 8 && NPlanes == 4) { + fmt = QImage::Format_ARGB32; } return fmt; } @@ -346,7 +352,7 @@ static bool readImage1(QImage &img, QDataStream &s, const PCXHEADER &header) static bool readImage4(QImage &img, QDataStream &s, const PCXHEADER &header) { - QByteArray buf(header.BytesPerLine * 4, 0); + QByteArray buf(header.BytesPerLine * header.NPlanes, 0); QByteArray pixbuf(header.width(), 0); img = imageAlloc(header.width(), header.height(), header.format()); @@ -371,7 +377,7 @@ static bool readImage4(QImage &img, QDataStream &s, const PCXHEADER &header) return false; } - for (int i = 0; i < 4; i++) { + for (int i = 0; i < header.NPlanes; i++) { quint32 offset = i * header.BytesPerLine; for (int x = 0; x < header.width(); ++x) { if (buf[offset + (x / 8)] & (128 >> (x % 8))) { @@ -397,6 +403,49 @@ static bool readImage4(QImage &img, QDataStream &s, const PCXHEADER &header) return true; } +static bool readImage2(QImage &img, QDataStream &s, const PCXHEADER &header) +{ + QByteArray buf(header.BytesPerLine, 0); + + img = imageAlloc(header.width(), header.height(), header.format()); + img.setColorCount(4); + + if (img.isNull()) { + qWarning() << "Failed to allocate image, invalid dimensions?" << QSize(header.width(), header.height()); + return false; + } + + for (int y = 0; y < header.height(); ++y) { + if (s.atEnd()) { + return false; + } + + if (!readLine(s, buf, header)) { + return false; + } + + uchar *p = img.scanLine(y); + if (!p) { + return false; + } + + const unsigned int bpl = std::min(header.BytesPerLine, static_cast(header.width() / 4)); + for (unsigned int x = 0; x < bpl; ++x) { + p[x * 4] = (buf[x] >> 6) & 3; + p[x * 4 + 1] = (buf[x] >> 4) & 3; + p[x * 4 + 2] = (buf[x] >> 2) & 3; + p[x * 4 + 3] = buf[x] & 3; + } + } + + // Read the palette + for (int i = 0; i < 4; ++i) { + img.setColor(i, header.ColorMap.color(i)); + } + + return (s.status() == QDataStream::Ok); +} + static bool readImage4v2(QImage &img, QDataStream &s, const PCXHEADER &header) { QByteArray buf(header.BytesPerLine, 0); @@ -504,6 +553,7 @@ static bool readImage24(QImage &img, QDataStream &s, const PCXHEADER &header) QByteArray r_buf(header.BytesPerLine, 0); QByteArray g_buf(header.BytesPerLine, 0); QByteArray b_buf(header.BytesPerLine, 0); + QByteArray a_buf(header.BytesPerLine, char(0xFF)); img = imageAlloc(header.width(), header.height(), header.format()); @@ -528,11 +578,13 @@ static bool readImage24(QImage &img, QDataStream &s, const PCXHEADER &header) if (!readLine(s, b_buf, header)) { return false; } + if (header.NPlanes == 4 && !readLine(s, a_buf, header)) { + return false; + } - uint *p = (uint *)img.scanLine(y); - + auto p = reinterpret_cast(img.scanLine(y)); for (unsigned int x = 0; x < bpl; ++x) { - p[x] = qRgb(r_buf[x], g_buf[x], b_buf[x]); + p[x] = qRgba(r_buf[x], g_buf[x], b_buf[x], a_buf[x]); } } @@ -571,7 +623,7 @@ static bool writeLine(QDataStream &s, QByteArray &buf) static bool writeImage1(QImage &img, QDataStream &s, PCXHEADER &header) { if (img.format() != QImage::Format_Mono) { - img = img.convertToFormat(QImage::Format_Mono); + img.convertTo(QImage::Format_Mono); } if (img.isNull() || img.colorCount() < 1) { return false; @@ -591,7 +643,7 @@ static bool writeImage1(QImage &img, QDataStream &s, PCXHEADER &header) QByteArray buf(header.BytesPerLine, 0); for (int y = 0; y < header.height(); ++y) { - quint8 *p = img.scanLine(y); + auto p = img.constScanLine(y); // Invert as QImage uses reverse palette for monochrome images? for (int i = 0; i < header.BytesPerLine; ++i) { @@ -627,7 +679,7 @@ static bool writeImage4(QImage &img, QDataStream &s, PCXHEADER &header) } for (int y = 0; y < header.height(); ++y) { - quint8 *p = img.scanLine(y); + auto p = img.constScanLine(y); for (int i = 0; i < 4; ++i) { buf[i].fill(0); @@ -652,6 +704,13 @@ static bool writeImage4(QImage &img, QDataStream &s, PCXHEADER &header) static bool writeImage8(QImage &img, QDataStream &s, PCXHEADER &header) { + if (img.format() == QImage::Format_Grayscale16) { + img.convertTo(QImage::Format_Grayscale8); + } + if (img.isNull()) { + return false; + } + header.Bpp = 8; header.NPlanes = 1; header.BytesPerLine = img.bytesPerLine(); @@ -664,7 +723,7 @@ static bool writeImage8(QImage &img, QDataStream &s, PCXHEADER &header) QByteArray buf(header.BytesPerLine, 0); for (int y = 0; y < header.height(); ++y) { - quint8 *p = img.scanLine(y); + auto p = img.constScanLine(y); for (int i = 0; i < header.BytesPerLine; ++i) { buf[i] = p[i]; @@ -681,7 +740,10 @@ static bool writeImage8(QImage &img, QDataStream &s, PCXHEADER &header) // Write palette for (int i = 0; i < 256; ++i) { - s << RGB::from(img.color(i)); + if (img.format() != QImage::Format_Indexed8) + s << RGB::from(qRgb(i, i, i)); + else + s << RGB::from(img.color(i)); } return (s.status() == QDataStream::Ok); @@ -689,15 +751,16 @@ static bool writeImage8(QImage &img, QDataStream &s, PCXHEADER &header) static bool writeImage24(QImage &img, QDataStream &s, PCXHEADER &header) { + auto hasAlpha = img.hasAlphaChannel(); header.Bpp = 8; - header.NPlanes = 3; + header.NPlanes = hasAlpha ? 4 : 3; header.BytesPerLine = header.width(); if (header.BytesPerLine == 0) { return false; } if (img.format() != QImage::Format_ARGB32 && img.format() != QImage::Format_RGB32) { - img = img.convertToFormat(QImage::Format_RGB32); + img.convertTo(hasAlpha ? QImage::Format_ARGB32 : QImage::Format_RGB32); } if (img.isNull()) { return false; @@ -708,15 +771,17 @@ static bool writeImage24(QImage &img, QDataStream &s, PCXHEADER &header) QByteArray r_buf(header.width(), 0); QByteArray g_buf(header.width(), 0); QByteArray b_buf(header.width(), 0); + QByteArray a_buf(header.width(), char(0xFF)); for (int y = 0; y < header.height(); ++y) { - auto p = (QRgb*)img.scanLine(y); + auto p = reinterpret_cast(img.constScanLine(y)); for (int x = 0; x < header.width(); ++x) { - QRgb rgb = *p++; + auto &&rgb = p[x]; r_buf[x] = qRed(rgb); g_buf[x] = qGreen(rgb); b_buf[x] = qBlue(rgb); + a_buf[x] = qAlpha(rgb); } if (!writeLine(s, r_buf)) { @@ -728,6 +793,9 @@ static bool writeImage24(QImage &img, QDataStream &s, PCXHEADER &header) if (!writeLine(s, b_buf)) { return false; } + if (hasAlpha && !writeLine(s, a_buf)) { + return false; + } } return true; @@ -781,13 +849,15 @@ bool PCXHandler::read(QImage *outImage) QImage img; if (header.Bpp == 1 && header.NPlanes == 1) { ok = readImage1(img, s, header); - } else if (header.Bpp == 1 && header.NPlanes == 4) { + } else if (header.Bpp == 1 && (header.NPlanes == 4 || header.NPlanes == 3)) { ok = readImage4(img, s, header); + } else if (header.Bpp == 2 && header.NPlanes == 1) { + ok = readImage2(img, s, header); } else if (header.Bpp == 4 && header.NPlanes == 1) { ok = readImage4v2(img, s, header); } else if (header.Bpp == 8 && header.NPlanes == 1) { ok = readImage8(img, s, header); - } else if (header.Bpp == 8 && header.NPlanes == 3) { + } else if (header.Bpp == 8 && (header.NPlanes == 3 || header.NPlanes == 4)) { ok = readImage24(img, s, header); } @@ -832,11 +902,11 @@ bool PCXHandler::write(const QImage &image) auto ok = false; if (img.depth() == 1) { ok = writeImage1(img, s, header); - } else if (img.depth() == 8 && img.colorCount() <= 16) { + } else if (img.format() == QImage::Format_Indexed8 && img.colorCount() <= 16) { ok = writeImage4(img, s, header); - } else if (img.depth() == 8) { + } else if (img.depth() == 8 || img.format() == QImage::Format_Grayscale16) { ok = writeImage8(img, s, header); - } else if (img.depth() >= 24) { + } else if (img.depth() >= 16) { ok = writeImage24(img, s, header); }