如何在 Java 中针对特定颜色测试缓冲图像的像素

How do I test a pixel of a bufferedimage for a certain color in Java

我正在尝试截取屏幕截图,然后通过它查看具有特定颜色的像素。首先,我尝试只在某个 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));
}

谢谢!

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

getRGB 将像素数据打包成一个 intgetData 将 return 数组的每个条目中的 RGB(A) (R = n; G = n+1; B=n+2(, A=n+3) ), 所以需要自己处理

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

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

this question的回答提供了一个处理byte[]像素数据的例子

基本上,您需要遍历数据,将图像中的值与您想要的值进行直接比较(比较红色、绿色和蓝色值)或间接比较打包的 intColor 个值。

就我个人而言,我会抓取像素数据,将每个元素转换为 int 并将其与先前从 Color 对象打包的 int 进行比较,这会创建更少短期对象的数量,应该相当有效

你可以看一下 this answer,它使用 getRGB 从给定像素中获取红色、绿色、蓝色值

这是我不久前使用机器人 class 写的东西。它 returns 一个屏幕数组,只要屏幕是白色的,它对我的​​应用程序来说计算量不是很大,但我发现使用 robot 单独探测这些值是。起初我什至没有读你的问题,但回过头来看,我认为这会对你有很大帮助。祝你好运。然后我看到了原来的 post 日期...

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;
}