BufferedImage INT / 4BYTE / USHORT

时间:2011-05-13 01:26:35

标签: java performance image types bufferedimage

我知道字节,无符号短整数和整数之间的内存使用量的差异,但是当涉及到BufferedImage时,它们之间是否存在“速度”差异?

我一直在我的代码中使用Image类型来存储图像,但我需要一个alpha图层。使用BufferedImage为我提供了ARGB,但是从Image类型进行更改之后我的代码是/相当/更慢(并且它只针对几个对象进行了更改),所以我正在寻找可以获得的所有性能改进。登记/>
我不确定这个问题有多愚蠢,所以我感谢你回复任何回复。

1 个答案:

答案 0 :(得分:2)

棚木,

我发现,当需要在BufferedImage中使用alpha通道时,最好的是预乘alpha通道。例如:

// Create an ARGB image
BufferedImage bi = new BufferedImage(512, 512, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = bi.createGraphics();
// Fill the background (for illustration)
g.setColor(Color.black);
g.fill(new Rectangle(0, 0, 512, 512));

AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f));
// Keep the original composite
Composite original = g.getComposite();
g.setComposite(alpha);

// Paint with transparency
Rectangle r = new Rectangle(100, 200, 50, 50);
g.setColor(Color.magenta);
g.fillRect(r);
g.setComposite(original);
// ... paint further shapes or images as necessary
// ...
g.dispose();

// Convert to a premultiplied alpha image for fast painting to a Canvas
BufferedImage biPre = new BufferedImage(512, 512, BufferedImage.TYPE_INT_ARGB_PRE);
Graphics2D gPre = biPre.createGraphics();
gPre.drawImage(bi, 0, 0, null);
gPre.dispose();

// clean up:
bi.flush();


// Now use biPre for painting to a Canvas, or a Component.
// ...

// Remember to flush it when done!
biPre.flush();

首先绘制到TYPE_INT_ARGB的原因是为了确保所有alpha都按预期绘制(不是每次都预先乘以!)。然后,完成后,将整个图像绘制到TYPE_INT_ARGB_PRE上,然后能够以良好的速度将数据带到屏幕上。