大家好,我是公众号3分钟学堂的郭立员,如果你喜欢我的文章,欢迎进入我的公众号介绍页面,点击右上角3个点,星标我的公众号,可以第一时间收到我的文章更新通知。
前言
其实我在做脚本的时候很少用动图,如果要查找点击屏幕上的动图,我可能会用两个思路解决:
①、看屏幕中有没有和动图相对距离固定的静态图,如果有的话就先找静态图,之后通过坐标偏移获取到动图的位置坐标。
②、缩小截图,截取动图中相对不变的部分,当然前提是动图中有相对不变的部分。
当上面两种思路都行不通时,就不得不考虑找动图了。
一、什么是动态图
在屏幕上我们看到无外乎这几种图像,静态图、动态图、视频
静态图:屏幕上不变的文字、图片都可以叫静态图
动态图:少量静态图重复显示,这里静态图还可以称之为“帧”
视频:大量静态图快速连续播放,最低帧率25帧,也就是每秒播放25张静态图,这个速度人眼看到视频画面才不会卡顿。
动态图和视频有两个不同点:
①少量图片
②循环显示
因为这两个特点所以动态图比视频的文件要小很多。
最常见的动态图就是聊天工具中的表情包,一个动作重复播放。
二、一个动图到底有多少帧
这个问题的答案是不知道,上面我解释动态图时说的少量,一个动态图最少帧数是2,也就是2个图片来回切换,最多就没有限制了,当然图片多了带来的缺点就是图片文件特别大,播放很卡,甚至无法播放。
三、怎么知道屏幕上某个范围动图的帧数
屏幕的动图可能是单一动图,也可能是多个半透明动图的叠加,情况就很复杂。
我这里想到的方法是快速截图,之后去除重复帧,说一个例子,如下图所示,我要获取企鹅嘴部的位置坐标。
①快速截图,这里使用snapshot命令,测试截取较小图时,100张图耗时5秒,换算成帧率是20帧,这个帧率不算高,只能是通过多截图来弥补一下。
dim t=TickCount()
dim path="/sdcard/pictures/dtu/"
For i = 1 To 100
SnapShot path & i & ".png", 168,881,206,902
Next
TracePrint "耗时",TickCount()-t
②对上面100张图片进行去重(本期文章想要讲的核心知识点)
Import "cjson.lua"
dim path="/sdcard/pictures/dtu/"
dim arr(),n=0,img
For i = 1 To 100
img = cjson.Encode(Image.GetPicData(path & i & ".png"))
img = Replace(img, "[", "")
img=Replace(img,"]","")
If Len(arr) = 0 Then
arr(n) = img
n=n+1
Else
For j = 0 To UBOUND(arr)
If arr(j) = img Then
dir.Delete path & i & ".png"
Exit For
End If
If j = UBOUND(arr) Then
arr(n) = img
n=n+1
End If
Next
End If
Next
代码的思路:
先获取每一张图片的颜色信息,然后把颜色信息存入一个数组中,存储之前比较一下要存入的颜色信息在数组中是否存在,如果存在说明该颜色信息对应的图片是重复图片直接删除,这样经过筛选就把不重复的图片保留下来了。
上面截的100张图经过筛选后的仅剩下5张。
也就是说如果做成动图,企鹅嘴部的动图效果仅需要5帧。
特别说明一下,对于脚本来说100张图和5张图其实都能达到找图效果,不同之处是效率,找5张图必然比找100张图效果更高,通过如果把图片放入脚本附件,5张图的脚本文件体积更小。
四、如何使用找动图
我截图100张,然后筛选去重得到5张图并不是我最终的目的,我的目的是要知道我截图的位置坐标,说的直白点就是要达到普通找图命令的功能。
这里涉及到找多图的知识点,有2个方法,假设把多张图都放入到脚本附件中。
其一,找图命令自带多图参数写法,多图之间用“|”分隔。
Attachment:1.png|Attachment:12.png|Attachment:14.png|Attachment:2.png|Attachment:3.png
其二,通过循环找图
提前把图片做成有规律的名称,比如1.png、2.png或者A1.png、A2.png,类似这种形式的,然后通过for循环的计次变量拼接
dim intx,inty
KeepCapture
For i = 1 To 5
FindPic 0, 0, 0, 0, "Attachment:"&i&".png","000000", 0, 1, intX, intY
If intX > -1 And intY > -1 Then
TracePrint intx,inty
Exit For
End If
Next
ReleaseCapture
在代码中我有一个细节,我居然把相似度改成1,默认是90%,这是什么概念,就是说我要找的图必须是百分百一样,很少有找图命令敢这么写的还能找到图,实际上我也仅仅是敢在画面没重新加载的情况这么用,正常使用找图命令相似度还是要填0.8左右,以保证找图的成功率。
两种方法我个人推荐第二种方法,第一种方法虽然代码更简单,但是当图片超过几十张的时候,脚本就会莫名的崩溃。
这里说个题外话,找图命令的图片也可以放到本地,不一定非得放到附件里面,对于脚本测试来说这个很方便,但是对于脚本打包使用就不太方便了,与其图片放附件后在释放到本地,不如直接在脚本附件中使用。
往期同类型文章:
=正文完=
公众号文章并不是及时分发给粉丝,所以弄个微信群,我更新文章后第一时间转发的群里,大家可以扫下方二维码加群。
如果有其他问题可以加我的微信(xiaomu86119),或扫下方二维码
———————————-
推荐:
限时特惠:本站每日持续更新5-20节内部创业项目课程,一年会员
只需199元,全站资源免费下载点击查看详情
站长微信:
jjs406