java - OpenGL - 尝试将字节数组转换为 BufferedImage 时图像 == null

标签 java image opengl byte jogl

我正在尝试使用 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.GLReadBufferUtilcom.jogamp.opengl.util.awt.AWTGLReadBufferUtil相反,Github 上的 jogl-demos 中有一些示例。

我建议您询问有关 JOGL 的问题,而不是在 our official forum 上提问。 .

关于java - OpenGL - 尝试将字节数组转换为 BufferedImage 时图像 == null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22750636/

相关文章:

c++ - OpenGL 16 位模板缓冲区?

c++ - OpenCV:基于三角选择倾斜图像

java - TCPDump-Buffer 上的 ReadLine 有时会阻塞,直到终止 tcpdump

java - 内部 map 具有多个键值对的 map 内部的 map

Java继承: How to remove items from an ArrayList depending on a property which is not owned by all of the items?

javascript - 在图像区域创建链接

css - 垂直和水平对齐 div 中的图像

opengl - 为什么有一个单独的投影矩阵是有益的,但结合模型和 View 矩阵?

macos - 阻止 OpenGL.framework 在 Cocoa 应用程序中加载

java - 学习不同代码的最佳方法是什么?