From 237079bcc9db9843466b8d614eac2ead506ae01b Mon Sep 17 00:00:00 2001 From: Schmidor Date: Sun, 11 Oct 2015 16:32:39 +0200 Subject: [PATCH] Normalize Black on byte Data --- .../imageio/plugins/tiff/TIFFImageWriter.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) 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 {