多点找色进阶
横幅.gif(3.77 K)
2015/12/23 17:27:56
本文由按键学院提供技术支持
按键学院交流①群(已满):376122403按键学院交流②群(已满):372671254按键学院交流③群(快满):170084238按键学院安卓①群:115768679多点找色作为写脚本最常见的命令之一,基本上在所有脚本中都有用到,功能也很清楚,就是在指定的范围内找到根据我们设定的相对点颜色寻找满足条件的界面特征,并返回寻找到的第一个特征的坐标,相比于找图,具有简单方便的优势(不需要截图再放到附件),还能够支持多分辨率的自适应,并且能够根据参数来设定搜索顺序,他如此之强----但我还想让他更强,有时候,我们在界面上寻找的特征不止一个,我希望能全部找出来,那么我们需要来小小的改动一下多点找色。
分隔线.jpg(3.25 K)
2015/12/23 17:27:56
恩,怎么说呢!直接贴代码!
Function 返回多个点的坐标数组(sx, sy, ex, ey, 主颜色,次颜色,搜索次序,相似度)
If sx = 0 and sy = 0 Then
If ex = 0 and ey = 0 Then
ex = GetScreenX()
ey = GetScreenY()
End If
End If
KeepCapture
Dim TickCount()
Dim intX,intY
Dim arrx = Array()
Dim arry = Array()
Dim num =0
Dim 范围 = 获取大小(次颜色)
For i = sx To ex Step 范围(0)
For j = sy To ey Step 范围(1)
FindMultiColor i,j,i+范围(0)-1,j+范围(1)-1, 主颜色, 次颜色, 搜索次序,相似度,intX,intY
If intX > -1 Then
arrx(num) = intX
arry(num) = intY
num = num + 1
End If
Next
Next
Dim arrxy = Array(arrx,arry,num)
返回多个点的坐标数组 = arrxy
ReleaseCapture
End Function
Function 获取大小(str)
Dim arr = Split(str,",")
Dim xy = Array()
Dim x = 0
Dim y = 0
Dim i = 0
For Each n In arr
Dim 第一个位置 = InStr(1, n, "|")
If Int(Left(n,第一个位置 - 1)) > x Then
x = Int(Left(n,Instr(1,n,"|")-1))
End If
Dim n2 = StrCut(n, 1,第一个位置)
Dim 第二个位置 = InStr(1, n2, "|")
If Int(Left(n2,第二个位置 - 1)) > y Then
y = Int(Left(n2,第二个位置 - 1))
End If
Next
xy = Array(x,y)
获取大小 = xy
End Function
Dim t = TickCount()
Dim arr = 返回多个点的坐标数组(0,0,0,0,"BAB7B4-101010", "98|0|B9B7B0-101010,98|98|B7B4AF-101010,0|98|B5B4B0-101010", 0, 0.9)
For i = 0 To arr(2)-1
TracePrint arr(0, i) & "," & arr(1, i)
Next
TracePrint TickCount() - t复制代码
我们注意到多点找色含有范围,那么我们直接在这个范围上下功夫,进行多次范围寻找,再将每次的坐标记录下来,记录到一个数组中,最后返回这个数组,就实现了返回多个坐标,那么问题就在于这个范围如何判定,我们当然可以将这个范围改成单个的像素点,然后遍历整个屏幕,但是这样会产生2个问题,一是时间,这种方式遍历一遍需要10来秒,这还是因为我使用的720*1280的分辨率,如果是1080*1920,那么可能要半分钟,这么低的效率即使找到也毫无意义,二是返回的点,我们一般取的点为了适用多分辨率,都会取在大色块的中间,那么就有可能同一个特征返回多个坐标,这虽然逻辑上没有问题,却不符合我们的需求。因此逐像素的方式不靠谱,我们需要自己去设定这个范围。
这里呢,我采用根据取的点的最大宽高的值来作为范围,这样可以解决上述方式的两个缺点,问题就是写法麻烦点,并且取点也要相对谨慎(第一个点最好在所有取的点的左上方来保证所有偏移量都是正数,当然也可以通过代码来解决这个问题,你们可以根据这个自己改写~),当然这是一次写好终生受益的事情,之后可以直接使用“返回多个点的坐标数组”这个函数而不需要了解他内部实现的方法。
代码中我寻找的点为图标的四个角落的点:
1.png(33.65 K)
2015/12/23 17:27:56
恩,放大点瞧瞧:
2.png(8.54 K)
2015/12/23 17:27:56
这里为了更加清晰我寻找了边缘点,大家取点请尽量取色块中间的点哦。好了,我们来看看整个图中,有多少这样的图标呢?
3.png(35.95 K)
2015/12/23 17:27:56
根据肉眼看到的,应该是7个,分别是第一排的4个和第二排的3个,那么运行一下看看,返回了什么:
4.png(53.74 K)
2015/12/23 17:27:56
可以看出,确实返回了所有的坐标,使用的时间为49毫秒,这个延时完全可以接受。唔,哪里能更好的实验出他的强大呢?还记得我们之前的双11之连连看吗?双11抢红包连连看源码分析-【201511期】我们就可以使用这个方法,不断的返回两个坐标并点击就能够实现,并且速度更加快速哦!
想知道更多内容吧!那么请关注院刊系列!
微信关注引导.jpg(29.91 K)
2015/12/23 17:27:56