ArrayList PLTEs = filterChunks(chunks, 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);
// -----
ArrayList IDATs = filterChunks(chunks, IDAT);
if (IDATs.size() < 1)
throw new ImageReadException("PNG missing image data");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for (int i = 0; i < IDATs.size(); i++)
{
PNGChunkIDAT pngChunkIDAT = (PNGChunkIDAT) IDATs.get(i);
byte bytes[] = pngChunkIDAT.bytes;
// System.out.println(i + ": bytes: " + bytes.length);
baos.write(bytes);
}
byte compressed[] = baos.toByteArray();
baos = null;
TransparencyFilter transparencyFilter = null;
ArrayList tRNSs = filterChunks(chunks, tRNS);
if (tRNSs.size() > 0)
{
PNGChunk pngChunktRNS = (PNGChunk) tRNSs.get(0);
transparencyFilter = getTransparencyFilter(pngChunkIHDR.colorType,
pngChunktRNS);
}
ICC_Profile icc_profile = null;
GammaCorrection gammaCorrection = null;
{
ArrayList sRGBs = filterChunks(chunks, sRGB);
ArrayList gAMAs = filterChunks(chunks, gAMA);
ArrayList iCCPs = filterChunks(chunks, 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 (debug)
System.out.println("sRGB, no color management neccesary.");
} else if (iCCPs.size() == 1)
{
if (debug)
System.out.println("iCCP.");
PNGChunkiCCP pngChunkiCCP = (PNGChunkiCCP) iCCPs.get(0);
byte bytes[] = pngChunkiCCP.UncompressedProfile;
// TODO(maybe): ICC color profile
//icc_profile = ICC_Profile.getInstance(bytes);
icc_profile = null;
} else if (gAMAs.size() == 1)
{
PNGChunkgAMA pngChunkgAMA = (PNGChunkgAMA) gAMAs.get(0);
double gamma = pngChunkgAMA.getGamma();
// charles: what is the correct target value here?
// double targetGamma = 2.2;
double targetGamma = 1.0;
double diff = Math.abs(targetGamma - gamma);
if (diff >= 0.5)
gammaCorrection = new GammaCorrection(gamma, targetGamma);
if (gammaCorrection != null)
if (pngChunkPLTE != null)
pngChunkPLTE.correct(gammaCorrection);
}
}
{