是否有更快的方式来获取屏幕截图中的颜色?

时间:2012-05-19 05:26:15

标签: java image image-processing screenshot awtrobot

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

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是一个机器人,我用它来查找屏幕上像素的颜色。 xy应该是自我解释的。

谢谢Mikera!这是我根据你的答案得到的最终结果:

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显然找到了像我想要的黑色像素的值。

1 个答案:

答案 0 :(得分:3)

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

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

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