joc*_*pa3 5 java screenshot image image-processing awtrobot
我有一段代码,它的作用是找到图像(或屏幕的一部分)的颜色,如果 RG 和 B 颜色大于 127,则将 1 放在 2D int 数组的相应位置。这是我现在拥有的部分,但显然非常慢。有一个更好的方法吗?
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());}
}
Run Code Online (Sandbox Code Playgroud)
必须有一种更快的方法来使用上面的值来做到这一点。b是 int 数组,它在此段中初始化。r是一个机器人,我用它来查找屏幕上像素的颜色。x并且y应该是不言自明的。
谢谢迈克拉!这是我根据您的回答得到的最终结果:
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());}
}
Run Code Online (Sandbox Code Playgroud)
if else 语句中的 -1 显然找到了我想要的黑色像素的值。
您应该使用Robot.createScreenCapture()一次性捕获整个子图像。
然后您将能够更快地查询子图像中的各个像素,例如使用BufferedImage.getRGB(x,y)
有趣的是,您的特定操作有一个非常快的按位实现:只需执行((rgb & 0x808080) == 0x808080)
| 归档时间: |
|
| 查看次数: |
777 次 |
| 最近记录: |