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.