#300 TIFF old style JPEG inconsistent metadata

(cherry picked from commit 753afd0)
This commit is contained in:
Harald Kuhr 2016-12-12 21:26:31 +01:00
parent 41e6b041c9
commit ad86bcda7e
3 changed files with 33 additions and 3 deletions

View File

@ -1008,7 +1008,7 @@ public class TIFFImageReader extends ImageReaderBase {
// TODO: If we have non-standard reference B/W or yCbCr coefficients,
// we might still have to do extra color space conversion...
if (needsCSConversion == null) {
needsCSConversion = needsCSConversion(interpretation, jpegReader.getImageMetadata(0));
needsCSConversion = needsCSConversion(interpretation, readJPEGMetadataSafe(jpegReader));
}
if (!needsCSConversion) {
@ -1146,7 +1146,7 @@ public class TIFFImageReader extends ImageReaderBase {
jpegParam.setSourceSubsampling(xSub, ySub, 0, 0);
if (needsCSConversion == null) {
needsCSConversion = needsCSConversion(interpretation, jpegReader.getImageMetadata(0));
needsCSConversion = needsCSConversion(interpretation, readJPEGMetadataSafe(jpegReader));
}
if (!needsCSConversion) {
@ -1251,7 +1251,7 @@ public class TIFFImageReader extends ImageReaderBase {
Point offset = new Point(col - srcRegion.x, row - srcRegion.y);
if (needsCSConversion == null) {
needsCSConversion = needsCSConversion(interpretation, jpegReader.getImageMetadata(0));
needsCSConversion = needsCSConversion(interpretation, readJPEGMetadataSafe(jpegReader));
}
if (!needsCSConversion) {
@ -1319,6 +1319,17 @@ public class TIFFImageReader extends ImageReaderBase {
return destination;
}
private IIOMetadata readJPEGMetadataSafe(final ImageReader jpegReader) throws IOException {
try {
return jpegReader.getImageMetadata(0);
}
catch (IIOException e) {
processWarningOccurred("Could not read metadata metadata JPEG compressed TIFF: " + e.getMessage() + " colors may look incorrect");
return null;
}
}
private boolean needsCSConversion(final int photometricInterpretation, final IIOMetadata imageMetadata) throws IOException {
if (imageMetadata == null) {
// Assume we're ok

View File

@ -220,6 +220,25 @@ public class TIFFImageReaderTest extends ImageReaderAbstractTest<TIFFImageReader
}
}
@Test
public void testReadOldStyleJPEGInconsistentMetadata() throws IOException {
TestData testData = new TestData(getClassLoaderResource("/tiff/old-style-jpeg-inconsistent-metadata.tif"), new Dimension(2483, 3515));
try (ImageInputStream stream = testData.getInputStream()) {
TIFFImageReader reader = createReader();
reader.setInput(stream);
IIOReadWarningListener warningListener = mock(IIOReadWarningListener.class);
reader.addIIOReadWarningListener(warningListener);
BufferedImage image = reader.read(0);
assertNotNull(image);
assertEquals(testData.getDimension(0), new Dimension(image.getWidth(), image.getHeight()));
verify(warningListener, atLeastOnce()).warningOccurred(eq(reader), contains("metadata"));
}
}
@Test
public void testReadIncompatibleICCProfileIgnoredWithWarning() throws IOException {
TestData testData = new TestData(getClassLoaderResource("/tiff/rgb-with-embedded-cmyk-icc.tif"), new Dimension(1500, 1500));