[英]Canvas to image drawing not successful
第一个代码段是我的主要渲染方法。 我正在创建缓冲策略,然后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();
}
}
您不能在Graphics
对象上使用常规操作来截屏。
如果您的系统支持,则可以使用AWT Robot
类,即其方法createScreenCapture
创建屏幕截图。
对于不支持回读屏幕数据的系统,最好的选择是设计应用程序,以便在屏幕缓冲区中进行渲染和在屏幕外进行渲染时,可以在两种情况下使用相同的渲染例程(在Graphics
)。要保存的图像。 这可能并不总是重现精确的图像,但是在这种系统上是最好的。
¹可以通过一些技巧来实现,例如实现自定义Composite
,记录传入的数据,但是实现起来比使用Robot
并受到相同的限制要复杂得多,也就是说,它仍然无法在所有平台上正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.