diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriter.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriter.java index 0370976e..dc7b968a 100644 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriter.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriter.java @@ -373,7 +373,7 @@ public final class TIFFImageWriter extends ImageWriterBase { else { // Write image data writeImageData(createCompressorStream(renderedImage, param, entries), renderedImage, numComponents, bandOffsets, - bitOffsets); + bitOffsets, photometric); } // Update IFD0-pointer, and write IFD @@ -583,7 +583,7 @@ public final class TIFFImageWriter extends ImageWriterBase { return shorts; } - private void writeImageData(DataOutput stream, RenderedImage renderedImage, int numComponents, int[] bandOffsets, int[] bitOffsets) throws IOException { + private void writeImageData(DataOutput stream, RenderedImage renderedImage, int numComponents, int[] bandOffsets, int[] bitOffsets, int photometric) throws IOException { // Store 3BYTE, 4BYTE as is (possibly need to re-arrange to RGB order) // Store INT_RGB as 3BYTE, INT_ARGB as 4BYTE?, INT_ABGR must be re-arranged // Store IndexColorModel as is @@ -632,7 +632,7 @@ public final class TIFFImageWriter extends ImageWriterBase { final int xOff = yOff + x * numBands; for (int s = 0; s < numBands; s++) { - buffer.put((byte) (dataBuffer.getElem(b, xOff + bandOffsets[s]) & 0xff)); + buffer.put(normalizeBlack(photometric,(byte) (dataBuffer.getElem(b, xOff + bandOffsets[s]) & 0xff))); } } @@ -744,6 +744,14 @@ public final class TIFFImageWriter extends ImageWriterBase { processImageComplete(); } + + private byte normalizeBlack(int photometricInterpretation, byte data) { + if (photometricInterpretation == TIFFBaseline.PHOTOMETRIC_WHITE_IS_ZERO) { + // Inverse values + return (byte) (0xff - data & 0xff); + } + return data; + } // TODO: Would be better to solve this on stream level... But writers would then have to explicitly flush the buffer before done. private void flushBuffer(final ByteBuffer buffer, final DataOutput stream) throws IOException {