asp制作验证码的方法
作者:亮亮 来源:亮亮的博客 发布时间:2008-05-08 12:50:00
首先你要明白24bit的bmp图片的基本信息:1像素占3个字节,头部占54个字节。
好了,现在开始做验证码了,这里以4位验证码(大小为20(高)*80(宽))为例子讲解。
1.用做图软件做两个图片,分别保存为24bit的bmp,一个是20(高)*80(宽)的图片(yzmTmp.bmp),里面的数字随便,就是做出你要在网页上显示的验证码的样子。
如图:
一个是20(高)*200(宽)的图片(yzm.bmp),里面的数字按1,2,3,4,5,6,7,8,9,0从左到右一次排列,每个数字在20*20的范围中居中放置。
如图:
当然,里面的背景,字体及颜色你自己可随意设置。
2.用16进制编辑器(我用的是winhex)打开yzmTmp.bmp,只保留文件头部,就是把54字节后的所有内容删除。从最后开始删,这样容易保证只留下54字节的头文件。
如图:
右边红色椭圆框显示54 bytes,接着另存为head.fix。
3.剩下的就是代码了
<%
Response.buffer = true
NumCode
Function NumCode()
Response.Expires = -1
Response.AddHeader "Pragma","no-cache"
Response.AddHeader "cache-ctrol","no-cache"
dim zNum,i,j
dim Ados,Ados1
Randomize timer
'生成随机四位数字:
zNum = cint(8999*Rnd+1000)
'传递给session
Session("GetCode") = zNum
'该for循环是将随机数字放入一个下标3的数组,便于提供给后面的阵列变换
dim zimg(3),NStr
NStr=cstr(zNum)
For i=0 to 3
zimg(i)=cint(mid(NStr,i+1,1))
Next
dim Pos
'’定义二个 ADODB.Stream binary对象,作图像数据操作之用:
set Ados=Server.CreateObject("Adodb.Stream")
Ados.Mode=3
Ados.Type=1
Ados.Open
set Ados1=Server.CreateObject("Adodb.Stream")
Ados1.Mode=3
Ados1.Type=1
Ados1.Open
Ados.LoadFromFile(Server.mappath("yzm.bmp"))
Ados1.write Ados.read(4800)
for ii=0 to 3
for j=0 to 19
if zimg(ii)=0 then zimg(ii)=10 end if
Ados.position=(zimg(ii)-1)*60+600*j+54
Ados1.write ados.read(60)
next
next
'’清空已经用完的ADOS的数据,调入替换新的图像头54字节的头文件
Ados.LoadFromFile(Server.mappath("head.fix"))
Pos=lenb(Ados.read())
Ados.Position=Pos
Ados1.position=0
Ados.write ados1.read()
Ados.Position=0
'直接向客户端发送图像数据
Response.ContentType = "image/BMP"
Response.BinaryWrite Ados.read()
Ados.Close:set Ados=nothing
Ados1.Close:set Ados1=nothing
End Function
%>
4.在需要显示验证码的地方放如下代码就可以了
<img src="getYzm.asp" width="80" height="20" />
到此验证码就完成了,代码就不用解释了吧,不明白就看看adodb.stream方面的资料,我这只解释一下一些数字怎么来的,就是不明白照这套就可以了:
for ii=0 to 3
for j=0 to 19
if zimg(ii)=0 then zimg(ii)=10 end if
Ados.position=(zimg(ii)-1)*60+600*j+54
Ados1.write ados.read(60)
next
nex
60 一个字节3个像素,每个数字是20×20,60就是指横着的20个像素占60个字节
600 整个图片是200像素宽,600就是指横着的200个像素占600个字节
240 生成的验证码为20×80,240就是指横着的80个像素占240个字节
54自然就是头的大小了。
最后看看演示
有了这个思路你就可以做各种各样的验证码,比如数字和字母验证码,汉字验证码了...不过这部分代码就要好好斟酌修改下了
Randomize timer
'生成随机四位数字:
zNum = cint(8999*Rnd+1000)
'传递给session
Session("GetCode") = zNum
'该for循环是将随机数字放入一个下标3的数组,便于提供给后面的阵列变换
dim zimg(3),NStr
NStr=cstr(zNum)
For i=0 to 3
zimg(i)=cint(mid(NStr,i+1,1))
Next
就说到这了,欢迎各位赐教,交流验证码的做法!!


猜你喜欢
- 1 数据库连接a.数据库的连接(ACCESS和SQL)在APS脚本中可以通过3中方式访问数据库: ∈IDC (Inte
- with 用法理解Overviewwith 与with之后的object一起,起到了抛出异常和单独生成一个空间让代码在空间里运行的效果。实验
- FME如何使用Python?安装FME后,在FME的安装路径中,找到 fmeobjects 文件夹(C:\Program Files\FME
- 一、基本用法1.注释Python中,#+语句 即为一条注释,也可以用 ‘'‘注释块 '''#人生苦短,我用P
- JS提供两个截取字符串的方法,分别是:slice()和substring()slice和substring都可以接受一个或两个参数,第1个参
- 笔者通过一周的时间,询问了许多设计人员真实用户,以便确保这六个方面确实是大多数用户所不喜并且有非常大的概率普遍存在于众多的医疗网站之中。那么
- 理论介绍分词是自然语言处理的一个基本工作,中文分词和英文不同,字词之间没有空格。中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文
- 是的,我们知道:我们可以为border设置它的width,这个border的宽度可以是5px,可是10px,可以是20px,可以是随意数值。
- 前言emmm…9月1日开学季,手头只有红底证件照,但是学院要求要蓝底,这可咋办呢。懒得下ps了。自己撸起来吧。方法一:
- 一、OS包的作用os包中的API主要可以帮助我们使用操作系统中的文件系统、权限系统、环境变量、系统进程,以及系统信号。对于类Unix的操作系
- 介绍asyncore库是python的一个标准库,提供了以异步的方式写入套接字服务的客户端和服务器的基础结构。操作网络的时候可以直接使用so
- selenium3.0之后的版本的就不支持直接打开火狐浏览器,启动火狐浏览器报错,如下图,要想运行就需要我们单独装上驱动。3.0之前的版本,
- 一.Orcal临时表分类1.会话级临时表1).保存一个会话Session的数据。2).当会话退出时,临时表数据自动清空。表结构与元数据还存储
- 本文摘自 《深度学习原理与PyTorch实战》我们将从预测某地的共享单车数量这个实际问题出发,带领读者走进神经网络的殿堂,运用PyTorch
- 下面是一个简单的Family Tree 示例: DECLARE @TT TABLE (ID int,Relation varchar(25)
- 应用 MySQL 时,会遇到不能创建函数的情况。出现如下错误信息:ERROR 1418 : This function has none o
- HTML代码: <div class="float" id="float"> 我是个腼腆
- 本文实例讲述了php从文件夹随机读取文件的方法。分享给大家供大家参考。具体实现方法如下:function RandomFile($folde
- 现在Django 3.0附带了对ASGI的支持,将Websockets添加到Django应用中不需要任何额外的依赖关系。 在本文中,您将学习
- Python中提供了两个关键字用来控制循环语句,分别是break和continuebreak在条件成立时,不会执行循环中的后续代码,并且会停