stm32 code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing.Imaging;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private struct POINT
{
private int x;
private int y;
}
static POINT point;

    [DllImport("user32.dll")]
    static extern bool SetCursorPos(int X, int Y);


    [DllImport("user32", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
    private static extern int GetDC(int hwnd);


    [DllImport("gdi32", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
    private static extern int GetPixel(int hdc, int x, int y);
    [DllImport("user32", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
    private static extern int ReleaseDC(int hwnd, int hdc);
    [DllImport("user32", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
    private static extern int WindowFromPoint(int x, int y);
    [DllImport("user32", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
    private static extern int ScreenToClient(int hwnd, ref POINT lppoint);

    [System.Runtime.InteropServices.DllImport("user32")]

    private static extern int mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
    //移动鼠标 
    const int MOUSEEVENTF_MOVE = 0x0001;
    //模拟鼠标左键按下 
    const int MOUSEEVENTF_LEFTDOWN = 0x0002;
    //模拟鼠标左键抬起 
    const int MOUSEEVENTF_LEFTUP = 0x0004;
    //模拟鼠标右键按下 
    const int MOUSEEVENTF_RIGHTDOWN = 0x0008;
    //模拟鼠标右键抬起 
    const int MOUSEEVENTF_RIGHTUP = 0x0010;
    //模拟鼠标中键按下 
    const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;
    //模拟鼠标中键抬起 
    const int MOUSEEVENTF_MIDDLEUP = 0x0040;
    //标示是否采用绝对坐标 
    const int MOUSEEVENTF_ABSOLUTE = 0x8000;
    //模拟鼠标滚轮滚动操作,必须配合dwData参数
    const int MOUSEEVENTF_WHEEL = 0x0800;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {


    }


    string path = @"C:\Users\李阳\Desktop\临时\deskpic.png";

    public List<System.Drawing.Point> FindPicture(string subPic , byte errorRange = 0, Rectangle searchRect = new System.Drawing.Rectangle(), double matchRate = 0.9, bool isFindAll = false)
    {
        List<System.Drawing.Point> ListPoint = new List<System.Drawing.Point>();
        var subBitmap = new Bitmap(subPic);

        Rectangle bounds = Screen.GetBounds(Point.Empty);

        // 创建一个bitmap对象并将其设置为屏幕大小
        using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
        {
            // 创建一个Graphics对象并将其设置为bitmap
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                // 将整个屏幕绘制到Graphics对象中
                g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
            }

            // 将截图保存为jpg文件
            bitmap.Save(path, System.Drawing.Imaging.ImageFormat.Png);
        }


        var parBitmap = new Bitmap(path);
        int subWidth = subBitmap.Width;
        int subHeight = subBitmap.Height;
        int parWidth = parBitmap.Width;
        int parHeight = parBitmap.Height;
        if (searchRect.IsEmpty)
        {
            searchRect = new Rectangle(0, 0, parBitmap.Width, parBitmap.Height);
        }
        var searchLeftTop = searchRect.Location;
        var searchSize = searchRect.Size;
        System.Drawing.Color startPixelColor = subBitmap.GetPixel(0, 0);
        var subData = subBitmap.LockBits(new Rectangle(0, 0, subBitmap.Width, subBitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        var parData = parBitmap.LockBits(new Rectangle(0, 0, parBitmap.Width, parBitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        var byteArrarySub = new byte[subData.Stride * subData.Height];
        var byteArraryPar = new byte[parData.Stride * parData.Height];
        Marshal.Copy(subData.Scan0, byteArrarySub, 0, subData.Stride * subData.Height);
        Marshal.Copy(parData.Scan0, byteArraryPar, 0, parData.Stride * parData.Height);
        var iMax = searchLeftTop.Y + searchSize.Height - subData.Height;//行
        var jMax = searchLeftTop.X + searchSize.Width - subData.Width;//列
        int smallOffsetX = 0, smallOffsetY = 0;
        int smallStartX = 0, smallStartY = 0;
        int pointX = -1; int pointY = -1;
        for (int i = searchLeftTop.Y; i < iMax; i++)
        {
            for (int j = searchLeftTop.X; j < jMax; j++)
            {
                //大图x,y坐标处的颜色值
                int x = j, y = i;
                int parIndex = i * parWidth * 4 + j * 4;
                var colorBig = System.Drawing.Color.FromArgb(byteArraryPar[parIndex + 3], byteArraryPar[parIndex + 2], byteArraryPar[parIndex + 1], byteArraryPar[parIndex]);
                ;
                if (ColorAEqualColorB(colorBig, startPixelColor, errorRange))
                {
                    smallStartX = x - smallOffsetX;//待找的图X坐标
                    smallStartY = y - smallOffsetY;//待找的图Y坐标
                    int sum = 0;//所有需要比对的有效点
                    int matchNum = 0;//成功匹配的点
                    for (int m = 0; m < subHeight; m++)
                    {
                        for (int n = 0; n < subWidth; n++)
                        {
                            int x1 = n, y1 = m;
                            int subIndex = m * subWidth * 4 + n * 4;
                            var color = System.Drawing.Color.FromArgb(byteArrarySub[subIndex + 3], byteArrarySub[subIndex + 2], byteArrarySub[subIndex + 1], byteArrarySub[subIndex]);
                            sum++;
                            int x2 = smallStartX + x1, y2 = smallStartY + y1;
                            int parReleativeIndex = y2 * parWidth * 4 + x2 * 4;//比对大图对应的像素点的颜色
                            var colorPixel = System.Drawing.Color.FromArgb(byteArraryPar[parReleativeIndex + 3], byteArraryPar[parReleativeIndex + 2], byteArraryPar[parReleativeIndex + 1], byteArraryPar[parReleativeIndex]);
                            if (ColorAEqualColorB(colorPixel, color, errorRange))
                            {
                                matchNum++;
                            }
                        }
                    }
                    if ((double)matchNum / sum >= matchRate)
                    {
                        Console.WriteLine((double)matchNum / sum);
                        pointX = smallStartX + (int)(subWidth / 2.0);
                        pointY = smallStartY + (int)(subHeight / 2.0);
                        var point = new System.Drawing.Point(pointX, pointY);
                        if (!ListContainsPoint(ListPoint, point, 10))
                        {
                            ListPoint.Add(point);
                        }
                        if (!isFindAll)
                        {
                            goto FIND_END;
                        }
                    }
                }
                //小图x1,y1坐标处的颜色值
            }
        }
        FIND_END:
        subBitmap.UnlockBits(subData);
        parBitmap.UnlockBits(parData);
        subBitmap.Dispose();
        parBitmap.Dispose();
        GC.Collect();
        return ListPoint;
    }
     public bool ColorAEqualColorB(System.Drawing.Color colorA, System.Drawing.Color colorB, byte errorRange = 10)
    {
        return colorA.A <= colorB.A + errorRange && colorA.A >= colorB.A - errorRange &&
            colorA.R <= colorB.R + errorRange && colorA.R >= colorB.R - errorRange &&
            colorA.G <= colorB.G + errorRange && colorA.G >= colorB.G - errorRange &&
            colorA.B <= colorB.B + errorRange && colorA.B >= colorB.B - errorRange;
    }
    public bool ListContainsPoint(List<System.Drawing.Point> listPoint, System.Drawing.Point point, double errorRange = 10)
    {
        bool isExist = false;
        foreach (var item in listPoint)
        {
            if (item.X <= point.X + errorRange && item.X >= point.X - errorRange && item.Y <= point.Y + errorRange && item.Y >= point.Y - errorRange)
            {
                isExist = true;
            }
        }
        return isExist;
    }


    private void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Stop();
        var rec = FindPicture(@"C:\Users\李阳\Desktop\临时\xiao.png", 10);

        if (rec.Count > 0)
        {
            this.Text = rec[0].X + "," + rec[0].Y;

            // mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE,Convert.ToInt32(x)*65536 / 1024, Convert.ToInt32(y)* 65536 / 768, 0, 0);//鼠标移动
            //mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, rec[0].X, rec[0].Y, 0, 0);//鼠标移动
            SetCursorPos(rec[0].X, rec[0].Y);
            //System.Threading.Thread.Sleep(1000);
            mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, rec[0].X, rec[0].Y, 0, 0);

            SetCursorPos(rec[0].X+50, rec[0].Y);
        }
        timer1.Start();
    }


}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值