1

我在 a 上画了一堆瓷砖Canvas,这些瓷砖由Images 或BufferedImages 表示。

我注意到我用Images 获得毫秒级的绘制,但是我开始使用BufferedImages 作为瓷砖的帧时间天空火箭到 20 毫秒以上。

BufferedImage buffered = ImageIO.read(new File(fileName));
Image image = Toolkit.getDefaultToolkit().createImage(fileName);

这两个图像都支持 Alpha 通道。我想开始使用 alpha 能力Image的中间缓冲区。但是,除了此 Toolkit 调用以从文件创建一个之外,我还没有在 jdk 中找到可以生成它们的位置。

基本上有人知道如何从头开始创建一个可以支持 alpha 的空白图像(不是 BufferedImage)吗?

4

2 回答 2

9

直接回答你的问题:

// Create a empty BufferedImage which supports alpha
// It will be just as fast a Toolkit image
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

一些背景:

这一切都归结为您正在使用的 BufferedImage 类型。BufferedImage 提供了一个构造函数,您可以在其中指定类型(INT_ARGB、4BYTE_ARGB 等)。使用 ImageIO 时,您无法控制用于构建 BufferedImage 的类型。ImageIO 使用自定义类型“0”。TYPE 控制图像数据在内存中的存储/访问方式,这在很大程度上影响了图像如何绘制/复制/blitted 到屏幕(或其他图像)。

我根据您的代码创建了一个简单的测试,并且 BufferedImage 总是呈现非常缓慢。我使用 TYPE_INT_ARGB 创建了第二个 BufferedImage,并将第一个 BufferedImage(来自 ImageIO)复制到其中。此 TYPE_INT_ARGB BufferedImage 以与 Toolkit 图像相同的速度呈现。

于 2010-02-16T16:23:35.310 回答
2

您可以使用旧的 ImageConsumer/ImageProducer API 来创建包含您想要的任何内容的 Image 对象。

这将从pix数组中具有给定宽度和高度的 ARGB 像素创建一个 Image 对象:

public static Image createImage( int width, int height, int[] pix )
{
    return createImage( width, height, pix, 0, width );
}

public static Image createImage( int width, int height, int[] pix, int offs, int scan )
{
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    ImageProducer source = new MemoryImageSource( width, height, pix, offs, scan );
    return toolkit.createImage( source );
}
于 2010-02-16T15:01:39.293 回答