我正在设计一个Canvas对象,用于绘制尺寸为228x262像素的BufferedImage。
该图像是使用Graphics2D.drawImage(...)方法绘制的。我正在给定的偏移范围内进行像素基色操作。以下代码示例:
for( int i = frameOffset; i < colorClock; i++ ) {
rgb[i] = new Color(this.colorBK).getRGB();
}
其中 rbg 设置为我正在改变的bufferedimage 问题是代码绘制速度慢。
我正在使用GraphicsConfiguration.createCompatibleImage创建图像,我正在通过缓冲策略使用双缓冲。
好吗?
感谢adv。
答案 0 :(得分:1)
如果每次绘制图像时都运行循环,则循环可能是瓶颈。有一个完全不必要的对象分配,这将使垃圾收集器经常运行。
我假设colorBK是int。如果是这种情况,您只需创建并初始化Color对象并要求它返回分配给rgb数组的rgb值。实际发生的是你在rgb数组中分配colorBK的值。因此,等效且更有效的实现将是rgb [i] = colorBK。
为了进一步优化,您可以将colorBK的值分配给最终的局部变量。这样可以避免一遍又一遍地获取字段的值。所以循环可能如下所示:
final int color = colorBK;
for( int i = frameOffset; i < colorClock; i++ ) {
rgb[i] = color;
}
为了获得更多的性能提升,您应该认为,如果有完全不同的方式来做到这一点。由于上面的示例只是将某些像素更改为某种颜色,我可以假设这可以通过图像和几个fillRect来完成。
因此,您可以使用所需的颜色(在本例中为colorBK)填充图像后面的矩形。如果图像在这些区域中具有透明像素,则上述循环改变它们在画布中保持不变并且获得相同的效果。这可能更有效,因为图形方法得到了更好的优化,并且不涉及大量阵列使用。
答案 1 :(得分:0)
不要仅为图像中的每个像素提取RGB整数来创建新颜色。我可以为Color找到的唯一一个参数构造函数是一个采用int RGB的构造函数 - 你不能直接使用colorBK吗?
另外,如果你在每一个慢速的油漆上进行这种转换;你应该只需要进行一次转换。