命令解释

CmpColorEx 命令

命令名称 CmpColorEx
命令功能 比较指定的多个坐标点的颜色,支持多色、偏色、相似度比较
命令参数 mul_color:字符串,需要对比的点xy坐标和16进制颜色,格式为(X坐标|Y坐标|16进制颜色),多个颜色用“|”号分隔,需要偏色用“-”号分隔,多个点信息用“,”号分隔,比如”100|200|FFFFFF|123456-000000,300|500|FFFFFF”
sim:双精度浮点数,相似度,取值范围0-1

范例:

  1. If CmpColorEx(“300|500|FFFFFF|123456-102030,305|505|FFFFFF”,0.9) = 1 Then
  2. TracePrint “全部点颜色相等”
  3. Else
  4. TracePrint “颜色不相等”
  5. End If

复制代码

FindMultiColor 命令

命令名称 FindMultiColor
命令功能 根据指定的多点查找颜色坐标
命令参数 x1:整数型,查找区域左上X坐标
y1:整数型,查找区域左上Y坐标
x2:整数型,查找区域右下X坐标
y2:整数型,查找区域右下Y坐标
first_color:要对比的16进制颜色,多个颜色用”|”号分隔,如果需要对比偏色则中间用“-”号分隔,比如”FFFFFF|123456-000000|00FF00-101010″
sim:双精度浮点数,相似度,取值范围0-1offset_color:字符串,偏移颜色
dir:整数型,查找方向.0:表示从左上向右下查找;1:表示从中心往四周查找;2:表示从右下向左上查找;3:表示从左下向右上查找;4:表示从右上向左下查找;
intX:变参指针,返回找到的X坐标
intY:变参指针,返回找到的Y坐标
color:字符串,16进制颜色值,格式为”BBGGRR”

范例:

  1. Dim IntX,IntY
  2. FindMultiColor 0,0,0,0,”FFFFFF-000000″,”4|1|2F9772-000000|123456-101010,3|7|378757″,0,0.9,intX,intY
  3. If intX > -1 Then
  4. TracePrint “找到啦,坐标在”&intX&”,”&intY
  5. Else
  6. TracePrint “没找到”
  7. End If

复制代码

 

学会选择合适的命令

这两个命令咋一看,好像都一样,都是多点找色。对于有选择困难症的人来说简直是逼死人啊。
其实呢,仔细观察这两个命令,可以发现有一个最大的区别:CmpColorEx 命令是对比固定坐标点的颜色的;FindMultiColor 命令是用来对比相对第一点的偏移点的颜色的。
CmpColorEx 命令主要参数:”300|500|FFFFFF-000000,305|505|FFFFFF”, 其中 “300”和“500”是x和y坐标点,“FFFFFF”则是代表这个坐标点的颜色,“000000”是这个颜色的偏色值,所以这个命令的原理就是逐个的对比这些指定坐标点上的颜色,如果全部相同,则判断为找到这个特征
FindMultiColor 命令主要参数:”FFFFFF-000000″,”4|1|2F9772-000000,3|7|378757″ 其中”FFFFFF-000000″是第一个点的颜色值以及偏色,后面的“4|1|2F9772-000000”则是根据找到的第一点符合要求的颜色坐标来进行的偏移坐标,x轴往右偏移4个像素点,y轴往下偏移1个像素点,然后进行比较该点的颜色是否是“2F9772” ,当全部的偏移点颜色都符合要求的时候就返回找到的第一个点的坐标。
这两种不同的特性就决定了这两个命令的使用环境不同,简单的来说就是

要找固定坐标的特征就用CmpColorEx 命令
要找坐标变化的特征就用FindMultiColor 命令

 

学会更好的取特征

多点找色命令知道了,如何选择合适的命令也知道了,那剩下的就是取多点的特征了。新手取多点的特征的时候容易犯下面的这两个毛病
1、认为取的点越多越好。往往一个比较明显的特征也会取将近10个特征点
2、随意取点。在取点的时候不对特征进行简单的分析,随便取了几个点就完事了

这两种方法一般情况下虽然并不会造成多大的事情,但是并不严谨

正确的取特征可以参考以下的要点

1、点数不宜过多,也不宜过少(多点找字除外)。通常是先观察这个特征以外的环境,是否和这个特征容易混淆,如果不易混淆的话,那只要取4-6个点即可,反之可以相应的增加取点的数量
2、取点的时候需要注意一点,尽量不要取边缘化点,尽量选取一些周围有相同或者相似颜色的坐标点。因为需要考虑到不同分辨率下对于画面的拉伸程度可能不同,如果过于边缘化的话兼容性会降低

取点过多,一定程度上会影响效率:
取点过随意,导致容易出现误判:
正确的取点不同点的颜色尽量做到有差异,容易形成唯一的特征:

