第一个代码片段是我的主要渲染方法。我正在创建缓冲区策略,然后 getState().render(g) 传递 Graphics 对象并调用一堆 g.drawImage() 方法,毕竟,调用 saveImage() 并生成完全黑色的图像(游戏截图)预期的)。第二个片段是将画布保存到图像。private void render() { bs = display.getCanvas().getBufferStrategy(); if (bs == null) { display.getCanvas().createBufferStrategy(3); return; } g = bs.getDrawGraphics(); g.clearRect(0, 0, width, height); if (State.getState() != null) State.getState().render(g); // this just calls g.drawImage many times saveImage(g); bs.show(); g.dispose();}这是我保存它的方式:private void saveImage(Graphics g) { BufferedImage image = new BufferedImage(getCanvas().getWidth(), getCanvas().getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D graphics = image.createGraphics(); display.getCanvas().paint(graphics); graphics.dispose(); try { FileOutputStream out = new FileOutputStream("snapshot.png"); ImageIO.write(image, "png", out); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }}
1 回答
德玛西亚99
TA贡献1770条经验 获得超3个赞
您无法对对象使用普通操作来截取屏幕截图Graphics
¹。
如果您的系统支持它,您可以使用 AWTRobot
类,即它的方法createScreenCapture
来创建屏幕截图。
对于不支持读回屏幕数据的系统,最好的选择是设计应用程序,以便Graphics
在屏幕缓冲区中渲染和在离屏图像中渲染时可以在两种上下文中使用相同的渲染例程(在 上操作)被拯救。这可能无法始终重现准确的图像,但这是您在此类系统上可以获得的最佳图像。
¹ 可以通过一些技巧,例如实现自定义Composite
,记录传入数据,但实现起来比使用Robot
和经历相同的限制要复杂得多,即它仍然不能在所有平台上工作。
添加回答
举报
0/150
提交
取消