ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 蓝天630902

[分享] 验证码识别讲座

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-8 08:36 | 显示全部楼层
本帖已被收录到知识树中,索引项:图像处理和GDI
cumulonimbus 发表于 2012-8-8 00:23
兄弟,运行速度很慢哈,而且很不理想哈

因为只是考虑获得结果,没有考虑效率,慢是很自然的。
下面这个恐怕要快30倍,要是再优化一下恐怕还要快。

汉字识别1.rar

396.14 KB, 下载次数: 157

TA的精华主题

TA的得分主题

发表于 2012-8-8 08:52 | 显示全部楼层
本帖最后由 cumulonimbus 于 2012-8-8 09:03 编辑
蓝天630902 发表于 2012-8-8 08:36
因为只是考虑获得结果,没有考虑效率,慢是很自然的。
下面这个恐怕要快30倍,要是再优化一下恐怕还要快 ...


        a(1) = Val(bytClipData(0)) + Val(bytClipData(1)) * 256 + Val(bytClipData(2)) * 65536 + Val(bytClipData(3)) * 4294967296#        'biSize;  第0~3个字节,表示位图信息头大小(总是40),指定这个结构的长度,单位是字节。(占4字节)
        a(2) = Val(bytClipData(4)) + Val(bytClipData(5)) * 256 + Val(bytClipData(6)) * 65536 + Val(bytClipData(7)) * 4294967296#        'biWidth;  第4~7个字节,指定图像的宽度,单位是像素。(占4字节)
        a(3) = Val(bytClipData(8)) + Val(bytClipData(9)) * 256 + Val(bytClipData(10)) * 65536 + Val(bytClipData(11)) * 4294967296#      'biHeight;  第8~11个字节,指定图像的高度,单位是像素。(占4字节)
        a(4) = Val(bytClipData(12)) + Val(bytClipData(13)) * 256                                                                        'biPlanes;  第12~13个字节,必须是1。(占2字节)
        a(5) = Val(bytClipData(14)) + Val(bytClipData(15)) * 256                                                                        'biBitCount; 第14~15个字节。(占2字节)'指定表示颜色时要用到的位数,
        a(6) = Val(bytClipData(16)) + Val(bytClipData(17)) * 256 + Val(bytClipData(18)) * 65536 + Val(bytClipData(19)) * 4294967296#    'biCompression;  第16~19个字节。指定位图是否压缩,
        a(7) = Val(bytClipData(20)) + Val(bytClipData(21)) * 256 + Val(bytClipData(22)) * 65536 + Val(bytClipData(23)) * 4294967296#    'biSizeImage;  第20~23个字节,指定实际的位图数据占用的字节数
        a(8) = Val(bytClipData(24)) + Val(bytClipData(25)) * 256 + Val(bytClipData(26)) * 65536 + Val(bytClipData(27)) * 4294967296#    'biXPelsPerMeter;  指定目标设备的水平分辨率,单位是每米的像素个数,关于分辨率的概念,将在打印部分详细介绍。(占4字节)
        a(9) = Val(bytClipData(28)) + Val(bytClipData(29)) * 256 + Val(bytClipData(30)) * 65536 + Val(bytClipData(31)) * 4294967296#    'biYPelsPerMeter;  指定目标设备的垂直分辨率,单位同上。(占4字节)
        a(10) = Val(bytClipData(32)) + Val(bytClipData(33)) * 256 + Val(bytClipData(34)) * 65536 + Val(bytClipData(35)) * 4294967296#   'biClrUsed;  指定本图像实际用到的颜色数,如果该值为零,则用到的颜色数为2 的biBitCount 次方。(占4字节)
        a(11) = Val(bytClipData(36)) + Val(bytClipData(37)) * 256 + Val(bytClipData(38)) * 65536 + Val(bytClipData(39)) * 4294967296#   'biClrImportant;  指定本图像中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。(占4字节)
        If a(7) > 0 Then
            a(12) = lClipSize - a(7) - a(1)
            a(13) = a(7)
        Else
            a(12) = 0
            a(13) = lClipSize - a(1)
        End If
        a(14) = a(13) / a(3)
        a(15) = Int(a(13) / a(3) / a(2))
        a(16) = (a(7) - a(2) * a(3) * a(15)) / a(3)
        a5 = a(15)
        If a(12) > 0 And a(7) > 0 Then    '判断有没有调色板,因为读不到图片的文件头,所以用a5是否为整数来判断。
            a(1) = lClipSize - a(2) * a(3)    '如果有调色板,就从倒数a(2) * a(3)开始
            a5 = 1    '并且一个字节表示一个点
        End If
        ReDim arr(1 To a(2) * a(3))    '重新定义arr数组大小
        For i = 1 To a(2) * a(3)    '没有调色板的话就从第40个字节开始,图像的每一个点(用3个字节表示:(蓝,绿,红),有调色板的话就从第lClipSize - a(2) * a(3)个字节开始,图像的每一个点用1个字节表示,{换作其他网址,这一循环要改}
            arr(i) = ""    '1或空(就是没有)的设置,是图片显示方式不同,可以更改这个设置,来看看效果,不过要把下面的arr(i) = 1一起改。
            ts = 0    '置初值
            For j = 0 To a5 - 1
                ts = ts + Val(bytClipData((i - 1) * a5 + a(1) + j))    '累加
            Next j
            ts = ts / a5    '图像的BGR的均值(不一定),有调色板的话就不是这个意思。应该说成是图片点的信息均值更贴切些
            If ts < 2 Then   '如果图像的BGR的均值>0,那么就把“1”赋给数组arr(i)
                arr(i) = "1"    '其实就是归一化处理成1
            End If
            If i / a(2) = Int(i / a(2)) Then a(1) = a(1) + a(16)  '防歪,不歪的话,这一句不需要,所以先注释掉。并且a(1) = a(1) + 2,也有可能是a(1) = a(1) + 3、或者a(1) = a(1) + 1,等等,这里需要你自己去调试
        Next i

