【问题标题】:How do I test a pixel of a bufferedimage for a certain color in Java如何在 Java 中测试某个颜色的缓冲图像的像素
【发布时间】:2015-02-05 02:42:15
【问题描述】:

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

谢谢!

【问题讨论】:

  • 你当前的代码有什么问题?
  • 你得到什么输出?
  • 对于输出,我得到了图片的尺寸,然后出现了错误

标签: java image pixel bufferedimage


【解决方案1】:

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

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

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

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

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

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

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

您可以查看this answer,它使用getRGB 从给定像素中获取红、绿、蓝值

【讨论】:

  • 哦,好吧,如果我想测试图片中的每个像素,我可以设置一个循环并使用Color 循环遍历所有像素并测试颜色?我现在唯一的问题是为什么打印出getRGB() 不起作用?另外,我如何测试非常具体的颜色?
  • getRGB 返回一个int(压缩像素),正如我所说,我将首先创建一个您想要查找的颜色的Color 并使用Color#getRGB 返回压缩int 该颜色的值。然后它将结果与来自BufferedImage#getRGB 的值进行比较
  • 为什么我无法在方法中运行它? Rectangle captureSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); BufferedImage image = robot.createScreenCapture(captureSize); Color color = new Color(image.getRGB(0, 0), true);
  • 你在哪里创建Robot的实例?
  • 课程开始时。现在我正在尝试使用 getRBG() 并根据朋友的建议使用位移和掩码检查颜色
【解决方案2】:

这是我不久前使用 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多