没有使用缓冲图像的alpha通道的java图像

时间:2010-02-16 14:54:43

标签: java image alpha

我在Canvas上绘制了一堆图块,这些图块由Image s或BufferedImage s表示。

我注意到即时毫秒使用Image进行毫秒绘制,但是我开始使用BufferedImage s作为拼贴时帧天空火箭的速度超过20毫秒。

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

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

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

2 个答案:

答案 0 :(得分:8)

直接回答您的问题:

// 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提供了一个构造函数,您可以在其中指定TYPE(INT_ARGB,4BYTE_ARGB等)。使用ImageIO时,您无法控制在构造BufferedImage时使用的类型。 ImageIO使用自定义类型“0”。 TYPE管理图像数据在存储器中的存储/访问方式,这在很大程度上影响了图像如何被绘制/复制/ blitting到屏幕(或其他图像)。

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

答案 1 :(得分:1)

您可以使用旧的ImageConsumer / ImageProducer API创建包含所需内容的图像对象。

这将使用给定宽度和高度的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 );
}