|
发表于 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] |
|