开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

楼主: 康师傅茶
收起左侧

[易源码分享] 验证码识别

   关闭 [复制链接]
结帖率:0% (0/1)
发表于 2010-8-10 02:25:11 | 显示全部楼层   广东省佛山市
在支持一次 {:3_218:}
回复 支持 反对

使用道具 举报

发表于 2010-8-10 08:09:32 | 显示全部楼层   广西壮族自治区南宁市
这是什么东西
  过来看看那!
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2010-8-10 12:18:50 | 显示全部楼层   山东省济宁市
不错学习了。。
回复 支持 反对

使用道具 举报

发表于 2010-8-10 12:20:14 | 显示全部楼层   浙江省杭州市
QQ的行不{:3_228:}
回复 支持 反对

使用道具 举报

结帖率:100% (11/11)
发表于 2010-8-10 17:16:50 | 显示全部楼层   江苏省徐州市
[e]
.版本 2
.支持库 BmpOperate
.程序集 窗口程序集1
.程序集变量 原位图, 位图, , , 从网页拉取的验证码简单处理之后的位图,下面有说明
.程序集变量 所有数字特征串, 文本型, , "10", 事先定义好0-9这十个数各自的特征串
.子程序 _按钮1_被单击
.局部变量 处理后位图, 位图, , , 位深换成1的位图,就是黑白图
.局部变量 验证码, 字节集, , , 直接从网页拉取的验证码
.局部变量 i
.局部变量 n
.局部变量 m
.局部变量 特征码, 文本型, , "4", '每个数字的特征码
.局部变量 分割次, , , , '将原图分割的第几次
.局部变量 分割图 片组, 位图, , "4", '分割成四小块之后的图 片数组
.局部变量 分割的图 片框, 图 片框, , , '用来取标记组件的图 片框变量,第一次分割显示分块用的
.局部变量 标记图 片框, 图 片框, , , '用来取标记组件的图 片框变量
.局部变量 x
.局部变量 y
.局部变量 左边空白, , , "4", '数字最左边距离画板或图 片框左边的距离
.局部变量 顶边空白, , , "4", '数字最上边距离画板或图 片框顶边的距离
.局部变量 y集合, , , "20", y值的集合数组
.局部变量 x集合, , , "20", x值的集合数组
.局部变量 y判断
.局部变量 x判断
.局部变量 标记画板, 画板, , , '用来取标记组件的画板变量
.局部变量 后期位图组, 位图, , "4", '最后处理时候用到的位图数组
.局部变量 a, 整数型
编辑框1.内容 = “”  ' 清空编辑框内容,以下亦如此
编辑框2.内容 = “”
' 验证码 = HTTP读文件 (“http://ff.cs.nie.163.com/cgi-bin ... _image_validater.py”)  ' 读取验证码数据
' 画板_原图.画图 片 (载入图 片 (验证码), 0, 0, , , )  ' 将验证码数据画到画板上去,因为直接用位图载入数据会提示错误,不知道什么原因,
' 暂时还没有解决只好用这个方法了
原位图.载入数据 (画板_原图.取图 片 (, ))  ' 载入画板1上的数据
处理后位图 = 原位图.转换位深度 (1)  ' 将原图处理成单色(黑白)图
图 片框_处理后图.图 片 = 处理后位图.取位图数据 ()  ' 将处理成单色后的图显示到图 片框上
.计次循环首 (4, 分割次)  ' 这里是将原图均分为4块(因为只有4个字符)
    分割图 片组 [分割次].创建 (20, 20, 1, #白色)  ' 创建一个指定的大小的位图(因为原图是80*20,所以分四块就是20*20<高不变>)
    处理后位图.复制到 ((分割次 - 1) × 20, 0, 20, 20, 分割图 片组 [分割次], 0, 0, )  ' 将处理好的位图的一块复制到刚才创建的位图中去
    分割的图 片框 = 取标记组件 (分割次)  ' 这里是去图 片框名称
    分割的图 片框.图 片 = 分割图 片组 [分割次].取位图数据 ()  ' 这里是将每块的图 片显示到对应的图 片框上
.计次循环尾 ()  ' 分块结束
.计次循环首 (4, i)  ' 从这向下就麻烦咯,因为我笨找不到其他好办法,请耐心向下看!
    .计次循环首 (20, n)  ' 20为每个小块的宽度
        y = 0  ' 将y置0,这里的意思是当每像素列处理完之后继续下一列处理之前将x归零
        .计次循环首 (20, m)  ' 20为每个小块的高度
            .判断开始 (分割图 片组 .取某点颜色 (n - 1, m - 1) = #黑色)  ' 判断那一点是否是黑色(因为刚才已经处理成黑色的了),至于为什么要n-1,m-1我的理解是从0这个位置开始读而不是从1
                跳出循环 ()  ' 是黑色的话就跳出循环
            .默认
                y = y + 1  ' 不是黑色说明就是空白背景,y=y+1就是从左向右分别取当前像素行距离顶边的像素数,只要从第一次循环开始不是黑色就一直+1,一旦出现一个黑色就不再继续循环!
            .判断结束
        .计次循环尾 ()  ' 一行像素读取完毕
        y集合 [n] = y  ' 依次将这行的20个y值赋给y集合的每个成员
    .计次循环尾 ()  ' 一个分块读取完毕
    y = y集合 [1]  ' 从y集合里读取第一个成员的数值赋给变量y
    .计次循环首 (20, y判断)  ' 判断这20个y值里哪个最小?
        .判断开始 (y ≥ y集合 [y判断 + 1])  ' 如果y≥下一个成员的数值说明下一个成员比较小
            y = y集合 [y判断 + 1]  ' 所以将它的值赋给y
        .默认
        .判断结束
        .如果真 (y判断 = 19)  ' 判断是不是第19次,因为循环之前已经取出第一个的值了,所以这里比较19次就可以了,其实循环19次就可以但是这样好理解 (*^__^*) 嘻嘻……(其实是懒得改了~)
            跳出循环 ()  ' 如果是第19次的话就比较完毕跳出
        .如果真结束
    .计次循环尾 ()  ' 循环完了,比较完了
    顶边空白 = y  ' 将第每个分块的距离顶边最小的一个值赋给每个成员
.计次循环尾 ()  ' 4个顶边距离全部处理完毕,我来介绍下这一大部分啰嗦代码的用处!转行↓
' 因为单单换成单色并且分块的话,每个块的数字的位置都不一样,也就是说它每个小块中的数字的位置在每个小块中是随机的,所以就增加了识别的难度,几乎无法识别!但是经过这一大段代码和下一大段代码之后每个分块的数字都移动到左上角去了~所以每次读取验证码之后分块数字的位置就是固定的了,这样只要找到每个数字的特征码然后再比较就可以识别了,不出错的话!识别率可以达到100%!
.计次循环首 (4, i)  ' 这里和上面那一段差不多,不同点就是这一段是取的到左边的最小距离
    .计次循环首 (20, n)  ' 20为每个小块的高度,这里是高度了!
        x = 0  ' 将x置0
        .计次循环首 (20, m)  ' 20为每个小块的宽度,这里变成了宽度!
            .判断开始 (分割图 片组 .取某点颜色 (m - 1, n - 1) = #黑色)  ' 判断是否黑色
                跳出循环 ()  ' 是的话立马跳出循环
            .默认
                x = x + 1  ' 不是的话就+1,一旦是黑色,这里不再+1了
            .判断结束
        .计次循环尾 ()  ' 一像素列处理完毕
        x集合 [n] = x  ' 依次将这列的20个x赋给x集合的每个成员
    .计次循环尾 ()  ' 一个分块处理完毕
    x = x集合 [1]  ' 从x集合里读取第一个成员的数值赋给x
    .计次循环首 (20, x判断)  ' 开始比较哪个最小,下面省略,因为和上面的判断大小过程一样!
        .判断开始 (x ≥ x集合 [x判断 + 1])
            x = x集合 [x判断 + 1]
        .默认
        .判断结束
        .如果真 (x判断 = 19)
            跳出循环 ()
        .如果真结束
    .计次循环尾 ()  ' 判断大小完毕
    左边空白 = x  ' 将第每个分块的距离左边最小的一个值赋给每个成员
.计次循环尾 ()  ' 循环完毕
.计次循环首 (4, i)  ' 这里开始把每个分块的数字左和上都靠边的复制到新的画板中
    标记画板 = 取标记组件 (i + 4)  ' 取画板名称
    标记画板.清除 (, , , )  ' 清除画板数据
    .计次循环首 (20, n)  ' 从左到右,20为画板宽度
        .计次循环首 (20, m)  ' 从上到下,20为画板高度
            .判断开始 (分割图 片组 .取某点颜色 (n - 1, m - 1) = #黑色)  ' 如果指定点为黑色就→↓
                标记画板.画点 (n - 左边空白 - 1, m - 顶边空白 - 1, #红色)  ' 画点,由点组成数字(注意这里是红色仅仅是为了便于区分两组分块)
            .默认
            .判断结束
        .计次循环尾 ()  ' 一像素列画完
    .计次循环尾 ()  ' 一个分块画完
.计次循环尾 ()  ' 全部画完
.计次循环首 (4, i)  ' 这里就是识别部分了,因为有4个分块(4个数字)所以识别四次
    标记画板 = 取标记组件 (i + 4)  ' 取画板名称
    后期位图组 .载入数据 (标记画板.取图 片 (, ))  ' 将第二组分块的每个分块图 片赋给位图组的每个成员
    .计次循环首 (20, n)  ' 宽度20
        .计次循环首 (20, m)  ' 高度20,其实这里识别部分怎么识别也可以 无论先上下后左右还是先左右后上下都可以
            .判断开始 (后期位图组 .取某点颜色 (n - 1, m - 1) = #红色)  ' 取画板上为红色的点
                特征码 = 特征码 + “1”  ' 这个点是红色就将特征码加个字符"1"
            .默认
                特征码 = 特征码 + “0”  ' 不是红色就加个字符"0"
            .判断结束
        .计次循环尾 ()  ' 一行像素或一列像素分析完毕
    .计次循环尾 ()  ' 一个小块分析完毕
    .计次循环首 (10, a)  ' 因为有十个数字,所以要匹配十次
        .如果真 (特征码 = 所有数字特征串 [a])  ' 最后的特征码是否等于0-9中某个数字的特征码
            编辑框1.内容 = 编辑框1.内容 + 到文本 (a - 1)  ' 等于的话就把那个数字加入到编辑框里,因为数组成员有十个而数字是从0开始的 所以直接用那个数组下标减去1就可以,比如第十个成员是9,所以10-1=9
            跳出循环 ()  ' 匹配成功就跳出
        .如果真结束
    .计次循环尾 ()  ' 匹配完毕
    编辑框2.加入文本 (“第” + 到文本 (i) + “位的特征码为:” + 特征码 , #换行符)  ' 将匹配到的字符加入到编辑框里
.计次循环尾 ()  ' 循环四次,所以编辑框里也就有了最终的4位数字验证码
' 累啊!..~~~
.子程序 __启动窗口_创建完毕
所有数字特征串 = 分割文本 (到文本 (#特征串09), #换行符, )  ' 事先在文本里定义好了每个数字的特征码,从0-9,一行一个

[/e]
回复 支持 反对

使用道具 举报

结帖率:86% (18/21)

签到天数: 5 天

发表于 2010-8-15 23:36:02 | 显示全部楼层   河北省沧州市
好东西,绝对顶 好东西,绝对顶
回复 支持 反对

使用道具 举报

结帖率:85% (28/33)

签到天数: 2 天

发表于 2010-8-16 07:23:09 | 显示全部楼层   黑龙江省哈尔滨市
谢谢!!!
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 1 天

发表于 2010-8-16 08:53:30 | 显示全部楼层   河北省石家庄市
谢谢分享!!!!!!!!!!
回复 支持 反对

使用道具 举报

结帖率:67% (2/3)
发表于 2010-8-17 18:59:37 | 显示全部楼层   河南省商丘市
看看,也能学到好多爱惜!
回复 支持 反对

使用道具 举报

发表于 2010-8-18 09:13:37 | 显示全部楼层   河北省廊坊市
隐藏的东西太多了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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