Tim Scheckenbach created IMAGING-384:
----------------------------------------
Summary: Imaging.getBufferedImage causes a CMMException "LCMS
error 13: Couldn't link the profiles" on a PNG whose ICC profile has an empty
tag table
Key: IMAGING-384
URL: https://issues.apache.org/jira/browse/IMAGING-384
Project: Commons Imaging
Issue Type: Bug
Components: Format: PNG
Affects Versions: 1.0.0-alpha7
Reporter: Tim Scheckenbach
Attachments: crash-15da8bfcef6196e1792786d69303dcca78c7006a
Calling
{code:java}
Imaging.getBufferedImage(new
File("crash-15da8bfcef6196e1792786d69303dcca78c7006a"));
{code}
on the attached PNG results in:
{code}
java.awt.color.CMMException: LCMS error 13: Couldn't link the profiles
at java.desktop/sun.java2d.cmm.lcms.LCMS.createNativeTransform(Native
Method)
at java.desktop/sun.java2d.cmm.lcms.LCMS.createTransform(LCMS.java:117)
at
java.desktop/sun.java2d.cmm.lcms.LCMSTransform.doTransform(LCMSTransform.java:149)
at
java.desktop/sun.java2d.cmm.lcms.LCMSTransform.colorConvert(LCMSTransform.java:668)
at
java.desktop/java.awt.image.ColorModel.getGray8TosRGB8LUT(ColorModel.java:1823)
at
java.desktop/java.awt.image.ComponentColorModel.setupLUTs(ComponentColorModel.java:449)
at
java.desktop/java.awt.image.ComponentColorModel.<init>(ComponentColorModel.java:301)
at
java.desktop/java.awt.image.ComponentColorModel.<init>(ComponentColorModel.java:353)
at
org.apache.commons.imaging.ColorTools.deriveColorModel(ColorTools.java:248)
at
org.apache.commons.imaging.ColorTools.deriveColorModel(ColorTools.java:228)
at
org.apache.commons.imaging.ColorTools.deriveColorModel(ColorTools.java:215)
at
org.apache.commons.imaging.ColorTools.relabelColorSpace(ColorTools.java:317)
at
org.apache.commons.imaging.ColorTools.convertBetweenColorSpaces(ColorTools.java:66)
at
org.apache.commons.imaging.formats.png.PngImageParser.getBufferedImage(PngImageParser.java:313)
at
org.apache.commons.imaging.formats.png.PngImageParser.getBufferedImage(PngImageParser.java:75)
{code}
The image is a 1x1 PNG with IHDR colour type 0 (greyscale) and an {{iCCP}}
chunk holding a
132-byte profile: the 128-byte ICC header plus a tag count of zero. It declares
{{dataColorSpace = 'GRAY'}} and carries no tags at all, so it has no white
point, no tone
reproduction curve and no matrix tags.
After some investigation: {{PngImageParser:237-244}} guards only the parsing of
the profile,
{code:java}
try {
iccProfile = ICC_Profile.getInstance(bytes);
} catch (final IllegalArgumentException iae) {
throw new ImagingException("The image data does not correspond to a valid
ICC Profile", iae);
}
{code}
and {{ICC_Profile.getInstance}} validates only the 128-byte header, so the
tagless profile is
accepted and applied at line 313. Here the colour space is *consistent* with
the image -- a
one-component grey space against a one-band raster -- so nothing rejects it.
{{ComponentColorModel}}'s constructor then eagerly calls {{setupLUTs}}, which
builds a
grey-to-sRGB lookup table via {{ColorModel.getGray8TosRGB8LUT}}; LCMS is asked
to link a
profile with no transform data to sRGB and fails.
The existing try/catch suggests the intent is to report profile problems as
{{ImagingException}}, but it is scoped to parsing the profile rather than to
using it.
{{CMMException}} extends {{RuntimeException}} and {{Imaging.getBufferedImage}}
is declared as
{{throws ImagingException, IOException}}, so callers handling the documented
exception types
do not catch this one.
The failure is a property of the profile, not of the colour type: the same
tagless profile
retagged {{'RGB '}} and embedded in a truecolour PNG throws identically.
I have attached the image to the issue.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)