8172153: Create workaround for failure to use ICC profile contained in a TIFF field

Work around errors due to using an embedded ICC profile from the metadata

Reviewed-by: prr
This commit is contained in:
Brian Burkhalter 2017-01-03 14:15:15 -08:00
parent 7c0476db0a
commit 95ffeea1a3

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -730,18 +730,47 @@ public class TIFFImageReader extends ImageReader {
// to use it if the data layout is component type.
if (iccProfileField != null
&& itsRaw.getColorModel() instanceof ComponentColorModel) {
// Create a ColorSpace from the profile.
byte[] iccProfileValue = iccProfileField.getAsBytes();
ICC_Profile iccProfile
= ICC_Profile.getInstance(iccProfileValue);
ICC_ColorSpace iccColorSpace
= new ICC_ColorSpace(iccProfile);
// Get the raw sample and color information.
ColorModel cmRaw = itsRaw.getColorModel();
ColorSpace csRaw = cmRaw.getColorSpace();
SampleModel smRaw = itsRaw.getSampleModel();
ColorSpace iccColorSpace = null;
try {
// Create a ColorSpace from the profile.
byte[] iccProfileValue = iccProfileField.getAsBytes();
ICC_Profile iccProfile
= ICC_Profile.getInstance(iccProfileValue);
iccColorSpace = new ICC_ColorSpace(iccProfile);
// Workaround for JDK-8145241: test a conversion and fall
// back to a standard ColorSpace if it fails. This
// workaround could be removed if JDK-8145241 is fixed.
float[] rgb =
iccColorSpace.toRGB(new float[] {1.0F, 1.0F, 1.0F});
} catch (Exception iccProfileException) {
processWarningOccurred("Superseding bad ICC profile: "
+ iccProfileException.getMessage());
if (iccColorSpace != null) {
switch (iccColorSpace.getType()) {
case ColorSpace.TYPE_GRAY:
iccColorSpace =
ColorSpace.getInstance(ColorSpace.CS_GRAY);
break;
case ColorSpace.TYPE_RGB:
iccColorSpace =
ColorSpace.getInstance(ColorSpace.CS_sRGB);
break;
default:
iccColorSpace = csRaw;
break;
}
} else {
iccColorSpace = csRaw;
}
}
// Get the number of samples per pixel and the number
// of color components.
int numBands = smRaw.getNumBands();