Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在BuffereImage中查找具有容差的颜色_Java_Colors_Awt_Rgb_Awtrobot - Fatal编程技术网

Java 在BuffereImage中查找具有容差的颜色

Java 在BuffereImage中查找具有容差的颜色,java,colors,awt,rgb,awtrobot,Java,Colors,Awt,Rgb,Awtrobot,我正在编写一个方法,尝试在BuffereImage中查找颜色。目前,这种方法的工作原理是先取一个屏幕盖,然后扫描图像以获得特定的颜色。现在我想添加一些RGB公差,因此如果用户试图找到公差为1的颜色(1、3、5),任何颜色+-1 R、B或G都将返回true 我可以通过首先生成一个RGB值的数组列表来解决这个问题,然后对于每个像素,我可以遍历数组并检查每个值。问题是,对于大图像的高公差,这可能会变得非常缓慢 有没有一种更有效的或可能是内置的方法可以做到这一点?这是我目前的方法。谢谢大家! publi

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

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

有没有一种更有效的或可能是内置的方法可以做到这一点?这是我目前的方法。谢谢大家!

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);
}
publicstaticpointfindcolor(框搜索区域,int颜色){
系统输出打印(“测试”);
BuffereImage image=generateScreenCap(搜索区域);
对于(int i=0;i

编辑:我在所有比较中都使用int RGB值,因此我使用Color.getRGB()而不是Color[1,1,1],它返回一个负int,为便于最终用户使用,我将其转换为正int。

如果想要自定义公差,您需要比较RGB值,而不是“整个”颜色。下面是代码,它没有经过测试,但您知道了:

public static Point findColor(Box searchArea, int r, int g, int b, int tolerance){
    System.out.println("Test");

    // 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);
}
public static Point findColor(框搜索区域,int r,int g,int b,int公差){
系统输出打印(“测试”);
//循环外的预计算RGB“公差”值(最小值为0,最大值为255)
int minR=Math.max(r-公差,0);
int minG=数学最大值(g-公差,0);
int minB=Math.max(b-公差,0);
int maxR=Math.min(r+公差,255);
int maxG=Math.min(g+公差,255);
int maxB=数学最小值(b+公差,255);
BuffereImage image=generateScreenCap(搜索区域);
对于(int i=0;i>16)&0x000000FF;
int绿色=(颜色>>8)&0x000000FF;
蓝色整数=(颜色)&0x000000FF;

如果((红色>=minR&&red=minG&&green=minB&&blue为什么在大图像上进行高公差检查会比较慢?@ForguesR在800x600图像中,需要检查的像素数为48万。在每个像素中检查一种颜色是可以的,速度很好,但是想象一下在48万像素中检查100种不同的颜色,突然之间它是100x慢。在这个项目中,效率是一个非常重要的优先事项,所以如果有一种方法可以更快地完成这项工作,那将是一件了不起的事情。您将RGB值作为一个“整体”进行比较用一个int,我猜,就是你要找的颜色。你为什么不比较RGB值呢?@ForguesR是的,我猜这就是我要找的,我猜,这是一种快速查找[R,G,B]为[x+-公差,y+-公差,z+-公差]的任何颜色的方法。我的最佳选择是只使用循环来比较
颜色吗?它不起作用,但我有了这个想法,我应该能够塑造和塑造方法,使其达到我想要的效果。谢谢!很高兴我能提供帮助。你能告诉我什么不起作用吗?现在当搜索我的样本中不存在的颜色时,我返回0,因此非常有用rst检查通过,即使我搜索的颜色不存在,但我现在正在排除故障,希望这是一个小问题Math.min's应该是我的。max's,Math.max我相信,让我检查一下