兄弟,这一段针对不同的图像代码会发生不同的变化,基本上没理解明白。可否解释说明一下。
如果这一段搞不清什么关系,那就算不会啦。
能否给个简单的说明链接?
谢谢

TA的精华主题

TA的得分主题

发表于 2012-8-8 09:07 | 显示全部楼层
本帖最后由 cumulonimbus 于 2012-8-8 09:07 编辑

untitled.jpg


un12ed.jpg


12.jpg

http://blog.ifeng.com/album/pic_1696954.html

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-8 09:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
里面的注释,应该比较清楚。
比如说:a(1) = Val(bytClipData(0)) + Val(bytClipData(1)) * 256 + Val(bytClipData(2)) * 65536 + Val(bytClipData(3)) * 4294967296#
因为biSize,占4字节,并且高位放在后面,所以从0加到3,
bytClipData(0) :就是图片(确切地说应该是复制过来的图片)的第一个字节,…………bytClipData(n)第n个字节。
Val(bytClipData(1)) * 256 因为是16进制,应该是Val(bytClipData(1)) * 16^(2^1),…………Val(bytClipData(3)) * 16^(2^3)。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-8 09:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
cumulonimbus 发表于 2012-8-8 09:07
http://blog.ifeng.com/album/pic_1696954.html

我说了,上面的代码是练手的,不能通用。
通用的,也只是稍微通用(注意我的用词),也解决不了所有问题,

TA的精华主题

TA的得分主题

发表于 2012-8-8 09:26 | 显示全部楼层
本帖最后由 引子玄 于 2012-8-8 09:27 编辑
cumulonimbus 发表于 2012-8-8 09:07 http://blog.ifeng.com/album/pic_1696954.html


你自己能把这个图片中的汉字提取出来吗?那才叫绝活

TA的精华主题

TA的得分主题

发表于 2012-8-8 09:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
引子玄 发表于 2012-8-8 09:26
你自己能把这个图片中的汉字提取出来吗?那才叫绝活

就是不懂才问嘛
这个随便找的,提不提取得出来,我一点都不在乎,重要的是学到提取方法。

TA的精华主题

TA的得分主题

发表于 2012-8-8 09:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 引子玄 于 2012-8-8 09:34 编辑
cumulonimbus 发表于 2012-8-8 09:30
就是不懂才问嘛
这个随便找的,提不提取得出来,我一点都不在乎,重要的是学到提取方法。


你如果学会了这本领,像英国人的Bet365这种128位加密的网站,就能顺利抓取了

TA的精华主题

TA的得分主题

发表于 2012-8-8 09:41 | 显示全部楼层
蓝天630902 发表于 2012-8-8 09:08
里面的注释,应该比较清楚。
比如说:a(1) = Val(bytClipData(0)) + Val(bytClipData(1)) * 256 + Val(byt ...

没整明白,你从得出结论bisize是4个字节?
这是汉字处理的:
a(1) = Val(bytClipData(0)) + Val(bytClipData(1)) * 256 + Val(bytClipData(2)) * 65536 + Val(bytClipData(3)) * 4294967296#
这是验证码识别8的:
a1 = bytClipData(0)
这是识别PNG5992的:
a1 = bytClipData(0) + bytClipData(1) * 256 + bytClipData(2) * 4096 + bytClipData(3) * 65536

咋会都不同呢?

TA的精华主题

TA的得分主题

发表于 2012-8-8 09:43 | 显示全部楼层
引子玄 发表于 2012-8-8 09:32
你如果学会了这本领,像英国人的Bet365这种128位加密的网站,就能顺利抓取了

呵呵,我也想呀
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-3 00:22 , Processed in 0.052375 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表