我知道字节,无符号短整数和整数之间的内存使用量的差异,但是当涉及到BufferedImage时,它们之间是否存在“速度”差异?
我一直在我的代码中使用Image类型来存储图像,但我需要一个alpha图层。使用BufferedImage为我提供了ARGB,但是从Image类型进行更改之后我的代码是/相当/更慢(并且它只针对几个对象进行了更改),所以我正在寻找可以获得的所有性能改进。登记/>
我不确定这个问题有多愚蠢,所以我感谢你回复任何回复。
答案 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上,然后能够以良好的速度将数据带到屏幕上。