From 2bdfa4fccb7a1914271aae65db02557cef82555c Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Wed, 26 Aug 2015 10:33:01 +0200 Subject: [PATCH] TMI-TIFF: Better ICC profile support + more BitsPerSample configurations. --- .../imageio/plugins/tiff/TIFFImageReader.java | 16 ++++++++++++---- .../plugins/tiff/TIFFImageReaderTest.java | 2 ++ .../src/test/resources/tiff/lzw-rgba-4444.tif | Bin 0 -> 4008 bytes .../test/resources/tiff/lzw-rgba-padded-icc.tif | Bin 0 -> 8790 bytes 4 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 imageio/imageio-tiff/src/test/resources/tiff/lzw-rgba-4444.tif create mode 100644 imageio/imageio-tiff/src/test/resources/tiff/lzw-rgba-padded-icc.tif diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReader.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReader.java index 781df46a..b52d977b 100755 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReader.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReader.java @@ -435,6 +435,11 @@ public class TIFFImageReader extends ImageReaderBase { return ImageTypeSpecifiers.createBanded(cs, new int[] {0, 1, 2, 3}, new int[] {0, 0, 0, 0}, dataType, true, extraSamples[0] == 1); } } + else if (bitsPerSample == 4) { + long[] extraSamples = getValueAsLongArray(TIFF.TAG_EXTRA_SAMPLES, "ExtraSamples", true); + + return ImageTypeSpecifier.createPacked(cs, 0xF000, 0xF00, 0xF0, 0xF, DataBuffer.TYPE_USHORT, extraSamples[0] == 1); + } // TODO: More samples might be ok, if multiple alpha or unknown samples default: throw new IIOException(String.format("Unsupported SamplesPerPixels/BitsPerSample combination for RGB TIFF (expected 3/8, 4/8, 3/16 or 4/16): %d/%d", samplesPerPixel, bitsPerSample)); @@ -714,7 +719,8 @@ public class TIFFImageReader extends ImageReaderBase { int tilesAcross = (width + stripTileWidth - 1) / stripTileWidth; int tilesDown = (height + stripTileHeight - 1) / stripTileHeight; - WritableRaster rowRaster = rawType.getColorModel().createCompatibleWritableRaster(stripTileWidth, 1); +// WritableRaster rowRaster = rawType.getColorModel().createCompatibleWritableRaster(stripTileWidth, 1); + WritableRaster rowRaster = rawType.createBufferedImage(stripTileWidth, 1).getRaster(); Rectangle clip = new Rectangle(srcRegion); int row = 0; @@ -1563,17 +1569,19 @@ public class TIFFImageReader extends ImageReaderBase { return value; } - private ICC_Profile getICCProfile() { + private ICC_Profile getICCProfile() throws IOException { Entry entry = currentIFD.getEntryById(TIFF.TAG_ICC_PROFILE); if (entry != null) { byte[] value = (byte[]) entry.getValue(); - ICC_Profile profile = ICC_Profile.getInstance(value); try { + // WEIRDNESS: Reading profile from InputStream is somehow more compatible + // than reading from byte array (chops off extra bytes + validates profile). + ICC_Profile profile = ICC_Profile.getInstance(new ByteArrayInputStream(value)); return ColorSpaces.validateProfile(profile); } - catch (CMMException ignore) { + catch (CMMException | IllegalArgumentException ignore) { processWarningOccurred("Ignoring broken/incompatible ICC profile: " + ignore.getMessage()); } } diff --git a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java index f5e02935..a6cd4b47 100644 --- a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java +++ b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java @@ -85,6 +85,8 @@ public class TIFFImageReaderTest extends ImageReaderAbstractTest9UDx@sQmr)@q zgqbndSS~fvMXMp%BHLAx>Zk9wd++!6J>TE?o!2?<_wzho%lnV_d7SfdaRG<`AYn!W zaBh}c6r{vcC`a6y0?pM>Olp9;WreqaVg>~apaCcj!|bAw0VOg4gJe=VaNHC(j3g8+ z0=BR~S~*=>rcGS2ZMX}M86X_ojiQ4|`;{VM#Ze3~=>mr(bgPy(Dg{!CJ^+}3pa3wq zt2HJ*Qhe)GjO4JM8zq#`e^H; zI;w(`D4(TZiZ4jwF(VV98kd3+W-%Avjc>eBsoZGch$Y7zx9HR4`6+?}l0Z=Lg~8?F z4rHAb0PdeixnQy2a0}f7JZlOmOieUb7GGutR}<;+m;D+7O4}b@&0XCRQTTS3?N@k3 zT-MICUy}sz{ySI8Yg}BT!^H1{;;2%UgDr}hvhN%7gHi3h0RX2UxZlw!z)U9^v=r2L2?#9DGMuJzBNim zXy`E+R5)J8L8}d^wuU?*&5tQK4$px#81icNW`cd5J|mDZv@MUBR=N-QbGP2P58XWf zKD!c3Ra58I8?~1yWOcB3ijucA+@X#Y@tyKRZHU9Etv$A}PE90}l z1E8z)v34;{vFozEg{Ncv`{e1+Sy#USG#KahsmSeC4D*g8nJ2x6rorX4cxjYjJB|DAX928<1&!%@*7-JzOEf%E#Da0Tu zyO_^D(2Z9GjN~vN|5RyufsJM7t4CrVWBfg%5BZRz;VOA}8JB5IF~%*wTliLsPB%{C zFFW9=9deSqg4Zg&(zu(9N-y8~TI&g17J#E5veP>DPrd4@8267Tr^G_ZOneHNjTz7N zRhwdq$sdF(bW^?3mW|&kZBt+M@~Hl)%VQTSU=M$H^$I;za;`{d`88t$BQ;fM*tIf% z=q)fqjCmTOk6|=MTCJGKB`-ojOW5Nl64nz>#XxAMnJLQ3wSA>VAe=Mx4NoGTl&=Rn zZL7WeQw(ORv<=%dX4c^!B(W1mgt@=8PO&UWS@gD`u-XSZ)*Q}&Y#gAU;=WaNsNW#l zT!0!EZimzPYH!*Sx>i%_FO_p5f>Q4VgB>N9MT$-BL*L;0X1SJ)oUd%j_JF3^ObfnY0X8JuBmaDU_wQS_vSwcg|DtO@4m+!9>57rAL z(ZvmwXHMKk1k5;64wl;aIpr_yRRDC#Zd66dWQ?7^FSi}>L0e}u&d)gflGx8F3Sk*4 zHv{vkDasFZ&ag&e*#WKZlw!H(Kxd1$7)_2nmoq=|Ta8rtY`5Z&vcT?QQjf$W4D&2M zhB?HwGd$*aL5)goKD^D{+WeJG@{)|vLIEmz@~+6Y<(t3Tt1hXxea}aB&zcTO(z6%Z zu9n=W3ezuFH=c2f$K9Ja=HiUI67qhbsGF$RZ(x|j+hD(D*C)bvaoUFS#jkiFOv2#Q zZTO_ok%txM`wYH5=vB`wH|{%5TZ@gxe?j}sq=)9bmhW2g9e?JTAr|URRf=3Z(BBa*k|YyQgOseVU{q zRPwnUXsuUn=0Ud&r9052yw7A&&JV#)R2MVYq0uqLt;z|bvr@3CMsrR-w#ukVwODdR zcb^ltl{fcr`j~GyeW?4zp^(pm_n6@wxP4ue5gU4wd?o*E{sHk9uTJ~FdUn$|;inIf zFE>l(*IaR*dllw0=c{AJCVNJDM^iSe_cxWR+XnSb*h&qT-0QzOMpa2YX_I(AT+L~~ zKHo0=;XbQ7*C#~JCy13b+^~#K7tOZ$xg75c=>RLa;99SwPP%Foo%UT*nM<;$)jIq* z=HR*wimUVB#eszA5b){5i~t4hg3C_-eO*C|HfJ@ z`ch`7gL>M1iw9fjoB6HQ6*8rzMaVnYBu%9oZ#_(YckuW82O)}gThn~!6YYBmf{)2! z$TZkDRi+y3jDW}K(D45nRe!+Fqu6!k_^&^`vOdh2cFZX10Lu?3U5OtiJghiuxSmeP zM_+S%x~d@yQH;;IYNj3C(sFj=VzYQy+jd>V)usiOt>6!h_0RdUp(YD8mqq>YV`y?$ zyVeu-qUm&T|C?yCXXvx1#Fm(hgDe>UUDBxEB5lknX?z;qxDa@t|CHDQ3m%ysSYM-T zcoOGOYP%bm)x5XD0sy`)EbBAL*{D;v%-N3-+?A8Ru4H$tq#PgyNjqz+z+lMO?CB<< zy7=rw)uK=BQMQHFX>gAqf9pd?fSAP_k4_`fi-_Eh@7FinBtQ0Z6Ij7F0$;)wkuTAj zqqCNxjuySTh;Qhq50C3Yw|H9DwOR|g)|DzSexT2;ma4@abFO^ojtFzzNW>1AgqjoP zVUs2fN+xc6l$HvZbw^)Qur9ohr-dT4v*NpoV5Pz0$)v*&QX;U$HE_}-Il{z2u5E@V z^OpTQk^rFRWmz2A#Z_e82arG5ixmzo1)+M#>*M;`H)8Yywe?Mc-ci+bh%R><(4A8j(1Q_8EV%b7-m38m_zyCE@dqa7G19pd0QT}Ah(pP5_v%- zr%lnsU1_mi*&!CY_k#fhucjG}?dZ0Me3_5&wO%@+Q133cSgStpP7%|f;ijvw)QKAJ zQRU-w!2ROc8`Dup{U-=q&hPlU5arFuCdZVQbv2_5H0!Hzn0|be%r}OqctpC^U22L9 z7QZyAZqlRfz}YIZf9qY4YI!&=S29$FJkfi%hO`?$@C^S1s{JHU$K$B#^7a%>BOUN> zTDdudbGT&~w6HF|Y`0cj8bKmY&$0p!gC^luvcPrbR| zN{oXbKm5&I6eRXTgEut>*vxPC0stH&|HI#OKnj2QAONKJrC5f>i#} z%OKSsy_*>j;os(a{OtpP^z+S0{|e*=4FGh|z>oWXZTvVKl`cV-&**fb$$L_P4*P{Q zk%tCCjd;nK1<2umY~D^Z&Pm=0nql7s^QaCaO(Q#Y!kVj^g;-z@j-PzuX-pH?ftzn? zfZc}$?+DsQ>7Gx7fP4M-S&?RK9h02`1E!+L0H&C?Q@60RdgvxR2U&Og5PT22GRGOs zLIf9iAt@jW<6FXX9|qPb1%Mx@(P4m`AKWk70Y!Q6Xz$zrB{r3g!o59H>L%k3e=>Qc zN$Jb`M&z~N+^e_XVP<-|Ud|r3eleA!XX1kHIfofYGEUI|*{8y4luS5TwN&r&v20*# zf&-ZV7+w;DaH(qI;w`>JD2499goEDFV*%~rIsbj6&bdPhT-{`Q-hHvBUKfh;vFYoP+s^J4k*hv^4VXy2I68eW@c2#0ZJb2p<-~G~ zdMLK%MO^GVy87M+wX51U5pX6tAFy49b2K0+m$!$UM;L8 zo%6G+KyHHe|4|ACHsili`kknMQMx$>#r%uX@AUpfDf~}Lzt^z-rW951H>If3zbO6Q Z`+rip$u}Ue4gga8&8nV%zVaWm{trj-e98a- literal 0 HcmV?d00001 diff --git a/imageio/imageio-tiff/src/test/resources/tiff/lzw-rgba-padded-icc.tif b/imageio/imageio-tiff/src/test/resources/tiff/lzw-rgba-padded-icc.tif new file mode 100644 index 0000000000000000000000000000000000000000..c8801c075ae35a317eae8df2949713cfd250e5da GIT binary patch literal 8790 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