GO语言图找图,加鼠标双击
  bAB2KcLKpirZ 2023年11月02日 71 0

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("鼠标已经双击")
}

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  KRsXEGSB49bk   2023年11月24日   39   0   0 Server客户端加载
  oIa1edJoFmXP   2023年11月19日   25   0   0 加载css进度条
  jnZtF7Co41Wg   2023年11月28日   19   0   0 nginx文件名linux命令
  eHipUjOuzYYH   2023年12月06日   22   0   0 nginx加载IPV6
  U9ElBp9F5cmM   2023年11月19日   22   0   0 文件系统linux文件名