5

我有一段代码,它的作用是找到图像(或屏幕部分)的颜色,如果 RG 和 B 颜色大于 127,它会将 1 放在 2D int 数组的相应位置。这是我现在拥有的部分,但它显然非常慢。有一个更好的方法吗?

private void traceImage(){
    try{
        Robot r = new Robot();
        b = new int[470][338];
        for(int y = 597; y < 597+469; y++)
        {
            for(int x = 570; x < 570+337; x++)
            {
                if(r.getPixelColor(x,y).getRed() > 127 &&
                   r.getPixelColor(x,y).getGreen() > 127 && 
                   r.getPixelColor(x,y).getBlue() > 127)
                {
                    b[y-597][x-570] = 1;
                }
                else
                {
                    b[y-597][x-570] = 0;
                }
            }
        }
    }
    catch(Exception ex){System.out.println(ex.toString());}
}

必须有一种更快的方法来使用上面的值来做到这一点。b是 int 数组,它在这个段中被初始化。r是我用来查找屏幕上像素颜色的机器人。x并且y应该是不言自明的。

谢谢米凯拉!这是我根据您的回答得到的最终结果:

private void traceActionPerformed(java.awt.event.ActionEvent evt) {
    try{
        Robot r = new Robot();
        BufferedImage image = r.createScreenCapture(new Rectangle(597,570,470,337));
        b = new int[image.getWidth()][image.getHeight()];
        for(int y=0;y<image.getWidth();y++){
            for(int x=0;x<image.getHeight();x++){
                if(image.getRGB(y,x)==-1){
                    b[y][x]=0;
                }
                else{
                    b[y][x]=1;                 
                }
            }
        }
        System.out.println("Done");
    }
    catch(Exception ex){System.out.println(ex.toString());}
}

if else 语句中的 -1 显然找到了我想要的黑色像素的值。

4

1 回答 1

4

您应该使用Robot.createScreenCapture() 一次性捕获整个子图像。

然后您将能够更快地查询子图像中的各个像素,例如使用BufferedImage.getRGB(x,y)

有趣的是,您的特定操作具有非常快速的按位实现:只需执行((rgb & 0x808080) == 0x808080)

于 2012-05-19T05:32:21.697 回答