利用Adodb.Stream制作彩色验证码
上一篇 /
下一篇 2007-08-15 16:12:59
/ 个人分类:ASP
2h} {of0Asp文件:Code.Asp 51Testing软件测试网BmC9aD/R
数据文件:body.Fix , Head.Fix
+`s6H)yu/rj9x9u0用法:<img src="code.asp">
'yU{,V$^c0
51Testing软件测试网xO.X~%E9KoNCODE: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 Hu-zj;z
Response.Expires = -1 51Testing软件测试网dh'mB"[fk}
i@TK
Response.AddHeader "Pragma","no-cache"
N*zo-L$z
XtR0Response.AddHeader "cache-ctrol","no-cache"
4~*aXJ"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~Ln0aCOGu @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
ji?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};j V9`0'BGR一个点,10x10个点一个数字,一个点三个字节(二进制8位,16进制 00~FF)
5E(mdpQ'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)L v:H
Q(D4J0Ados1.Position=i*320 51Testing软件测试网w{xZ_2vEE7Ng
Ados1.write ados.read(320) 51Testing软件测试网
rn(xA*tDlg
next
R
m&D/`-d!o\j!ME0'清空已经用完的ADOS的数据,调入替换新的图像头54字节的头文件 51Testing软件测试网h$L
G;L v
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*UU&|T
Ados1.Close:set Ados1=nothing
npC"k Z2P%QVm0End Function 51Testing软件测试网!KYi,Hz!jv-V$g
51Testing软件测试网6H}CMT:S/QA
相关阅读:
- asp调用视图和存储过程 (overn, 2007-5-13)
- 在asp中调用存储过程的几种方法 (紫忧, 2007-5-26)
- Jmail的主要参数列表 (转中国BS网) (紫忧, 2007-6-01)
- 分页存储过程 (紫忧, 2007-6-05)
- 分页代码 (紫忧, 2007-6-22)
- 加快网页的打开速度 (紫忧, 2007-6-25)
- 避免asp的SQL的执行效率低 (紫忧, 2007-7-03)
- asp与存储过程 (紫忧, 2007-7-11)
- ASP 编程中20个非常有用的例子 (紫忧, 2007-7-19)
- Vista系统配置IIS7+Asp+Access (云层, 2007-8-15)
收藏
举报
TAG:
ASP