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

时间:2012-02-11 08:28:02

标签: 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中,这样它只能绘制一个图像吗?或者有更有效的方法吗?

感谢。

1 个答案:

答案 0 :(得分:3)

如你所知,没有办法从“图形”中获取“图像”,但是创建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()并绘制你内心的内容。