猿问

画布到图像绘制不成功

第一个代码片段是我的主要渲染方法。我正在创建缓冲区策略,然后 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();

    }

}


函数式编程
浏览 186回答 1
1回答

德玛西亚99

您无法对对象使用普通操作来截取屏幕截图Graphics¹。如果您的系统支持它,您可以使用 AWTRobot类,即它的方法createScreenCapture来创建屏幕截图。对于不支持读回屏幕数据的系统,最好的选择是设计应用程序,以便Graphics在屏幕缓冲区中渲染和在离屏图像中渲染时可以在两种上下文中使用相同的渲染例程(在 上操作)被拯救。这可能无法始终重现准确的图像,但这是您在此类系统上可以获得的最佳图像。¹ 可以通过一些技巧,例如实现自定义Composite,记录传入数据,但实现起来比使用Robot和经历相同的限制要复杂得多,即它仍然不能在所有平台上工作。
随时随地看视频慕课网APP

相关分类

Java
我要回答