gpt4 book ai didi

java - 在java OpenGL中从屏幕(视口(viewport))导出图像

转载 作者:行者123 更新时间:2023-11-30 02:58:04 26 4
gpt4 key购买 nike

我是 OpenGL 编程的新手。我正在用 OpenGL 编写一个 java 程序。我在里面画了很多立方体。我现在想在我的程序中实现屏幕截图功能,但我无法使其工作。情况如下:

  • 我使用 FPSanimator 以 60 fps 刷新我的绘图
  • 我在显示器中画了几十个立方体。
  • 我在面板中添加了一个 KeyListener,如果我按下 alt 键,程序将运行以下方法:

    public static void exportImage() {
    int[] bb = new int[Constants.PanelSize.width*Constants.PanelSize.height*4];
    IntBuffer ib = IntBuffer.wrap(bb);
    ib.position(0);
    Constants.gl.glPixelStorei(GL2.GL_UNPACK_ALIGNMENT, 1);
    Constants.gl.glReadPixels(0,0,Constants.PanelSize.width,Constants.PanelSize.height,GL2.GL_RGBA,GL2.GL_UNSIGNED_BYTE,ib);
    System.out.println(Constants.gl.glGetError());
    ImageExport.savePixelsToPNG(bb,Constants.PanelSize.width,Constants.PanelSize.height, "imageFilename.png");
    }
    // Constant is a class which I store all my global variables in static type
  • 控制台输出为0,表示没有错误。我打印了缓冲区中的内容,它们都是零。

  • 我检查了输出文件,它只有 1kB。

我该怎么办?对于我使用 OpenGL 将屏幕内容导出到图像文件有什么好的建议吗?我听说有几个可用的库,但我不知道哪一个适合。感谢任何帮助 T_T(如果我有任何语法错误,请原谅我......)

最佳答案

假设您正在绘制到默认帧缓冲区,您可以执行以下操作:

    protected void saveImage(GL4 gl4, int width, int height) {

try {

GL4 gl4 = GLContext.getCurrentGL().getGL4();

BufferedImage screenshot = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics graphics = screenshot.getGraphics();

ByteBuffer buffer = GLBuffers.newDirectByteBuffer(width * height * 4);

gl4.glReadBuffer(GL_BACK);
gl4.glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

for (int h = 0; h < height; h++) {
for (int w = 0; w < width; w++) {
graphics.setColor(new Color((buffer.get() & 0xff), (buffer.get() & 0xff),
(buffer.get() & 0xff)));
buffer.get();
graphics.drawRect(w, height - h, 1, 1);
}
}
BufferUtils.destroyDirectBuffer(buffer);
File outputfile = new File("D:\\Downloads\\texture.png");
ImageIO.write(screenshot, "png", outputfile);
} catch (IOException ex) {
Logger.getLogger(EC_DepthPeeling.class.getName()).log(Level.SEVERE, null, ex);
}
}

本质上,您创建了一个 bufferedImage 和一个直接缓冲区。然后,您使用 Graphics 将后台缓冲区的内容逐像素渲染到 bufferedImage。您需要额外的 buffer.get(); 因为它代表 alpha 值,并且您还需要 height - h 来翻转图像。

编辑:当然,当有您要查找的内容时,您需要阅读它。

您有多种选择:

  • 最后,当您想要的所有内容都已呈现时,触发一个 boolean 变量并直接从 display 方法调用它
  • 禁用自动缓冲区交换,从关键监听器调用 display() 方法,读取后台缓冲区并再次启用交换
  • 从按键监听器调用与在显示中调用的代码相同的代码

关于java - 在java OpenGL中从屏幕(视口(viewport))导出图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36695614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com