如何在Java中测试特定颜色的bufferedimage像素

时间:2015-02-05 02:42:15

标签: java image pixel bufferedimage

我正在尝试截取屏幕截图,然后查看具有特定颜色的像素。首先,我试图在某个xy坐标处打印图像的颜色,但我甚至都做不到。我做错了什么?

static int ScreenWidth;
static int ScreenHeight;
static Robot robot;

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic 
    callibrateScreenSize();
    findSquares();
    //takeScreenShot();

    try {
        Thread.sleep(1000);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

public static void callibrateScreenSize() {

    try {
        Rectangle captureSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
        ScreenWidth = captureSize.width;
        ScreenHeight = captureSize.height;
        System.out.println("Width is " + ScreenWidth);
        System.out.println("Height is " + ScreenHeight);
    } catch (Exception e) {
        e.printStackTrace();
    }
    //return null;
}

public static BufferedImage takeScreenShot() {
    Rectangle captureSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
    BufferedImage image = robot.createScreenCapture(captureSize);
    return image;
}

public static void findSquares() {
    System.out.println(takeScreenShot().getRGB(5,5));
}

感谢!

2 个答案:

答案 0 :(得分:2)

您可以使用BufferedImage#getRGBbyte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData()来获取像素数据。 getRBG更方便,但通常比获取像素数组

getRGB将像素数据打包到intgetData会在数组的每个条目(R = n; G = n+1; B=n+2(, A=n+3))中返回RGB(A),因此需要自己处理

您可以使用java.awt.Color,它允许您访问颜色的RGB值,将其打包为int值或将int转换为Color < / p>

Color color = new Color(bufferedImage.getRGB(0, 0), true);
int redColor = Color.RED.getRGB();

this question的答案提供了处理byte[]像素数据

的示例

基本上,您需要循环数据,将图像中的值与您之后的值进行比较,直接(比较红色,绿色和蓝色值)或间接比较打包intColor值。

就个人而言,我抓取像素数据,将每个元素转换为int并将其与int对象中之前打包的Color进行比较,这样就创造了更少的数据短寿命物体的数量,应该是合理有效的

您可以查看使用getRGB的{​​{3}}来获取给定像素的红色,绿色,蓝色值

答案 1 :(得分:0)

这是我前一段时间使用Robot类编写的内容。它返回一个屏幕数组,无论屏幕是白色的,它对我的​​应用程序来说计算成本不是很高,但我发现使用机器人单独探测这些值。起初我甚至没有看过你的问题,但回头看,我认为这会对你有所帮助。祝好运。然后我看到了原来的发布日期......

public boolean[][] raster() throws AWTException, IOException{
   boolean[][] filled= new boolean[720][480];
  BufferedImage image = new Robot().createScreenCapture(new Rectangle(0,0,720,480));
//accepts (xCoord,yCoord, width, height) of screen
    for (int n =0; n<720; n++){
          for (int m=0; m<480; m++){
              if(new Color(image.getRGB(n, m)).getRed()<254){   
//can check any rgb value, I just chose red in this case to check for white pixels    
                  filled[n][m]=true;
              }
          }
        }
      return filled;
}