Java 如何有效地为BuffereImage中的像素着色?

Java 如何有效地为BuffereImage中的像素着色?,java,Java,我使用下面的代码对图像中的所有像素进行迭代,并在像素上绘制一个红色1x1正方形,该正方形在某个RGB公差范围内。我想有更有效的方法吗?任何想法都值得赞赏。(bi是一个buffereImage和g2是一个Graphics2D,其颜色设置为color.RED) Color targetColor=新颜色(selectedRGB); 对于(int x=0;x

我使用下面的代码对图像中的所有像素进行迭代,并在像素上绘制一个红色1x1正方形,该正方形在某个RGB公差范围内。我想有更有效的方法吗?任何想法都值得赞赏。(
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 )
}