Java 如何有效地为BuffereImage中的像素着色?
我使用下面的代码对图像中的所有像素进行迭代,并在像素上绘制一个红色1x1正方形,该正方形在某个RGB公差范围内。我想有更有效的方法吗?任何想法都值得赞赏。(Java 如何有效地为BuffereImage中的像素着色?,java,Java,我使用下面的代码对图像中的所有像素进行迭代,并在像素上绘制一个红色1x1正方形,该正方形在某个RGB公差范围内。我想有更有效的方法吗?任何想法都值得赞赏。(bi是一个buffereImage和g2是一个Graphics2D,其颜色设置为color.RED) Color targetColor=新颜色(selectedRGB); 对于(int x=0;x
bi
是一个buffereImage
和g2
是一个Graphics2D
,其颜色设置为color.RED
)
Color targetColor=新颜色(selectedRGB);
对于(int x=0;x=targetRed-tolled)和&(像素红色=targetGreen-tolgree)和&(像素绿色=targetBlue-tolgree)和&(像素蓝色)
BufferedImage
的setRGB
方法的第三个参数,如Javadoc中所述,采用TYPE_INT_ARGB
形式的像素
- 8位用于alpha(此处为FF,完全不透明)
- 红色分量的8位(此处为FF,完全闪烁的红色)
- 绿色组件的8位(0,无绿色)
- 蓝色分量为8位
@Ed Taylor:现在,请务必为图像的每一个像素创建一种新颜色:这正是人们扼杀Java程序性能的方式。对于一张1920x1200的图片,您将创建200多万个颜色对象。这是一种浪费(我知道,我知道,对象的寿命很短,但是:如果你能在一瞬间轻松地避开创建200万个对象,那么一定要避开它;)嗯,在使用setRGB运行算法后,我看不到任何红色像素,甚至在调用repaint()后也看不到。也许这是微不足道的…我明天将对此进行进一步调查。问题解决了,我忘记在重新绘制之前更新新图像的引用。setRGB方法有效,但我看不到任何显著的性能改进。
Color targetColor = new Color(selectedRGB);
for (int x = 0; x < bi.getWidth(); x++) {
for (int y = 0; y < bi.getHeight(); y++) {
Color pixelColor = new Color(bi.getRGB(x, y));
if (withinTolerance(pixelColor, targetColor)) {
g2.drawRect(x, y, 1, 1);
}
}
}
private boolean withinTolerance(Color pixelColor, Color targetColor) {
int pixelRed = pixelColor.getRed();
int pixelGreen = pixelColor.getGreen();
int pixelBlue = pixelColor.getBlue();
int targetRed = targetColor.getRed();
int targetGreen = targetColor.getGreen();
int targetBlue = targetColor.getBlue();
return (((pixelRed >= targetRed - tolRed) && (pixelRed <= targetRed + tolRed)) &&
((pixelGreen >= targetGreen - tolGreen) && (pixelGreen <= targetGreen + tolGreen)) &&
((pixelBlue >= targetBlue - tolBlue) && (pixelBlue <= targetBlue + tolBlue)));
}
if (withinTolerance(pixelColor, targetColor)) {
bi.setRGB( x, y, 0xFFFF0000 )
}