1. 验证码图形文件预处理本质就是图形文件转成数组后的再次处理,但是验证码处理   具有它的特点,例如
(1)它的处理结果多数是黑(0x0)白(0xffffff)方式;
(2)它对处理速度要求不高,因为验证码文件都是小文件,算法上只求达到目的,一般不考虑过程的优化,因此多采用二维数组进行处理,等等.

2. 简单提一下为什么是数组的处理. 例如汉字"阿",我们看到的多数情形下就是点阵图(以24点阵字图读取为例如下图):
000000000000000000000000
000100001000000000000000
000111111100000000000110
000110011001111111111110
000110011000000000011000
000110010000000000011000
000110100001000110011000
000110100001111111011000
000110100001100110011000
000110010001100110011000
000110010001100110011000
000110001001100110011000
000110001101100110011000
000110001101100110011000
000110001101100110011000
000111111101111110011000
000110111001100110011000
000110010001000100011000
000110000000000000011000
000110000000000000011000
000110000000000111111000
000110000000000001110000
000110000000000000100000
000100000000000000000000
    如果你没看明白,请将上面的点阵图复制到记事本,将"0"替换成 一个空格后再看. 以前在一大步有发过如何用au3读取中文点阵字库的文章(好象当时是发在自动投票机原理系列文章中的图形验证码基础知识吧,太久之前的事,都忘了),有看过并理解了那篇文章内容的朋友该可以直接跳过。

    如果是一个两色的点阵图的话,请将上图的0用0xFFFFFF(十进制值为16777215,白色),1用0x000000(黑色)替换。也就是说,平面图形文件一般可以用一个一维或二维数组表述某个点颜色。
看不明白没关系,因为实践更重要,我们直接看源代码,试着运行就明白了。

    就在十几天前我还用的是autoIT3.0.x的 ansi版本,那个版本对图形的处理比较弱,所以我使用了一个图形处理的dll:CxImageATL
见附件CxImageATL.rar     调用该dll读取图形文件的udf见: example1_au30.au3

例子如:
$a_p_w_picpath = CxImageATLtoArray2D("temp$$.bmp");
显示该数组(如图:example1.jpg),慢慢该会看明白,数组中的元素0xFFFFFF(十进制值为16777215)就是白色的底,0就是黑色,看到其组成了一个“0”字
验证码图形文件预处理初步(一):图形读到数组_第1张图片
 
这十来天终于抛弃了旧版本,开始使用新版本3.3.X的uni版本(其实中间也试过其他版本,但都是浅尝即止,从未想过去改造以前写的udf,因为uni版本对中文处理有些问题,如fileread,binary等函数,这次寒假比较有空,在先解决了那些已知的BUG后,开始用新版本中提供的新函数来改造重写)
这是用autoIT 3.3.X版本写的读取图形文件到数组的udf:example2_au33.au3,如果你用的不是新版本,可能不能正常运行。
我用的是英文原版(我还没用过汉化版本,不知道会否有所不同),官方下载: http://www.autoitscript.com/autoit3/downloads.shtml

例子如:
(1)$a_Image = myReadImageToArray("temp$$.bmp", true) ;将图形文件点阵读到一个二维数组中
显示结果同上,就不再上图了

(2)$a_Image = myReadImageToArray("temp$$.bmp") ;将图形文件点阵读到一个1维数组中
显示结果如图example2.jpg
验证码图形文件预处理初步(一):图形读到数组_第2张图片
 
我个人意见:处理验证码等小文件直接读入二维数组,处理方便。对于非常大的文件,或许使用正则表达式来处理色差等细节,将使用一维数组,效率提高非常多。如我近日学习新版本过程中测试过的较大文件4096*4096,在做色差,去边,放大,旋转,保存等各种变化测试时,同样步骤下二维数组用了12秒,用一维数组处理只用了4秒,对小文件,几乎都是毫秒级别,就无所谓了。