From 5def68c7e3b30f207ff45bf412a0aa6d55a60ca8 Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Mon, 8 Dec 2014 10:50:26 +0100 Subject: [PATCH] TMI-85: Support 16 bit signed int data --- .../imageio/metadata/exif/EXIFEntry.java | 2 ++ .../imageio/plugins/tiff/TIFFImageReader.java | 33 ++++++++++++++---- .../plugins/tiff/TIFFImageReaderTest.java | 3 +- .../src/test/resources/tiff/part.tif | Bin 0 -> 5244 bytes 4 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 imageio/imageio-tiff/src/test/resources/tiff/part.tif diff --git a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/exif/EXIFEntry.java b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/exif/EXIFEntry.java index f888bf82..381c0913 100644 --- a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/exif/EXIFEntry.java +++ b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/exif/EXIFEntry.java @@ -140,6 +140,8 @@ final class EXIFEntry extends AbstractEntry { return "ColorMap"; case TIFF.TAG_EXTRA_SAMPLES: return "ExtraSamples"; + case TIFF.TAG_SAMPLE_FORMAT: + return "SampleFormat"; case TIFF.TAG_SUB_IFD: return "SubIFD"; 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 2a02d76d..e69ac1d3 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 @@ -234,12 +234,12 @@ public class TIFFImageReader extends ImageReaderBase { public ImageTypeSpecifier getRawImageType(int imageIndex) throws IOException { readIFD(imageIndex); - getSampleFormat(); // We don't support anything but SAMPLEFORMAT_UINT at the moment, just sanity checking input + int sampleFormat = getSampleFormat(); int planarConfiguration = getValueAsIntWithDefault(TIFF.TAG_PLANAR_CONFIGURATION, TIFFExtension.PLANARCONFIG_PLANAR); int interpretation = getValueAsInt(TIFF.TAG_PHOTOMETRIC_INTERPRETATION, "PhotometricInterpretation"); int samplesPerPixel = getValueAsIntWithDefault(TIFF.TAG_SAMPLES_PER_PIXEL, 1); int bitsPerSample = getBitsPerSample(); - int dataType = bitsPerSample <= 8 ? DataBuffer.TYPE_BYTE : bitsPerSample <= 16 ? DataBuffer.TYPE_USHORT : DataBuffer.TYPE_INT; + int dataType = getDataType(sampleFormat, bitsPerSample); // Read embedded cs ICC_Profile profile = getICCProfile(); @@ -403,6 +403,24 @@ public class TIFFImageReader extends ImageReaderBase { } } + private int getDataType(int sampleFormat, int bitsPerSample) throws IIOException { + switch (sampleFormat) { + case TIFFBaseline.SAMPLEFORMAT_UINT: + return bitsPerSample <= 8 ? DataBuffer.TYPE_BYTE : bitsPerSample <= 16 ? DataBuffer.TYPE_USHORT : DataBuffer.TYPE_INT; + case TIFFExtension.SAMPLEFORMAT_INT: + if (bitsPerSample == 16) { + return DataBuffer.TYPE_SHORT; + } + throw new IIOException("Unsupported BitPerSample for SampleFormat 2/Signed Integer (expected 16): " + bitsPerSample); + case TIFFExtension.SAMPLEFORMAT_FP: + throw new IIOException("Unsupported TIFF SampleFormat: (3/Floating point)"); + case TIFFExtension.SAMPLEFORMAT_UNDEFINED: + throw new IIOException("Unsupported TIFF SampleFormat (4/Undefined)"); + default: + throw new IIOException("Unknown TIFF SampleFormat (expected 1, 2, 3 or 4): " + sampleFormat); + } + } + private IndexColorModel createIndexColorModel(final int bitsPerSample, final int dataType, final int[] cmapShort) { // According to the spec, there should be exactly 3 * bitsPerSample^2 entries in the color map for TIFF. // Should we enforce this? @@ -452,12 +470,10 @@ public class TIFFImageReader extends ImageReaderBase { } } - if (sampleFormat != TIFFBaseline.SAMPLEFORMAT_UINT) { - throw new IIOException("Unsupported TIFF SampleFormat (expected 1/Unsigned Integer): " + sampleFormat); - } + return (int) sampleFormat; } - // The default, and the only value we support + // The default return TIFFBaseline.SAMPLEFORMAT_UINT; } @@ -1152,7 +1168,10 @@ public class TIFFImageReader extends ImageReaderBase { break; case DataBuffer.TYPE_USHORT: - short[] rowDataShort = ((DataBufferUShort) tileRowRaster.getDataBuffer()).getData(); + case DataBuffer.TYPE_SHORT: + short[] rowDataShort = tileRowRaster.getTransferType() == DataBuffer.TYPE_USHORT + ? ((DataBufferUShort) tileRowRaster.getDataBuffer()).getData() + : ((DataBufferShort) tileRowRaster.getDataBuffer()).getData(); for (int row = startRow; row < startRow + rowsInTile; row++) { if (row >= srcRegion.y + srcRegion.height) { 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 e440a2cd..d913887b 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 @@ -75,7 +75,8 @@ public class TIFFImageReaderTest extends ImageReaderAbstractTestCasegD^#k2m z{{D@4^o0!l6!GaV5l?=Nc=}t!=PhmiyZ?X1L=S7fcV4r26W4JWXK@nKIF=m7L5yP< z{pdy~wqjGV5p78;nz0g#@w?=YScsR=h}D#3U2p35R;)=_ZRp8vrQuz?i?_0K6&G-Tltw~>DEUZi;PUa^`f zBj*{V{n(NAZ3)>R56(eDnpPF56=`3QP9oTlwHJ!ma>l=%c_VjQ62B9xj`X~h9|#$l zDigLc)P3kD2dn7`c_b&ze7B9o%*tX~;WzA{6Qq!DR=nn6<5C{XDrB8yybfYlvFfEK z>%i&OFtN0 zQ*2%--=G)#f?hIC{j{t5d79^JXC5|=wf_rwa*>rzm4n-U?g3m;S4K*ybE@!p);TrU zkarupeVDdUtYmjV|n{pzZV-#X)#yTEA7;DR}p6)V4EuM=qX|a_CWwvMycuk zZGZryVow(F%N}$pWDyr+DJz-m(kD9daipE@XwT!^F(}2evHT!jL_il0I%q!=TQ-K z40aASod@`+DGNP$I@Ajbhsxri@@E@lr?0Env<x~T5CH8|#uFD6y zR7<}0bT@G#1_$y2KVWJ{o@#eC4icfD)GWJ`v7++LP%u*??a-gh=0vcSnHXgD(BW9Q zH`^YlcRnVHBU291gvsyQhU=L=gdd)#@PkT*QQbc_w5E%!HO_Syhxk(R$hiLvX!kxh-Ymb(IJBhgl45Q!y$t;8A9yaMM&4=ouiFuGOmQ zfjq!W4PEI8rDg-}LFfxT?aSF9A4jSGOq$Hypa2^u`hHe*jd|Iy7e=U2O1EITBuiAN zyBqj~X<(3B^ss-turKg8KDhH;C{`E3)kxm2CvPyFxyqT4nWEt)n4_PX(MwMGBo7Gv z?Yxo_F~^7wewEY6JZyj|rtS6QDrOkw`xSkfe_&;>HBx+TYnyBrG_mV4cYq?kF-yIX zT<2$3+CV<@hi4Etg((@P2C1;K;{(@WhgZQ48ZU3;D!(~G%!bVBGwGwc+SRT-bJ;3P zPCeiOdf_FwhrR%M$%LmSbe5f$&zWX*Ptxz^V#6~mez?QKz@FDR3D^_Z0|xYKU-6@J zdY(D2D$Vn(Ag@v7K1EX5XNuje zc1P+%e3*+3cz2-qFy~Rj(lMxpz0ACm#608oy=0J}mM6>dbml@((atYPD?+#g*Egd*$|mfcKN zVP^MiP3IsFOu*Rm*@6jzTJZ_vy3$VVahf^PCm1FM_iw`!l6jPvGjVY?;N7mR;FfrLje1-Lo$ps7r zWBI=opcy%xiw!E+ouJHjZh!N*jCLY(MJ1_`$ z-{=25&Ocaob$cG}W+vcbcSdtDOi3<{c$mMOEIfHl6*a70XqVtTgqiux?81D&zL=hQ_Y7R7lvDYJ%)+P_quX8!>y=~(Un literal 0 HcmV?d00001