有没有更快的方法来获取屏幕截图中的颜色?

joc*_*pa3 5 java screenshot image image-processing awtrobot

我有一段代码,它的作用是找到图像(或屏幕的一部分)的颜色,如果 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());}
}
Run Code Online (Sandbox Code Playgroud)

必须有一种更快的方法来使用上面的值来做到这一点。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());}
}
Run Code Online (Sandbox Code Playgroud)

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

mik*_*era 4

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

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

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