第一个代码段是我的主要渲染方法。我正在创建缓冲策略,然后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();
}
}
答案 0 :(得分:1)
您不能在Graphics
对象¹上使用常规操作来截屏。
如果您的系统支持,则可以使用AWT Robot
类,即其方法createScreenCapture
创建屏幕截图。
对于不支持回读屏幕数据的系统,最好的选择是设计应用程序,以便在屏幕缓冲区和屏幕缓冲区中进行渲染时,可以在两种情况下使用相同的渲染例程(对Graphics
进行操作)。在要保存的屏幕外图像中渲染时。这可能并不总是能够重现精确的图像,但是在这种系统上可以得到最好的图像。
¹可以通过一些技巧来实现,例如实现自定义Composite
并记录传入的数据,但是实现起来比使用Robot
要复杂得多,并且要经受相同的限制,也就是说,它仍然无法在所有平台上正常工作。