Я написал небольшую программу на Java, чтобы найти заданное изображение на экране и вернуть его координату.Программа компилируется просто отлично, но по некоторым причинам она не смогла найти изображение.
это выглядит примерно так:
программа получает буферизованное изображение в качестве ввода
Изображение должно быть примерно таким:
![image would be something like this](https://i.stack.imgur.com/Q9UTi.png)
следующий код для создания снимка экрана
screen= new Robot().createScreenCapture(new r
rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
Пример снимка экрана:
![sample screenshot of screen](https://i.stack.imgur.com/hJ9pU.png)
(в идеале программа должна вернуть координатуиконки Google Chrome)
программа пытается найти изображение, перебирая каждый пиксель на экране и пытаясь сопоставить его с пикселями данного изображения с помощью четырехугольника для цикла
for(int x = 0; x< screen.getWidth()-image.getWidth();x++){
for(int y = 0; y< screen.getHeight()-image.getHeight();y++) {
w=x,h=y;
//a new rectangle is "drawn" reset the flag
for(int a = 0; a< image.getWidth();a++){
for(int b = 0; b< image.getHeight();b++){
//checks that pixel in screen matches the same pixel in the
//image. if yes increment h value. if no change flag to true
//and breaks the loop
}
//checks the flag if true breaks loop other wise increment w
//value value
}
//here is the end of the "rectangle trial", if the image checks out
//the coordinate (w,h) will be the bottom right pixel of the image in
//screen. take that coordinate and return it
}
}
after checking every pixels return coordinate (-1,-1) so that i know image doesnt exisit in the screen
Идея состоит в том, что я сопоставляю каждый пиксель на экране (за исключением пикселей, которые находятся справа и снизу) с пикселями на изображении.(представьте, что прямоугольник размером с изображение рисуется для каждого пикселя экрана, начиная со шнура (0,0), и если какой-либо пиксель в прямоугольнике не совпадает с пикселем с той же координатой в изображении, цикл forсломается, и программа переходит к следующему пикселю на экране)
следующий код - это то, что внутри циклов for
for(int x = 0; x< screen.getWidth()-image.getWidth();x++){
for(int y = 0; y< screen.getHeight()-image.getHeight();y++){//screen sized iteration
f=x;
g=y;
flag=false;
for(int a = 0; a< image.getWidth();a++){
for(int b = 0; b< image.getHeight();b++){//image sized
if(screen.getRGB(f,g) != image.getRGB(a,b)){
flag=false;
break;
}
else{
g++;
}
}
if(flag){
break;
}else{
f++;
}
}
if(!flag) {
returnCoords=new Coords(f-image.getWidth()/2,g-
image.getHeight()/2);
return returnCoords;
}
}
}
return returnCoords;
}
программа должна вывести центральную координату изображения, еслиэто будет частью экрана.если это не часть экрана, программа возвращает (-1.0, -1.0).однако, независимо от того, какое изображение я ввожу (44,0, -50,0), это координата, которую оно возвращает
ниже - скомпилированный код
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.AWTException;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
public class ImageScanner {
public static void main(String[] args) throws AWTException, IOException{
BufferedImage image = ImageIO.read(new File("C:\\Users\\Tony\\Desktop\\my projects\\Capture.PNG"));
Coords x=ImageScanner.scanImage(image);
Robot robot = new Robot();
robot.mouseMove((int)(x.getX()),(int)(x.getY()));
}
public static class Coords{
int x;
int y;
public Coords(int width,int height){
x=width;
y=height;
}
public int getX() {
return this.x;
}
public int getY() {
return this.y;
}
}
public static Coords scanImage(BufferedImage image) throws IOException, HeadlessException, AWTException {
BufferedImage screen=null;
screen= new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
int f=0;
int g=0;
int mismatched=0;
ImageScanner.Coords returnCoords = new ImageScanner.Coords(-1,-1);
for(int x = 0; x< screen.getWidth()-image.getWidth();x++){
for(int y = 0; y< screen.getHeight()-image.getHeight();y++){//screen sized iteration
f=x;
g=y;
mismatched=0;
for(int a = 0; a< image.getWidth();a++){
for(int b = 0; b< image.getHeight();b++){//image sized
if(screen.getRGB(f,g) != image.getRGB(a,b)){
mismatched++;
}
else{
g++;
}
}
g=y;
f++;
}
if((mismatched/((float)image.getWidth()*(float)image.getHeight()))<0.2) {
returnCoords=new Coords(f-image.getWidth()/2,g+image.getHeight()/2);
return returnCoords;
}
}
}
return returnCoords;
}
}
Редактировать: Спасибо, программа теперь работает
вывод, который я получил