GO语言图找图加鼠标双击

GO语言图找图,加鼠标双击

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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("鼠标已经双击")
}

转载:https://blog.51cto.com/dxbp/7908172