Java:从 Graphics 中获取图像并将其转换为临时 BufferedImage

标签 java swing model bufferedimage graphics2d

大家好,我正在制作一个 2D 游戏,我从 4 个预设图像生成了一个随机的草地背景。我的问题是,我的游戏使用以下代码从游戏开始时创建的数组中绘制每个图像:

    public static void createBackground() {
    for(int x = 0; x < 640; x+= 32) {
        for(int y = 0; y < 496; y+= 32) {
            random = new Random();
            int grassTex = random.nextInt(grassTextures.size());

            grassPos.add(grassTextures.get(grassTex));
        }
    }
}

工作正常,但问题就出在这里。我正在使用这个重新绘制放入该数组的每个图像:

    public static void paintBackground(Graphics g) {
    counter = 0;
    for(int x = 0; x < 640; x+= 32) {
        for(int y = 0; y < 496; y+= 32) {
            random = new Random();

            int grassTex = random.nextInt(grassTextures.size());
            g.drawImage(grassPos.get(counter), x, y, null);
            counter++;

        }
    }

}

这会导致 fps 下降(下降幅度不大,但很明显)。无论如何,我可以将所有这些草图像绘制到一个 BufferedImage 中,以便只绘制一个图像吗?或者有更有效的方法吗?

谢谢。

最佳答案

如您所问,没有办法获取“来自 Graphics 的图像”,但是创建 BufferedImage 然后将图像绘制到其中并不是很难。如果有的话,AWT 的成像模型非常复杂,您必须构建一些辅助数据结构和东西,但这里有一个创建 32 位 RGBA 图像的模板:

private static final ComponentColorModel colormodel =
    new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB),
                            new int[] {8, 8, 8, 8}, true, false,
                            ComponentColorModel.TRANSLUCENT, DataBuffer.TYPE_BYTE);
public static BufferedImage makeimage(int w, int h) {
    WritableRaster buf = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, w, h, 4, null);
    return(new BufferedImage(colormodel, buf, false, null));
}

一旦您拥有由 makeimage() 创建的 BufferedImage,只需对其调用 getGraphics() 并随心所欲地绘制。

关于Java:从 Graphics 中获取图像并将其转换为临时 BufferedImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9238866/

相关文章:

java - 尝试从 Java EE 应用程序使用 SOAP WS 时出现 401 未经授权

java - 绘制用自己的 Painter 创建的 JPanel

MongoDB:用户和事件的嵌入式或规范化数据模型

python - SQLAlchemy:filter_by with like() on foreign attribute

java - 如何检查 Storm 拓扑是否已在 Java 中加载、启动和运行

java - 如何使用 javafx/css 和 fxml 将 StackPane 节点的背景颜色设置为透明

java - Swing (AWT) 识别绘制的形状

Java mouseListener 的 mousemove 不工作

java - 使 JOptionPane 消失

php - 在cakephp中删除多级(链删除)