我在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)?
答案 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 );
}