Ich möchte einen Screenshot von meinem OPENGL Screen unter JOGL 2 machen.
Jedoch bekomme ich bei (1920 1080 60 32 / Window 1024*576) in Zeile 25 und
dem unten stehenden Quellcode folgenden Fehler:
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Required 1788720 remaining bytes in buffer, only had 1769472
at com.sun.gluegen.runtime.BufferFactory.rangeCheckBytes(BufferFactory.java:311)
at com.sun.opengl.impl.gl2.GL2Impl.glReadPixels(GL2Impl.java:16274)
at com.lefutura.lfengine.glrenders.GLRenderer_JOGL_2.takeScreenshot(GLRenderer_JOGL_2.java:378)
at com.lefutura.lfengine.LFEngineLoop.receivedTouchClickedAction(LFEngineLoop.java:208)
at
Mache ich das selbe mit LWJGL (gleicher Code) funktioniert es einwandfrei.
Jedoch bekomme ich bei (1920 1080 60 32 / Window 1024*576) in Zeile 25 und
dem unten stehenden Quellcode folgenden Fehler:
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Required 1788720 remaining bytes in buffer, only had 1769472
at com.sun.gluegen.runtime.BufferFactory.rangeCheckBytes(BufferFactory.java:311)
at com.sun.opengl.impl.gl2.GL2Impl.glReadPixels(GL2Impl.java:16274)
at com.lefutura.lfengine.glrenders.GLRenderer_JOGL_2.takeScreenshot(GLRenderer_JOGL_2.java:378)
at com.lefutura.lfengine.LFEngineLoop.receivedTouchClickedAction(LFEngineLoop.java:208)
at
Mache ich das selbe mit LWJGL (gleicher Code) funktioniert es einwandfrei.
Java:
public void takeScreenshot(int width, int height) {
long startTime = System.currentTimeMillis();
int[] nBits = {8, 8, 8};
int[] bOffs = {0, 1, 2};
BufferedImage screenshotImage;
ByteBuffer pixels;
DataBuffer db;
WritableRaster raster;
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
ColorModel cm = new ComponentColorModel(cs, nBits, false, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE);
byte [] byteA=new byte[callbackRenderer.screenWidth*callbackRenderer.screenHeight*3];
pixels = ByteBuffer.allocateDirect(callbackRenderer.screenWidth*callbackRenderer.screenHeight*3);
gl.glReadPixels(0, 0, callbackRenderer.screenWidth, callbackRenderer.screenHeight, GL2.GL_RGB, GL2.GL_UNSIGNED_BYTE, pixels);
pixels.get(byteA);
db = new DataBufferByte(byteA, callbackRenderer.screenWidth*callbackRenderer.screenHeight, 0);
raster = Raster.createInterleavedRaster(db, callbackRenderer.screenWidth, callbackRenderer.screenHeight, callbackRenderer.screenWidth*3, 3, bOffs, null);
screenshotImage = new BufferedImage(cm, raster, false, null);//new java.util.Hashtable());
// * Flip Image Y Axis *
AffineTransform tx = AffineTransform.getScaleInstance(1, -1);
tx.translate(0, -screenshotImage.getHeight(null));
AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
screenshotImage = op.filter(screenshotImage, null);
long endTime = System.currentTimeMillis() - startTime;
System.out.println("Capture Image Time: " + endTime);
try {
ImageIO.write(screenshotImage, "PNG", new File("test.png"));
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}