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

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

2h} {of0Asp文件:Code.Asp 51Testing软件测试网Bm C9aD/R
数据文件:body.Fix , Head.Fix
+`s6H)yu/rj9x9u0用法:<img src="code.asp">

'yU {,V$^c0 51Testing软件测试网xO.X~%E9KoN

CODE:51Testing软件测试网M-m"a.x4LR&Fb+`

-[ R(ZI`J0Response.buffer = true 51Testing软件测试网 E1P4^YG1C
NumCode 51Testing软件测试网 E&t6dNnK
Function NumCode() 51Testing软件测试网-Uj!I+K'G H u-zj;z
Response.Expires = -1 51Testing软件测试网dh'mB"[fk} i@TK
Response.AddHeader "Pragma","no-cache"
N*z o-L$z XtR0Response.AddHeader "cache-ctrol","no-cache"
4~*aX J"F.c0dim zNum,i,j 51Testing软件测试网)}D#cb@)Or
dim Ados,Ados1
s@@6l4k#{fd7iR0Randomize timer
"nd2^+^BF&ZI0生成随机四位数字: 51Testing软件测试网@Z:Y-X*@ Q;vcP
zNum = cint(8999*Rnd+1000)
`4O%Z3Y.zF:IZe0传递给session
)H1p-w/q6J^6l0Session("GetCode") = zNum
1^ ~1|,P8w~"F2syY0该for循环是将随机数字放入一个下标3的数组,便于提供给后面的阵列变换
%D+P&{r-?U4O0dim zimg(3),NStr 51Testing软件测试网I,Y]m%O:_x
NStr=cstr(zNum) 51Testing软件测试网DI~Ln0a COGu @QN
For i=0 to 3
b0mj%p4Nw9Q*@0zimg(i)=cint(mid(NStr,i+1,1)) 51Testing软件测试网#X'e)EzyII4vW)H
Next
.AUFO7Mp#FAZ0dim Pos
dF{}s&U&W\ |u0'定义二个 ADODB.Stream binary对象,作图像数据操作之用:51Testing软件测试网p bKP*OZ
set Ados=Server.CreateObject("Adodb.Stream") 51Testing软件测试网 vN-go7W6R.wk
Ados.Mode=3
l:~(?/r]3iM7cM0Ados.Type=1
U:[ }*i\2~yp!H*h0Ados.Open
0mD3w V z"@]4r0set Ados1=Server.CreateObject("Adodb.Stream")
$^%pJ9d2{ L0Ados1.Mode=3
)jg*w j i?6mX&@0?0Ados1.Type=1 51Testing软件测试网 {J }/^F4Kr p,_
Ados1.Open 51Testing软件测试网*sd&S6Gr!F8N#e
'载入0~9的数字数据10x100的,Gbr的阵列数据,每个320字节,10个数字3200byte
.d!B };jV9`0'BGR一个点,10x10个点一个数字,一个点三个字节(二进制8位,16进制 00~FF)
5E(md pQ'p ` pj0'一行10个点 30字节 + 行结束标记 00 00 二字节 32字节,所以一个10x100宽小于长的图像每个数字10x10是320字节
3YH;? X3Cj8eS0'长大于宽的则无行结束标记 0000,直接是300字节 51Testing软件测试网.u&c.hm_F(A%J\|
这些就是BMP 24bit的数据详细信息了 51Testing软件测试网 Q4QBJ$zc*`(R
‘至于头部,也很简单,包含长宽,图像开始标记等等~~才54字节,远没jpg什么的复杂 51Testing软件测试网t Y9Ki8^6e(H"C{
Ados.LoadFromFile(Server.mappath("body.Fix"))
9e5C ~{B0Ados1.write Ados.read(1280)
ul+H%m)b3l0'第一个for循环,按生成的随机数字顺序从 10X100的数字阵列中提取出相应的四个数字
eN CWtlI0但是竖排的数字阵列 51Testing软件测试网yH3}&ozx
for i=0 to 3
|)C-Z.P@t$L0Ados.Position=(9-zimg(i))*320
%I8cv)Lv:H Q(D4J0Ados1.Position=i*320 51Testing软件测试网w{xZ_2v EE7Ng
Ados1.write ados.read(320) 51Testing软件测试网 rn(xA*t Dlg
next
R m&D/`-d!o\j!ME0'清空已经用完的ADOS的数据,调入替换新的图像头54字节的头文件  51Testing软件测试网h$L G;Lv
Ados.LoadFromFile(Server.mappath("head.fix"))
"nh;QGk"PS0Pos=lenb(Ados.read())
rT+l5z4]r}8H8p ~ b0Ados.Position=Pos '指定Pos位置,即可再偏移54字节的位置添加图形数据
&J&]UlTO_i0第二个for循环,进行数字的阵列变换,由竖排的块转换为横排的数字块
W_#VY%@}5Z7l6R0方法是隔320字节抽取4次30字节写入ados对象,再抽取偏移第二行的图像数据 51Testing软件测试网 P8kpttf&xo
30字节是因为bmp 宽大于长时无00 00的行结束标记
e/Y'pT%^$}*hT0for i=0 to 9 step 1
d3o7[ b0t_5D }#t0for j=0 to 3
_6k!zScz6uxn0Ados1.Position=i*32+j*320 51Testing软件测试网6TY~ dq,V1s(p5H E5R2[d
Ados.Position=Pos+30*j+i*120 51Testing软件测试网;dA.]&^d7sx
Ados.write ados1.read(30) 51Testing软件测试网$}a\G)b$[ s$Lx
next
-M j-C1Q oGL0next
k3K{%jNE5R3{W0Ados.Position=0 51Testing软件测试网(alJ@}G$W
response.BinaryWrite直接向客户端发送图像数据
x0ehGte&xC^ I2i0Response.ContentType = "image/BMP" 51Testing软件测试网WK{4MXt2U
Response.BinaryWrite Ados.read() 51Testing软件测试网~;VmB@2_
Ados.Close:set Ados=nothing 51Testing软件测试网;Ffi _9t#i*U U&|T
Ados1.Close:set Ados1=nothing
npC"kZ2P%QVm0End Function 51Testing软件测试网!KYi,H z!jv-V$g
51Testing软件测试网6H}CMT:S/QA


TAG: ASP

 

评分:0

我来说两句

Open Toolbar