GO语言图找图,加鼠标双击
package main
import (
"fmt"
"github.com/go-vgo/robotgo"
"github.com/kbinani/screenshot"
"gocv.io/x/gocv"
"image"
"image/color"
"image/png"
"os"
)
// captureScreen 从主显示器中截取屏幕图像
func captureScreen() (*image.RGBA, error) {
// 设置截图区域
bounds := image.Rect(800, 600, 0, 0)
// 截取屏幕图像
img, err := screenshot.CaptureRect(bounds)
if err != nil {
return nil, fmt.Errorf("无法截取屏幕图像: %v", err)
}
// 转换成RGBA格式图像
return toRGBA(img), nil
}
// toRGBA 将图像转换为RGBA格式
func toRGBA(img image.Image) *image.RGBA {
bounds := img.Bounds()
rgba := image.NewRGBA(bounds)
for x := bounds.Min.X; x < bounds.Max.X; x++ {
for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
c := img.At(x, y)
r, g, b, a := c.RGBA()
rgba.SetRGBA(x, y, color.RGBA{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)})
}
}
return rgba
}
// saveImage 将图像保存为PNG格式文件
func saveImage(img image.Image, filename string) error {
file, err := os.Create(filename)
if err != nil {
return err
}
defer file.Close()
err = png.Encode(file, img)
if err != nil {
return err
}
return nil
}
// findImageInScreen 在屏幕上寻找目标图片,并返回其坐标
func findImageInScreen(targetImagePath string) (image.Point, error) {
// 截取屏幕图像
screenImg, err := captureScreen()
if err != nil {
return image.Point{}, fmt.Errorf("无法截取屏幕图像: %v", err)
}
// 保存图像到临时文件
tmpFilename := "images\\search.png" // 修改为实际路径和文件名
err = saveImage(screenImg, tmpFilename)
if err != nil {
return image.Point{}, fmt.Errorf("无法保存截图:%v", err)
}
defer os.Remove(tmpFilename)
// 加载目标图片
targetImage := gocv.IMRead(targetImagePath, gocv.IMReadColor)
if targetImage.Empty() {
return image.Point{}, fmt.Errorf("无法读取目标图片")
}
defer targetImage.Close()
// 加载待搜索的图片
searchImage := gocv.IMRead(tmpFilename, gocv.IMReadColor)
if searchImage.Empty() {
return image.Point{}, fmt.Errorf("无法读取搜索图片")
}
defer searchImage.Close()
result := gocv.NewMat()
defer result.Close()
// 在搜索图片中寻找目标图片
gocv.MatchTemplate(searchImage, targetImage, &result, gocv.TmCcoeffNormed, gocv.NewMat())
_, _, _, maxLoc := gocv.MinMaxLoc(result)
return maxLoc, nil
}
func main() {
// 加载目标图片的路径
targetImagePath := "images\\target.png" // 修改为实际路径和文件名
// 在屏幕上寻找目标图片
loc, err := findImageInScreen(targetImagePath)
if err != nil {
fmt.Println("无法在屏幕上寻找目标图片:", err)
return
}
// 打印目标图片在屏幕上的坐标
fmt.Printf("目标图片在屏幕上的坐标:(X:%d, Y:%d)\n", loc.X, loc.Y)
// 将鼠标移动到目标图片所在的位置,并执行鼠标双击操作
robotgo.MoveMouse(loc.X, loc.Y)
robotgo.MouseClick("left", true)
fmt.Println("鼠标已经双击")
}