如何使用Java实现屏幕找图功能

如何使用Java实现屏幕找图功能,第1张

测试代码

[java] view plain copy

public static void main(String[] args) throws Exception {

findImage4FullScreen(ImageCognition.SIM_ACCURATE_VERY)

}

public static void findImage4FullScreen(int sim) throws Exception {

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize()

int w = (int) screenSize.getWidth()

int h = 200

Robot robot = new Robot()

BufferedImage screenImg = robot.createScreenCapture(new Rectangle(0, 0,

w, h))//对屏幕指定范围进行截图,保存到BufferedImage中

OutputStream out = new FileOutputStream("data/images/screen.png")

ImageIO.write(screenImg, "png", out)//将截到的BufferedImage写到本地

InputStream in = new FileInputStream("data/images/search.png")

BufferedImage searchImg = ImageIO.read(in)//将要查找的本地图读到BufferedImage

//图片识别工具类

ImageCognition ic = new ImageCognition()

List<CoordBean>list = ic.imageSearch(screenImg, searchImg, sim)

for (CoordBean coordBean : list) {

System.out.println("找到图片,坐标是" + coordBean.getX() + ","

+ coordBean.getY())

//标注找到的图的位置

Graphics g = screenImg.getGraphics()

g.setColor(Color.BLACK)

g.drawRect(coordBean.getX(), coordBean.getY(),

searchImg.getWidth(), searchImg.getHeight())

g.setFont(new Font(null, Font.BOLD, 20))

g.drawString("←找到的图片在这里",

coordBean.getX() + searchImg.getWidth() + 5,

coordBean.getY() + 10 + searchImg.getHeight() / 2)

out = new FileOutputStream("data/images/result.png")

ImageIO.write(screenImg, "png", out)

}

}

额外的类

CoordBean

package cn.xt.imgCongnition

public class CoordBean {

private int x

private int y

/**

* 获取x坐标

*

* @return x坐标

*/

public int getX() {

return x

}

public void setX(int x) {

this.x = x

}

/**

* 获取y坐标

*

* @return

*/

public int getY() {

return y

}

public void setY(int y) {

this.y = y

}

}

RgbImageComparerBean

package cn.xt.imgCongnition

/**

* RGB 相关,图片相似度计算时使用

*

*/

public class RgbImageComparerBean {

/****** 颜色值数组,第一纬度为x坐标,第二纬度为y坐标 ******/

private int colorArray[][]

/*** 是否忽略此点,若为true,则不纳入比较的像素行列。 ***/

private boolean ignorePx[][]

/**** 图片的宽高 ****/

private int imgWidth

private int imgHeight

// 图片的像素总数

private int pxCount

/**

* 获取图像的二维数组组成

*

* @return 图像的二维数组

*/

public int[][] getColorArray() {

return colorArray

}

/**

* 要对比的像素总数,会自动筛选掉不对比的颜色

*

* @param pxCount

*/

public void setPxCount(int pxCount) {

this.pxCount = pxCount

}

/**

* 设置颜色二维数组

*

* @param colorArray

*颜色二维数组,一维为x轴,二维为y轴

*/

public void setColorArray(int[][] colorArray) {

this.colorArray = colorArray

this.imgWidth = this.colorArray.length

this.imgHeight = this.colorArray[0].length

this.pxCount = this.imgWidth * this.imgHeight

}

/**

* 是否忽略此点,若为true,则不纳入像素比较行列。

*

* @return 具体x,y坐标的那个像素点

*/

public boolean[][] getIgnorePx() {

return ignorePx

}

/**

* 是否忽略此点,若为true,则不纳入像素比较行列。

*

* @param ignorePx

*具体x,y坐标的那个像素点

*/

public void setIgnorePx(boolean[][] ignorePx) {

this.ignorePx = ignorePx

}

/**

* 获取图像的宽度

*

* @return 图像宽度

*/

public int getImgWidth() {

return imgWidth

}

/**

* 获取图像的高度

*

* @return 图像高度

*/

public int getImgHeight() {

return imgHeight

}

/**

* 获取图像里像素的总数

*

* @return

*/

public int getPxCount() {

return pxCount

}

}

先获得图片左上角的颜色

去屏幕里,挨个点比较……如果颜色差距在一定范围内,就认定他相等,这样能找到N个点。

获得图片其他点颜色,根据偏移,去和刚刚的N的点位置附近,寻找匹配点

如果有一个点附近的颜色都和图片颜色匹配,那就是图了

如果没有匹配的,那就是没有~

吖……说的很通俗了,不知道能不能实现~我不会JAVA


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11434870.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存