我正在尝试截取屏幕截图,然后查看具有特定颜色的像素。首先,我试图在某个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));
}
感谢!
答案 0 :(得分:2)
您可以使用BufferedImage#getRGB
或byte[] 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
< / p>
Color color = new Color(bufferedImage.getRGB(0, 0), true);
int redColor = Color.RED.getRGB();
this question的答案提供了处理byte[]
像素数据
基本上,您需要循环数据,将图像中的值与您之后的值进行比较,直接(比较红色,绿色和蓝色值)或间接比较打包int
或Color
值。
就个人而言,我抓取像素数据,将每个元素转换为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;
}