如何在 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#getRGB
或byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData()
获取像素数据。 getRBG
更方便,但通常比获取像素数组
慢
getRGB
将像素数据打包成一个 int
,getData
将 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[]
像素数据的例子
基本上,您需要遍历数据,将图像中的值与您想要的值进行直接比较(比较红色、绿色和蓝色值)或间接比较打包的 int
或 Color
个值。
就我个人而言,我会抓取像素数据,将每个元素转换为 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;
}
我正在尝试截取屏幕截图,然后通过它查看具有特定颜色的像素。首先,我尝试只在某个 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#getRGB
或byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData()
获取像素数据。 getRBG
更方便,但通常比获取像素数组
getRGB
将像素数据打包成一个 int
,getData
将 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[]
像素数据的例子
基本上,您需要遍历数据,将图像中的值与您想要的值进行直接比较(比较红色、绿色和蓝色值)或间接比较打包的 int
或 Color
个值。
就我个人而言,我会抓取像素数据,将每个元素转换为 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;
}