繁体   English   中英

画布到图像绘制不成功

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM