• 新浪微博:
  • 微信 :
按键精灵电脑版
立即下载

软件版本:2014.05
软件大小:21.6M
更新时间:07-04

按键精灵安卓版
立即下载

软件版本:3.3.0
软件大小:62.5M
更新时间:5-24

按键精灵iOS版
立即下载

软件版本:1.3.3
软件大小:29.2M
更新时间:06-14

按键精灵Mac版
立即下载

软件版本:1.1.0
软件大小:12.3M
更新时间:12-29

快捷导航

登录 后使用快捷导航
没有帐号? 注册

登录 注册
返回列表 12345678» / 49
发新话题 回复该主题

[按键精灵安卓版] 多点找色进阶 - 【201512期】 [复制链接]

1#

多点找色进阶


本文按键学院提供技术支持

按键学院交流①群(已满):376122403

按键学院交流②群(已满):372671254

按键学院交流③群(快满):170084238

按键学院安卓①群:115768679


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





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

  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毫秒,这个延时完全可以接受。

唔,哪里能更好的实验出他的强大呢?还记得我们之前的双11之连连看吗?双11抢红包连连看源码分析-【201511期】我们就可以使用这个方法,不断的返回两个坐标并点击就能够实现,并且速度更加快速哦!
想知道更多内容吧!那么请关注院刊系列!





最后编辑兄弟工程师13 最后编辑于 2015-12-23 17:27:54
本主题由 按键工程师 兄弟工程师13 于 2015/12/23 17:27:04 执行 移动主题 操作
2#

多点找色进

3#

学习中,多谢楼主

4#

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

5#

现在遇到一个动态的,抓图也不是找图也不是

6#

顶顶顶顶顶顶顶顶顶顶

7#

看看看看

8#


9#

还是没搞明白 多点找色比找图好在哪里?

10#

xiexie

11#


12#

学习 学习 学习 学习 学习

13#


14#

ssssss

15#

看看咯

16#


17#

每天学一点。

18#

很好,就是需要这样的思路

19#

点找色进阶

20#


发新话题 回复该主题