java - 在缓冲图像中查找具有容差的颜色

标签 java colors awt rgb awtrobot

我正在编写一个方法,尝试在 bufferedImage 中查找颜色。目前,该方法的工作原理是拍摄屏幕截图,然后扫描图像以获取特定颜色。现在我想添加一些 RGB 容差,因此如果用户尝试查找容差为 1 的颜色 (1, 3, 5),任何颜色 +-1 R、B 或 G 都将返回 true。

我可以通过首先生成有效的 RGB 值的 arrayList 来解决这个问题,然后对于每个像素,我可以遍历该数组并检查每个值。问题是对于大图像的高容差可能会变得非常慢。

是否有更有效或可能内置的方式可以做到这一点?这是我现在的方法。谢谢!

public static Point findColor(Box searchArea, int color){
    System.out.println("Test");
    BufferedImage image = generateScreenCap(searchArea);
    for (int i = 0; i < image.getWidth(); i++) {
        for (int j = 0; j < image.getHeight(); j++) {
            if((image.getRGB(i, j)*-1)==color){
                return new Point(i + searchArea.x1, j + searchArea.y1);
            }
        }
    }
    return new Point(-1, -1);
}

编辑:我使用 int RGB 值进行所有比较,因此我使用 Color.getRGB() 代替 Color[1, 1, 1],它返回一个负整数,为了简化最终用户,我将其转换为正整数.

最佳答案

如果您想要自定义容差,则需要比较 RGB 值而不是“整体”颜色。这是代码,尚未经过测试,但您明白了:

public static Point findColor(Box searchArea, int r, int g, int b, int tolerance) {
    // Pre-calc RGB "tolerance" values out of the loop (min is 0 and max is 255)
    int minR = Math.max(r - tolerance, 0);
    int minG = Math.max(g - tolerance, 0);
    int minB = Math.max(b - tolerance, 0);
    int maxR = Math.min(r + tolerance, 255);
    int maxG = Math.min(g + tolerance, 255);
    int maxB = Math.min(b + tolerance, 255);

    BufferedImage image = generateScreenCap(searchArea);
    for (int i = 0; i < image.getWidth(); i++) {
        for (int j = 0; j < image.getHeight(); j++) {
            // get single RGB pixel
            int color = image.getRGB(i, j);

            // get individual RGB values of that pixel
            // (could use Java's Color class but this is probably a little faster)
            int red = (color >> 16) & 0x000000FF;
            int green = (color >> 8) & 0x000000FF;
            int blue = (color) & 0x000000FF;  

            if ( (red >= minR && red <= maxR) &&
                 (green >= minG && green <= maxG) &&
                 (blue >= minB && blue <= maxB) ) 
                return new Point(i + searchArea.x1, j + searchArea.y1);
        }
    }
    return new Point(-1, -1);
}

关于java - 在缓冲图像中查找具有容差的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24718815/

相关文章:

Java:查看小程序是否显示在屏幕上

java - 如何在 CXF 的 READ 阶段从 SoapMessage 中提取请求的操作名称?

java - Apache 弗林克 : Return type of function could not be determined automatically due to type erasure

xaml - 如何更改组合框下拉背景?

css - 仅将 css 应用于数字

colors - 使用 Color 包从 RGB 值创建新的颜色?

java paint(g)、repaint()、update(g) 后端和本地重绘

java - 原子变量是否保证 - "happens before relationship"?

java - 如何在myBatis中使用selectKey一次向2个表插入数据

java - 如何使用KeyListener