我有一段代码,它的作用是找到图像的颜色(或屏幕的一部分),如果RG和B颜色大于127,则在2D int的相应位置放置1阵列。这是我现在的部分,但显然非常慢。有更好的方法吗?
private void traceImage(){
try{
Robot r = new Robot();
b = new int[470][338];
for(int y = 597; y < 597+469; y++)
{
for(int x = 570; x < 570+337; x++)
{
if(r.getPixelColor(x,y).getRed() > 127 &&
r.getPixelColor(x,y).getGreen() > 127 &&
r.getPixelColor(x,y).getBlue() > 127)
{
b[y-597][x-570] = 1;
}
else
{
b[y-597][x-570] = 0;
}
}
}
}
catch(Exception ex){System.out.println(ex.toString());}
}
使用上述值必须有更快的方法。 b
是int数组,它在此段中初始化。 r
是一个机器人,我用它来查找屏幕上像素的颜色。 x
和y
应该是自我解释的。
谢谢Mikera!这是我根据你的答案得到的最终结果:
private void traceActionPerformed(java.awt.event.ActionEvent evt) {
try{
Robot r = new Robot();
BufferedImage image = r.createScreenCapture(new Rectangle(597,570,470,337));
b = new int[image.getWidth()][image.getHeight()];
for(int y=0;y<image.getWidth();y++){
for(int x=0;x<image.getHeight();x++){
if(image.getRGB(y,x)==-1){
b[y][x]=0;
}
else{
b[y][x]=1;
}
}
}
System.out.println("Done");
}
catch(Exception ex){System.out.println(ex.toString());}
}
if else语句中的-1显然找到了像我想要的黑色像素的值。
答案 0 :(得分:3)
您应该使用Robot.createScreenCapture()一次捕获整个子图像。
然后,您将能够更快地查询子图像中的各个像素,例如使用BufferedImage.getRGB(x,y)
有趣的是,您的特定操作具有非常快速的按位实现:只需执行((rgb & 0x808080) == 0x808080)