我正在尝试使用 glReadPixels()
获取屏幕,然后将其转换为图像。
我收到一条错误消息,指出 image == null。
ByteBuffer _frame = ByteBuffer.allocate( 4 * Main.gui.glCanvas.getWidth() * Main.gui.glCanvas.getHeight() );
System.out.println( "Num Pixels " + Main.width * Main.height );
gl.glReadPixels(
0,
0,
Main.gui.glCanvas.getWidth(),
Main.gui.glCanvas.getHeight(),
GL3.GL_RGBA,
GL3.GL_UNSIGNED_BYTE,
_frame
);
try {
BufferedImage bi = ImageIO.read( new ByteArrayInputStream( _frame.array() ) );
ImageIO.write( bi, "png", new File( "Slices/slicu.png" ) );
} catch ( Exception e ) {
System.out.println( e.getMessage() + " @ Filler.draw()" );
e.printStackTrace();
}
最佳答案
而是使用com.jogamp.common.nio.Buffers.newDirectByteBuffer()而不是 ByteBuffer.allocate()。如果您在这里使用非直接 NIO 缓冲区,JOGL 将必须在后台创建一个直接 NIO 缓冲区,并且无论如何您都无法确定 NIO 缓冲区是否由数组支持,它可以为 null。然后,创建一个数组并将缓冲区的内容复制到其中。
您可以使用com.jogamp.opengl.util.awt.Screenshot , com.jogamp.opengl.util.GLReadBufferUtil或com.jogamp.opengl.util.awt.AWTGLReadBufferUtil相反,Github 上的 jogl-demos 中有一些示例。
我建议您询问有关 JOGL 的问题,而不是在 our official forum 上提问。 .
关于java - OpenGL - 尝试将字节数组转换为 BufferedImage 时图像 == null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22750636/