diff options
Diffstat (limited to 'src/main/java/org/openslx/graph/PngRenderer.java')
-rw-r--r-- | src/main/java/org/openslx/graph/PngRenderer.java | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/main/java/org/openslx/graph/PngRenderer.java b/src/main/java/org/openslx/graph/PngRenderer.java new file mode 100644 index 0000000..e51889c --- /dev/null +++ b/src/main/java/org/openslx/graph/PngRenderer.java @@ -0,0 +1,46 @@ +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(); + } + +} |