private PngChunk processHeadChunks(PngImage result, Iterator<PngChunk> itChunks) throws IOException { PngChunk chunk = null; while (itChunks.hasNext()) { chunk = itChunks.next(); if (PngChunk.IMAGE_DATA.equals(chunk.getTypeString())) { break; } if (chunk.isRequired()) { ByteArrayOutputStream bytes = new ByteArrayOutputStream(chunk.getLength()); DataOutputStream data = new DataOutputStream(bytes); data.write(chunk.getData()); data.close(); PngChunk newChunk = new PngChunk(chunk.getType(), bytes.toByteArray()); if (PngChunk.IMAGE_HEADER.equals(chunk.getTypeString())) { newChunk.setInterlace((byte) 0); } result.addChunk(newChunk); } } return chunk; }
private byte[] getInflatedImageData(PngChunk chunk, Iterator<PngChunk> itChunks) throws IOException { ByteArrayOutputStream imageBytes = new ByteArrayOutputStream(chunk == null ? 0 : chunk.getLength()); DataOutputStream imageData = new DataOutputStream(imageBytes); while (chunk != null) { if (PngChunk.IMAGE_DATA.equals(chunk.getTypeString())) { imageData.write(chunk.getData()); } else { break; } chunk = itChunks.hasNext() ? itChunks.next() : null; } imageData.close(); return this.pngCompressionHandler.inflate(imageBytes); }
private PngChunk processTailChunks( PngImage result, Iterator<PngChunk> itBaseChunks, PngChunk lastBaseChunk) throws IOException { while (lastBaseChunk != null) { if (lastBaseChunk.isCritical()) { ByteArrayOutputStream bytes = new ByteArrayOutputStream(lastBaseChunk.getLength()); DataOutputStream data = new DataOutputStream(bytes); data.write(lastBaseChunk.getData()); data.close(); PngChunk newChunk = new PngChunk(lastBaseChunk.getType(), bytes.toByteArray()); result.addChunk(newChunk); } lastBaseChunk = itBaseChunks.hasNext() ? itBaseChunks.next() : null; } return lastBaseChunk; }