大家好,我是公众号3分钟学堂的郭立员~
今天要讲的动图验证码并不常见,先来看看它到底长啥样:
和普通验证码的区别是图片上的文字是时隐时现的,通过分析动图的每一帧画面发现,每帧画面至少缺失一个以上的文字,所以无论怎么截图,都无法得到全部文字的图片。
我们要怎么得到包含全部文字的图片,就是今天要讲的内容。
先说一下思路:
截取多张图片,把所有图片上的文字合并到一起,得到全部文字的图片。 |
怎么实现这个效果呢,过程如下:
(1)连续截取10张图片,分别以1-10命名,方便后续合并图片文字使用。
- For i=1 to 10
- SnapShot "/sdcard/pictures/gif/"&i&".png",347,707,732,849
- Next
复制代码存放图片的路径可以自行设置,这里你可能会有疑问,为啥截图是10张,其实10张是随便弄的,具体截几张图,我们是根据截图后,全部图片中文字是不是齐全,以我这个为例,其实1-5张图就包含全部文字了,所以截图5张也可以,为了确保一定能包含全部文字,所以截图10张。
(2)获取图1的颜色信息。
Dim PixelData =Image.GetPicData("/sdcard/pictures/gif/1.png")
我是为了做教程,所以把颜色信息转成json,截图给大家看看,你们如果测试,不需要输出,因为运行这个会比较卡。
(3)分析背景颜色的数值
通过抓抓或者上面颜色信息转换,可以直接到背景颜色RGB的10进制(192,192,192)
(4)合并图片文字的颜色信息
合并的规则是这样,图片1是基准图片,以它的颜色信息为基准颜色,图1文字部分的颜色保留,背景部分的颜色需要替换。
以图1和图2合并文字为例,图1的背景颜色全部用图2同位置的颜色替换。这样图1缺失的文字会被图2补全一些,这里说的是一些,因为有些文字,可能图1、图2都缺失,这种就是没法补全,需要图3-图10去补全。每张图都增添一些新文字,最后补全所有文字。
(5)判断处图片中背景颜色的方法
我们已经知道背景颜色是192,192,192,那么需要做的就是判断每一个颜色是不是等于这个,为了保证容错率,我们不直接用等于,而是一个范围±30吧。
(6)遍历出每一个背景颜色,然后逐个替换成后面的图片。
因为是只替换背景颜色,每次合并后新增的文字都会保留,最终得到所有的文字图片。
完成代码:
- For i=1 to 10
- SnapShot "/sdcard/pictures/gif/"&i&".png",347,707,732,849
- Next
- Dim path="/sdcard/pictures/gif/1.png"
- Dim pic=image.size(path)
- Dim x=pic[1]
- Dim y=pic[2]
- TracePrint x,y
- Dim PixelData =Image.GetPicData("/sdcard/pictures/gif/1.png")
- For m = 2 To 10
- Dim PixelData1 =Image.GetPicData("/sdcard/pictures/gif/"&m&".png")
- For j = 1 To x
- For i = 1 To y
- For k = 1 To 3
- If 160 < PixelData[j][i][k] < 220 Then
- PixelData[j][i][k]=PixelData1[j][i][k]
- End If
- Next
- Next
- Next
- Next
- Image.SavePixelData(PixelData,"/sdcard/pictures/gif/a.png")
复制代码测试效果:
至于识别图片上的文字,直接对接打码平台即可,不是本文重点省略了。
=正文完=