TMI-22: Cleaned up reading of ICC profile, trying to be more lenient about chunk count/chunk index.

This commit is contained in:
Harald Kuhr 2012-06-22 09:57:02 +02:00
parent 92690e1644
commit 6c082353d6

View File

@ -731,7 +731,7 @@ public class JPEGImageReader extends ImageReaderBase {
int chunkCount = stream.readUnsignedByte(); int chunkCount = stream.readUnsignedByte();
if (chunkNumber != 1 && chunkCount != 1) { if (chunkNumber != 1 && chunkCount != 1) {
processWarningOccurred(String.format("Bad number of 'ICC_PROFILE' chunks: %d of %d.", chunkNumber, chunkCount)); processWarningOccurred(String.format("Bad number of 'ICC_PROFILE' chunks: %d of %d. Assuming single chunk.", chunkNumber, chunkCount));
} }
return readICCProfileSafe(stream); return readICCProfileSafe(stream);
@ -742,20 +742,21 @@ public class JPEGImageReader extends ImageReaderBase {
int chunkNumber = stream.readUnsignedByte(); int chunkNumber = stream.readUnsignedByte();
int chunkCount = stream.readUnsignedByte(); int chunkCount = stream.readUnsignedByte();
if (chunkNumber < 1) {
// Some weird JPEGs use 0-based indexes... count == 0 and all numbers == 0. Ignore these profiles
processWarningOccurred(String.format("Invalid 'ICC_PROFILE' chunk index: %d. Ignoring ICC profile.", chunkNumber));
return null;
}
boolean badICC = false; boolean badICC = false;
if (chunkCount != segments.size()) { if (chunkCount != segments.size()) {
// Some weird JPEGs use 0-based indexes... count == 0 and all numbers == 0.
// Others use count == 1, and all numbers == 1. // Others use count == 1, and all numbers == 1.
// Handle these by issuing warning // Handle these by issuing warning
badICC = true; badICC = true;
processWarningOccurred(String.format("Unexpected 'ICC_PROFILE' chunk count: %d. Ignoring count, assuming %d chunks in sequence.", chunkCount, segments.size())); processWarningOccurred(String.format("Unexpected 'ICC_PROFILE' chunk count: %d. Ignoring count, assuming %d chunks in sequence.", chunkCount, segments.size()));
} }
if (!badICC && chunkNumber < 1) {
// Anything else is just ignored
processWarningOccurred(String.format("Invalid 'ICC_PROFILE' chunk index: %d. Ignoring ICC profile.", chunkNumber));
return null;
}
int count = badICC ? segments.size() : chunkCount; int count = badICC ? segments.size() : chunkCount;
InputStream[] streams = new InputStream[count]; InputStream[] streams = new InputStream[count];
streams[badICC ? 0 : chunkNumber - 1] = stream; streams[badICC ? 0 : chunkNumber - 1] = stream;