C# 之屏幕找图

本文介绍了在C#中实现屏幕找图的方法,包括基础的像素比较算法和使用GDI+,并探讨了效率问题。作者尝试通过多线程来提高效率,将屏幕切分为小块进行比对,但效果有限。文章末尾,作者提到对比其他工具的速度差异,并欢迎大家提供优化建议。
  • 引言

    最近,由于工作上的某些原因,又要写类似于外挂的程序,又要用到一个屏幕找图功能,很多程序(eg:按键精灵)都提供了类似的功能,其实在这之前,我也查找过很多类似的C#方法,因为之前有一个试过没有用得起,所以最后就放弃了,知道现在都是使用的自己写的一个,相对来说,除了效率比较慢,没有太大的问题。不过就是由于效率不高,后面又想了其他的一些解决办法。

  • 基础+贴代码。

    因为是一些图片处理和操作,所以必不可少的会用到C# GDI+的一些基本知识,对于这个网上应该也有很多,大家可以拿来学习和参考。

    再者,其实细细想一下,其实应该很简单,为什么呢,因为就是一个一个像素的比较,比较颜色差异,没有差异就通过,有差异,就继续查找,知道找到必须要,且完全匹配就OK。

    于是乎有了下面的代码。1.0

  // 基础代码和调用代码 (注释基本,略,后面又没有添加,多多包涵)

 1 public class ImageManager
 2     {
 3         public static Point Compare(Bitmap bigImage, Bitmap smallImage)
 4         {
 5             for (int i = 0; i < bigImage.Width; i++)
 6             {
 7                 for (int j = 0; j < bigImage.Height; j++)
 8                 {
 9                     Color c1 = bigImage.GetPixel(i, j);
10                     Color c2 = smallImage.GetPixel(0, 0);
11 
12                     // 颜色相等,且没有超出边界
13                     if (Compare(c1, c2) && bigImage.Width >= (i + smallImage.Width) && bigImage.Height >= (j + smallImage.Height))
14                     {
15                         bool iscontinue = false;
16                         for (int x = 0; x < smallImage.Width; x++)
17                         {
18                             for (int y = 0; y < smallImage.Height; y++)
19                             {
20                                 Color c3 = smallImage.GetPixel(x, y);
21                                 Color c4 = bigImage.GetPixel(i + x, j + y);
22                                 if (!Compare(c3, c4))
23                                 {
24                                     iscontinue = true;
25                                     break;
26                                 }
27                             }
28 
29                             if (iscontinue)
30                             {
31                                 break;
32                             }
33                         }
34 
35                         if (!iscontinue)
36                         {
37                             return new Point(i, j);
38                         }
39                     }
40                 }
41             }
42 
43             return new Point(-1, -1);
44         }
45 
46         private static bool Compare(Color c1, Color c2)
47         {
48             if (c1.A == c2.A && c1.R == c2.R && c1.B == c2.B && c1.G == c2.G)
49             {
50                 return true;
51             }
52 
53             return false;
54         }
55     }
C# ImageManager 1.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值