final List<PngChunk> PLTEs = filterChunks(chunks, ChunkType.PLTE);
if (PLTEs.size() > 1) {
throw new ImageReadException("PNG contains more than one Palette");
}
PngChunkPlte pngChunkPLTE = null;
if (PLTEs.size() == 1) {
pngChunkPLTE = (PngChunkPlte) PLTEs.get(0);
}
// -----
final List<PngChunk> IDATs = filterChunks(chunks, ChunkType.IDAT);
if (IDATs.isEmpty()) {
throw new ImageReadException("PNG missing image data");
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for (PngChunk IDAT : IDATs) {
final PngChunkIdat pngChunkIDAT = (PngChunkIdat) IDAT;
final byte[] bytes = pngChunkIDAT.getBytes();
// System.out.println(i + ": bytes: " + bytes.length);
baos.write(bytes);
}
final byte[] compressed = baos.toByteArray();
baos = null;
TransparencyFilter transparencyFilter = null;
final List<PngChunk> tRNSs = filterChunks(chunks, ChunkType.tRNS);
if (!tRNSs.isEmpty()) {
final PngChunk pngChunktRNS = tRNSs.get(0);
transparencyFilter = getTransparencyFilter(pngChunkIHDR.colorType, pngChunktRNS);
}
ICC_Profile iccProfile = null;
GammaCorrection gammaCorrection = null;
{
final List<PngChunk> sRGBs = filterChunks(chunks, ChunkType.sRGB);
final List<PngChunk> gAMAs = filterChunks(chunks, ChunkType.gAMA);
final List<PngChunk> iCCPs = filterChunks(chunks, ChunkType.iCCP);
if (sRGBs.size() > 1) {
throw new ImageReadException("PNG: unexpected sRGB chunk");
}
if (gAMAs.size() > 1) {
throw new ImageReadException("PNG: unexpected gAMA chunk");
}
if (iCCPs.size() > 1) {
throw new ImageReadException("PNG: unexpected iCCP chunk");
}
if (sRGBs.size() == 1) {
// no color management neccesary.
if (getDebug()) {
System.out.println("sRGB, no color management neccesary.");
}
} else if (iCCPs.size() == 1) {
if (getDebug()) {
System.out.println("iCCP.");
}
final PngChunkIccp pngChunkiCCP = (PngChunkIccp) iCCPs.get(0);
final byte[] bytes = pngChunkiCCP.uncompressedProfile;
iccProfile = ICC_Profile.getInstance(bytes);
} else if (gAMAs.size() == 1) {
final PngChunkGama pngChunkgAMA = (PngChunkGama) gAMAs.get(0);
final double gamma = pngChunkgAMA.getGamma();
// charles: what is the correct target value here?
// double targetGamma = 2.2;
final double targetGamma = 1.0;
final double diff = Math.abs(targetGamma - gamma);
if (diff >= 0.5) {
gammaCorrection = new GammaCorrection(gamma, targetGamma);
}
if (gammaCorrection != null) {
if (pngChunkPLTE != null) {
pngChunkPLTE.correct(gammaCorrection);
}
}
}
}