PNGJ main package
Users of this library should rarely need more than the public members of this package.
Newcomers: start with PngReader and PngWriter.
Example of use: this code reads a true colour PNG image (RGB8 or RGBA8) and reduces the red channel by half, increasing the green by 20. It copies all the "safe" metadata from the original image, and adds a textual metadata.
public static void convert(String origFilename, String destFilename) { // you can also use PngReader (esentially the same) or PngReaderByte PngReaderInt pngr = new PngReaderInt(new File(origFilename)); System.out.println(pngr.toString()); int channels = pngr.imgInfo.channels; if (channels < 3 || pngr.imgInfo.bitDepth != 8) throw new RuntimeException("For simplicity this supports only RGB8/RGBA8 images"); // writer with same image properties as original PngWriter pngw = new PngWriter(new File(destFilename), pngr.imgInfo, true); // instruct the writer to grab all ancillary chunks from the original pngw.copyChunksFrom(pngr.getChunksList(), ChunkCopyBehaviour.COPY_ALL_SAFE); // add a textual chunk to writer pngw.getMetadata().setText(PngChunkTextVar.KEY_Description, "Decreased red and increased green"); // also: while(pngr.hasMoreRows()) for (int row = 0; row < pngr.imgInfo.rows; row++) { ImageLineInt l1 = pngr.readRowInt(); // each element is a sample int[] scanline = l1.getScanline(); // to save typing for (int j = 0; j < pngr.imgInfo.cols; j++) { scanline[j * channels] /= 2; scanline[j * channels + 1] = ImageLineHelper.clampTo_0_255(scanline[j * channels + 1] + 20); } pngw.writeRow(l1); } pngr.end(); // it's recommended to end the reader first, in case there are trailing chunks to read pngw.end(); }For more examples, see the tests and samples.