利用Adodb.Stream制作彩色验证码

上一篇 / 下一篇  2007-08-15 16:12:59 / 个人分类:ASP

51Testing软件测试网K!dn\f3U

Asp文件:Code.Asp 51Testing软件测试网E:m5I0T|/@:`0Q
数据文件:body.Fix , Head.Fix 51Testing软件测试网 U#|#q2IM
用法:<img src="code.asp">

9RCeW1D+vEV9}0 51Testing软件测试网\H2zRK1H@:f*_]Z

CODE:

Pm5@ p;d L5h;VS0 51Testing软件测试网w0D,lVT oh

Response.buffer = true 51Testing软件测试网f1id fnU/RE0X
NumCode
T7})E.Y%Xz0Function NumCode()
g.P0bv}v0Response.Expires = -1 51Testing软件测试网&u!GQ*XPoBL
Response.AddHeader "Pragma","no-cache" 51Testing软件测试网"x6j.G.DR3o,yDY
Response.AddHeader "cache-ctrol","no-cache" 51Testing软件测试网5i:qZJ+z2i
dim zNum,i,j 51Testing软件测试网2suJ K,O9vLYO"}
dim Ados,Ados1
"V_ Qr~!g.x&`+J;{0Randomize timer
6AG^6? Lx-s$|0生成随机四位数字: 51Testing软件测试网a5`(g)E8LJ
zNum = cint(8999*Rnd+1000)
u0~"w~a%tS3i WQ0传递给session 51Testing软件测试网S+Q(d4cJ ]
Session("GetCode") = zNum 51Testing软件测试网.aS~+K C"fO
该for循环是将随机数字放入一个下标3的数组,便于提供给后面的阵列变换
+Pdo.?,h Q Z0dim zimg(3),NStr
Y#ruA;En2v6xZn0NStr=cstr(zNum)
`*j{q%og0For i=0 to 3
,~"g-r"szKXC'K0zimg(i)=cint(mid(NStr,i+1,1))
4U{2g8B6g7]6zX(G0Next
;Hrw/Gakv0dim Pos
1s!SJ @t&WpxVN0'定义二个 ADODB.Stream binary对象,作图像数据操作之用:51Testing软件测试网6a-r7PP}?^*})R
set Ados=Server.CreateObject("Adodb.Stream") 51Testing软件测试网(x$j K+\/U u
Ados.Mode=3
4qTrX4UOfd!w0Ados.Type=1
[)q9x"MMc b0Ados.Open
TI`c K0set Ados1=Server.CreateObject("Adodb.Stream")
;]1so \L(R)?Gs0Ados1.Mode=3 51Testing软件测试网^ ]H T;aE }
Ados1.Type=1 51Testing软件测试网-L[5bL,[
Ados1.Open
~9r2aB9A0'载入0~9的数字数据10x100的,Gbr的阵列数据,每个320字节,10个数字3200byte
#u k tS,Vryn2Lg.V"X0'BGR一个点,10x10个点一个数字,一个点三个字节(二进制8位,16进制 00~FF) 51Testing软件测试网 U3l;f*[$?_?v
'一行10个点 30字节 + 行结束标记 00 00 二字节 32字节,所以一个10x100宽小于长的图像每个数字10x10是320字节 51Testing软件测试网;X#e$yG3QU{
'长大于宽的则无行结束标记 0000,直接是300字节
lq DP$D'K_/c0这些就是BMP 24bit的数据详细信息了
%v&N5t%_ BM P0‘至于头部,也很简单,包含长宽,图像开始标记等等~~才54字节,远没jpg什么的复杂
c0Xl!SFm|0Ados.LoadFromFile(Server.mappath("body.Fix")) 51Testing软件测试网je4v|6}
Ados1.write Ados.read(1280) 51Testing软件测试网/hG.y,XZ;gmx4hBJn
'第一个for循环,按生成的随机数字顺序从 10X100的数字阵列中提取出相应的四个数字
G9`.{iaq0但是竖排的数字阵列 51Testing软件测试网&|j&qz!LIy2qy
for i=0 to 3 51Testing软件测试网5Q!W!z&iys)}
Ados.Position=(9-zimg(i))*320
X8Y5Ut%_.ax0Ados1.Position=i*320 51Testing软件测试网#ONec2Qnb0v
Ados1.write ados.read(320) 51Testing软件测试网?&m"t? V
next 51Testing软件测试网o$] Hh ? D1G
'清空已经用完的ADOS的数据,调入替换新的图像头54字节的头文件 
0Y2Q-i6Y-S:VDG-A3l#[0Ados.LoadFromFile(Server.mappath("head.fix")) 51Testing软件测试网'^.S J"?#@
Pos=lenb(Ados.read()) 51Testing软件测试网$YgXVz(z9]
Ados.Position=Pos '指定Pos位置,即可再偏移54字节的位置添加图形数据
9A8GLML;~%V}^0第二个for循环,进行数字的阵列变换,由竖排的块转换为横排的数字块 51Testing软件测试网 V?!t9S'j:Ad%c4b&Y
方法是隔320字节抽取4次30字节写入ados对象,再抽取偏移第二行的图像数据 51Testing软件测试网%l&h1tN})WE Uv+n
30字节是因为bmp 宽大于长时无00 00的行结束标记 51Testing软件测试网&Lv)ye.i+gT,v
for i=0 to 9 step 1
*n'Nz[p*ZCEV0for j=0 to 3 51Testing软件测试网l9PG%O|zVx
Ados1.Position=i*32+j*320
C_^8~2z,t-Bx\A0Ados.Position=Pos+30*j+i*120
-d,mu,^ g*IV0Ados.write ados1.read(30)
5`$u0k(K!v7rc$vy0next
X)kh)D1mQ0next 51Testing软件测试网a'}jt8{]3?
Ados.Position=0
m u:wq0}/T P{"R0response.BinaryWrite直接向客户端发送图像数据
jy4RE.?K:|0Response.ContentType = "image/BMP" 51Testing软件测试网 yB(DJ'B(j~R8r3O
Response.BinaryWrite Ados.read() 51Testing软件测试网w!s.T8zj
Ados.Close:set Ados=nothing
2TNE)]a p(R&yD M0Ados1.Close:set Ados1=nothing 51Testing软件测试网I9pBAYkS
End Function
q$j&jj"|9B&j Q0

%oM5tc6v*f i*?7j0

TAG: ASP

 

评分:0

我来说两句

Open Toolbar