From 821965df0d66d80434fdfcf6b2c3f90e4410b876 Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Tue, 31 Aug 2021 22:16:08 +0200 Subject: [PATCH] #621 Don't add ICC profile for default gray images (cherry picked from commit 105a1ee466f07d6b3397eac61f17543bdb26fb93) --- .../imageio/color/ColorSpaces.java | 16 +++++++++++++ .../imageio/color/ColorSpacesTest.java | 18 ++++++++++++++ .../imageio/plugins/tiff/TIFFImageWriter.java | 7 ++++-- .../plugins/tiff/TIFFImageWriterTest.java | 24 ++++++++++++++++++- 4 files changed, 62 insertions(+), 3 deletions(-) diff --git a/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/color/ColorSpaces.java b/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/color/ColorSpaces.java index 49665ba0..2d3214ea 100644 --- a/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/color/ColorSpaces.java +++ b/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/color/ColorSpaces.java @@ -239,6 +239,7 @@ public final class ColorSpaces { * @return {@code true} if {@code profile} is equal to the default sRGB profile. * @throws IllegalArgumentException if {@code profile} is {@code null} * + * @see java.awt.color.ColorSpace#CS_sRGB * @see java.awt.color.ColorSpace#isCS_sRGB() */ public static boolean isCS_sRGB(final ICC_Profile profile) { @@ -247,6 +248,21 @@ public final class ColorSpaces { return profile.getColorSpaceType() == ColorSpace.TYPE_RGB && Arrays.equals(getProfileHeaderWithProfileId(profile), sRGB.header); } + /** + * Tests whether an ICC color profile is equal to the default GRAY profile. + * + * @param profile the ICC profile to test. May not be {@code null}. + * @return {@code true} if {@code profile} is equal to the default GRAY profile. + * @throws IllegalArgumentException if {@code profile} is {@code null} + * + * @see java.awt.color.ColorSpace#CS_GRAY + */ + public static boolean isCS_GRAY(final ICC_Profile profile) { + Validate.notNull(profile, "profile"); + + return profile.getColorSpaceType() == ColorSpace.TYPE_GRAY && Arrays.equals(getProfileHeaderWithProfileId(profile), GRAY.header); + } + /** * Tests whether an ICC color profile is known to cause problems for {@link java.awt.image.ColorConvertOp}. *

diff --git a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/ColorSpacesTest.java b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/ColorSpacesTest.java index 412bdb6f..2520a968 100644 --- a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/ColorSpacesTest.java +++ b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/color/ColorSpacesTest.java @@ -184,6 +184,24 @@ public class ColorSpacesTest { ColorSpaces.isCS_sRGB(null); } + @Test + public void testIsCS_GRAYTrue() { + assertTrue(ColorSpaces.isCS_GRAY(ICC_Profile.getInstance(ColorSpace.CS_GRAY))); + } + + @Test + public void testIsCS_GRAYFalse() { + assertFalse(ColorSpaces.isCS_GRAY(ICC_Profile.getInstance(ColorSpace.CS_sRGB))); + assertFalse(ColorSpaces.isCS_GRAY(ICC_Profile.getInstance(ColorSpace.CS_LINEAR_RGB))); + assertFalse(ColorSpaces.isCS_GRAY(ICC_Profile.getInstance(ColorSpace.CS_CIEXYZ))); + assertFalse(ColorSpaces.isCS_GRAY(ICC_Profile.getInstance(ColorSpace.CS_PYCC))); + } + + @Test(expected = IllegalArgumentException.class) + public void testIsCS_GRAYNull() { + ColorSpaces.isCS_GRAY(null); + } + @Test public void testEqualHeadersDifferentProfile() throws IOException { // These profiles are extracted from various JPEGs, and have the exact same profile header... 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 dcb08074..85fbb6c5 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 @@ -32,6 +32,7 @@ package com.twelvemonkeys.imageio.plugins.tiff; import com.twelvemonkeys.image.ImageUtil; import com.twelvemonkeys.imageio.ImageWriterBase; +import com.twelvemonkeys.imageio.color.ColorSpaces; import com.twelvemonkeys.imageio.metadata.Directory; import com.twelvemonkeys.imageio.metadata.Entry; import com.twelvemonkeys.imageio.metadata.tiff.Rational; @@ -849,9 +850,11 @@ public final class TIFFImageWriter extends ImageWriterBase { else { entries.put(TIFF.TAG_SAMPLES_PER_PIXEL, new TIFFEntry(TIFF.TAG_SAMPLES_PER_PIXEL, numBands)); - // Note: Assuming sRGB to be the default RGB interpretation + // Embed ICC profile if we have one that: + // * is not sRGB (assuming sRGB to be the default RGB interpretation), and + // * is not gray scale (assuming photometric either BlackIsZero or WhiteIsZero) ColorSpace colorSpace = colorModel.getColorSpace(); - if (colorSpace instanceof ICC_ColorSpace && !colorSpace.isCS_sRGB()) { + if (colorSpace instanceof ICC_ColorSpace && !colorSpace.isCS_sRGB() && !ColorSpaces.isCS_GRAY(((ICC_ColorSpace) colorSpace).getProfile())) { entries.put(TIFF.TAG_ICC_PROFILE, new TIFFEntry(TIFF.TAG_ICC_PROFILE, ((ICC_ColorSpace) colorSpace).getProfile().getData())); } } diff --git a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriterTest.java b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriterTest.java index bce5ec02..fcf07726 100644 --- a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriterTest.java +++ b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriterTest.java @@ -554,6 +554,28 @@ public class TIFFImageWriterTest extends ImageWriterAbstractTest