summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/graph/PngRenderer.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/openslx/graph/PngRenderer.java')
-rw-r--r--src/main/java/org/openslx/graph/PngRenderer.java46
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();
+ }
+
+}