找“动态”图片的方法与验证

看群里讨论识别游戏背包里面的物品,由于物品图片带有闪光,脚本的找图命令找不到。

这个问题在游戏脚本中经常遇到,平时我在给群友解答时,经常会说不要以“动图”作为找图的标识。

但是如果非要找“动图”,该怎么办呢?

解答这个问题,就要说到动图的本质了,动图其实是多张图片循环切换的结果,其实视频也是一样的,我们经常听到多少多少帧,这里说的帧就是就是一个画面。

我们来分析一个动图,举个例子我们的聊天软件中经常有各种表情包,通常都是会动的,如下图:

用图片软件把它打开,看到这个表情是由两个帧组成。

当然这个动图比较简单,只是扇子的左右摆动,其他画面部分是不动的,所以帧画面只有两个。

假设我们要以这个表情为找图的标识,就可以找2张图,这两张图就是表情的两帧动画。

Dim intx,inty
FindPic 0, 0, 0, 0, "Attachment:1.png|Attachment:2.png","000000", 0, 0.9, intX, intY
If intX > -1 And intY > -1 Then 
    TracePrint intx,inty
End If

脚本通过找多图的方式就可以找到这个表情的位置坐标了。

把上面的方法应用到实际的例子中:

这里有个提示是不断闪烁的文字提示框。

我们要找个警示符号,按照上面的思路,第一步先把它分成多张图片,第二步用找图命令找多图。

确定好思路以后就可以着手去做的,这个“动图”并不是一个gif的图片,所以没有“帧”,那我就截图的方式连续的去截图。


For i = 0 To 100
  SnapShot("/sdcard/pictures/a/"&i&".png",51,456,84,489)
Next

通过连续的截取101张图片,发现大概有3个循环,也就是动图大概是由三十多张图片组成,为啥这么多,应为有大量的过渡图片。

那么我们以0-34图为例去找图,先把35张图片放入到脚本附件中,然后运行下面的代码:

Dim intx,inty
KeepCapture 
For i = 0 To 34
    FindPic 0, 0, 0, 0, "Attachment:"&i&".png","000000", 0, 0.9, intX, intY
    If intX > -1 And intY > -1 Then 
        TracePrint intx,inty
        Exit For
    End If
Next
ReleaseCapture

识别结果:

当前脚本第6行:51 456

通过抓抓工具确认了一下这个获取到的坐标是正确的。

在代码中,使用了截图到内存命令,这个命令很关键能够提高找图的速度。

经过测试使用截图到内存命令,运行时间是100毫秒以内,不是用截图到内存命令,运行时间是100-500毫秒。

测试结果中两种情况都是可以获取找到图。

另外找多图的命令也没有使用,而是用的循环找图,以及找到图的跳出循环,使用这种方式的原因是,当图片太多时,图片名称一个个写入到找图命令中,代码会非常的长容易写错,使用循环代替就方便很多。

本期内容就这些,最好我还是那句话尽量不要以“动图”作为找图的标识。

转载自微信公众号:3分钟学堂

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注