package org.openslx.graph; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; import java.awt.image.SinglePixelPackedSampleModel; import java.io.OutputStream; import ar.com.hjg.pngj.ImageInfo; import ar.com.hjg.pngj.ImageLineByte; import ar.com.hjg.pngj.PngWriter; public class PngRenderer { private final ImageInfo imageInfo; private final SinglePixelPackedSampleModel samplemodel; private final int[] srcImageRawData; private final ImageLineByte line; private final byte[] lineBytes; public PngRenderer( BufferedImage image ) { imageInfo = new ImageInfo( image.getWidth(), image.getHeight(), 8, false ); DataBufferInt db = ( (DataBufferInt)image.getRaster().getDataBuffer() ); samplemodel = (SinglePixelPackedSampleModel)image.getSampleModel(); line = new ImageLineByte( imageInfo ); lineBytes = line.getScanline(); srcImageRawData = db.getData(); } public void render( OutputStream os ) { PngWriter pngWriter = new PngWriter( os, imageInfo ); for ( int row = 0; row < imageInfo.rows; row++ ) { int elem = samplemodel.getOffset( 0, row ); for ( int col = 0, j = 0; col < imageInfo.cols; col++ ) { int sample = srcImageRawData[elem++]; lineBytes[j++] = (byte) ( ( sample & 0xFF0000 ) >> 16 ); // R lineBytes[j++] = (byte) ( ( sample & 0xFF00 ) >> 8 ); // G lineBytes[j++] = (byte) ( sample & 0xFF ); // B } pngWriter.writeRow( line, row ); } pngWriter.end(); } }