多点找色作为写脚本最常见的命令之一,基本上在所有脚本中都有用到,功能也很清楚,就是在指定的范围内找到根据我们设定的相对点颜色寻找满足条件的界面特征,并返回寻找到的第一个特征的坐标,相比于找图,具有简单方便的优势(不需要截图再放到附件),还能够支持多分辨率的自适应,并且能够根据参数来设定搜索顺序,他如此之强—-但我还想让他更强,有时候,我们在界面上寻找的特征不止一个,我希望能全部找出来,那么我们需要来小小的改动一下多点找色。

恩,怎么说呢!直接贴代码!

  1. Function 返回多个点的坐标数组(sx, sy, ex, ey, 主颜色,次颜色,搜索次序,相似度)
  2. If sx = 0 and sy = 0 Then
  3. If ex = 0 and ey = 0 Then
  4. ex = GetScreenX()
  5. ey = GetScreenY()
  6. End If
  7. End If
  8. KeepCapture
  9. Dim TickCount()
  10. Dim intX,intY
  11. Dim arrx = Array()
  12. Dim arry = Array()
  13. Dim num =0
  14. Dim 范围 = 获取大小(次颜色)
  15. For i = sx To ex Step 范围(0)
  16. For j = sy To ey Step 范围(1)
  17. FindMultiColor i,j,i+范围(0)-1,j+范围(1)-1, 主颜色, 次颜色, 搜索次序,相似度,intX,intY
  18. If intX > -1 Then
  19. arrx(num) = intX
  20. arry(num) = intY
  21. num = num + 1
  22. End If
  23. Next
  24. Next
  25. Dim arrxy = Array(arrx,arry,num)
  26. 返回多个点的坐标数组 = arrxy
  27. ReleaseCapture
  28. End Function
  29. Function 获取大小(str)
  30. Dim arr = Split(str,”,”)
  31. Dim xy = Array()
  32. Dim x = 0
  33. Dim y = 0
  34. Dim i = 0
  35. For Each n In arr
  36. Dim 第一个位置 = InStr(1, n, “|”)
  37. If Int(Left(n,第一个位置 – 1)) > x Then
  38. x = Int(Left(n,Instr(1,n,”|”)-1))
  39. End If
  40. Dim n2 = StrCut(n, 1,第一个位置)
  41. Dim 第二个位置 = InStr(1, n2, “|”)
  42. If Int(Left(n2,第二个位置 – 1)) > y Then
  43. y = Int(Left(n2,第二个位置 – 1))
  44. End If
  45. Next
  46. xy = Array(x,y)
  47. 获取大小 = xy
  48. End Function
  49. Dim t = TickCount()
  50. Dim arr = 返回多个点的坐标数组(0,0,0,0,”BAB7B4-101010″, “98|0|B9B7B0-101010,98|98|B7B4AF-101010,0|98|B5B4B0-101010”, 0, 0.9)
  51. For i = 0 To arr(2)-1
  52. TracePrint arr(0, i) & “,” & arr(1, i)
  53. Next
  54. TracePrint TickCount() – t

复制代码

我们注意到多点找色含有范围,那么我们直接在这个范围上下功夫,进行多次范围寻找,再将每次的坐标记录下来,记录到一个数组中,最后返回这个数组,就实现了返回多个坐标,那么问题就在于这个范围如何判定,我们当然可以将这个范围改成单个的像素点,然后遍历整个屏幕,但是这样会产生2个问题,一是时间,这种方式遍历一遍需要10来秒,这还是因为我使用的720*1280的分辨率,如果是1080*1920,那么可能要半分钟,这么低的效率即使找到也毫无意义,二是返回的点,我们一般取的点为了适用多分辨率,都会取在大色块的中间,那么就有可能同一个特征返回多个坐标,这虽然逻辑上没有问题,却不符合我们的需求。因此逐像素的方式不靠谱,我们需要自己去设定这个范围。
这里呢,我采用根据取的点的最大宽高的值来作为范围,这样可以解决上述方式的两个缺点,问题就是写法麻烦点,并且取点也要相对谨慎(第一个点最好在所有取的点的左上方来保证所有偏移量都是正数,当然也可以通过代码来解决这个问题,你们可以根据这个自己改写~),当然这是一次写好终生受益的事情,之后可以直接使用“返回多个点的坐标数组”这个函数而不需要了解他内部实现的方法。
代码中我寻找的点为图标的四个角落的点:

 

恩,放大点瞧瞧:

 

 

这里为了更加清晰我寻找了边缘点,大家取点请尽量取色块中间的点哦。好了,我们来看看整个图中,有多少这样的图标呢?

 

 

根据肉眼看到的,应该是7个,分别是第一排的4个和第二排的3个,那么运行一下看看,返回了什么:

 

 

可以看出,确实返回了所有的坐标,使用的时间为49毫秒,这个延时完全可以接受。

声明:
本站所有文章,如无特殊说明或标注,均为本站原创发布。
任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。
如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。