ASP生成BMP验证码图片

本文介绍了一种使用ASP生成BMP验证码图片的方法,包括设置背景颜色、文字颜色、杂点颜色和比例,以及如何添加字库点阵信息。通过创建CAMXAM_COM_RndCodeBmp类,实现验证码的生成并将其输出为BMP图片,同时将验证码保存到Session中供后续验证使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
''''''''''''''''''''''''''''''''''''''''''''''''''''''
'ASP生成BMP验证码图片 
'石卓林(精彩)
'Site URL:Http://www.camxam.com
'EMail:camxam@163.com
'QQ:383193853
'MSN:camxam@163.com
'2006年3月9日 星期四 
'使用方法:在需要显示的页面嵌入  , 在验证码检验中使用 Session(SessionName属性值) 作为验证码参考值
'属性:
'	SessionName	String	会话名称. 例 Object.SessionName = "Code"
'	TextLength	Int 	字符长度. 例 Object.TextLength = 4
'	BackColor	String	背景颜色,多个颜色用"," 分隔. 例:Object.BackColor = "#FF0000,#00FF00,#0000FF".
'	TextColor	String	文字颜色,同上.
'	YawpColor	String	杂点颜色,同上.
'	YawpCount	Int		杂点比例 范围 0-100. 例 Object.YawpCount = 30
'方法:	
'	SetTextInfo	String	设置字库描述信息 注意在执行任何操作前必须描述和增加点阵数据. 例: Object.SetTextInfo "这是卡通字库"
'	AddTextData	String	增加字库点阵信息 注意在执行任何操作前必须描述和增加点阵数据. 例: Object.AddTextData "E 00000000 00000000 01111100 01000000 01000000 01111000 01000000 01000000 01000000 01111100 00000000 00000000"
'	Write()				输出图片数据
'注意事项:
'1. 关于颜色字符串:
'	可以同时设置任意多种颜色 不同的颜色之间使用 "," 分隔. 程序会将预设的多种颜色随机显示
'2. 关于会话名称:
'	SessionName属性设置的是 Session 变量名称.通过在其它页面中将表单数据与此 Session变量值比较,实现验证码功能.
'3. 关于字符长度:
'	字符长度必须大于 1 .最大长度没有限制. 实际上不可能设置很大 "呵呵!ASP毕竟不是画图软件."
'4. 杂点颜色杂点比例:
'	杂点比例范围 0-100. 此值越大杂点越多,0 为无杂点,100全部是杂点.
'	和背景颜色与文字颜色一样 杂点颜色也可以设置一种一上的颜色.程序会随机使用其中的颜色
'	如将杂点比例设置为 0 则 杂点颜色属性可以不设置
'5. 字库信息:
'	字库信息就是一个字符串,此信息必须设置.内容格式不要求
'6. 字库点阵: 
'	程序是随机查询字库点阵内容输出BMP图片的.
'	每一条点阵.的格式必须一样.
'	每条点阵信息的长度必须一样.
'	所有点阵信息的行数必须一样.
'	所有点阵信息的每行长度必须一样.
'	点阵信息格式:
'字符 第一行点阵 第二行点阵 第三行点阵 第四行点阵 第五行点阵 第六行点阵 第七行点阵 ...... ...... ..... ...... ......
'0 00000000 00000000 00111000 01000100 01000100 01000100 01000100 01000100 01000100 00111000 00000000 00000000
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Option Explicit
Class CAMXAM_COM_RndCodeBmp
	Private TextDataLib,TextData,BmpData,BmpHead,BmpWidth,BmpHeight,BmpSize,TextDataLength,SessionString
	Public SessionName,TextLength,BackColor,TextColor,YawpColor,YawpCount
	Private Sub Class_Initialize()
	End Sub
	Private Sub Class_Terminate()
	End Sub
	Public Function SetTextInfo(TextString)
		ReDim TextDataLib(0)
			TextDataLib(0) = TextString
	End Function
	Public Function AddTextData(TextDataString)
			TextDataLength = UBound(TextDataLib) + 1
		ReDim Preserve TextDataLib(TextDataLength)
			TextDataLib(TextDataLength) = TextDataString
	End Function
	Private Function Getbinary(IntNumber)
		Dim IntBin0,IntBin1,IntBin2,IntBin0_,IntBin1_,IntBin2_
			IntBin0 = Int(IntNumber / 16777216)
			IntBin0_= IntNumber Mod 16777216
			IntBin1 = Int(IntBin0_ / 65536)
			IntBin1_= IntBin0_ Mod 65536
			IntBin2 = Int(IntBin1_ / 256)
			IntBin2_= IntBin1_ Mod 256
			Getbinary = ChrB(IntBin2_) & ChrB(IntBin2) & ChrB(IntBin1) & ChrB(IntBin0)
	End Function
	Private Function GetColorString(ColorString)
		Dim ColorArray,CALength
			ColorArray = Split(ColorString,",")
			CALength = UBound(ColorArray)
			GetColorString = ColorArray(GetRnd(0,CALength))
	End Function
	Private Function GetRnd(LowNumber,UpNumber)
		Randomize Timer
			GetRnd = Int((UpNumber - LowNumber + 1) * Rnd + LowNumber)
	End Function
	Private Function FileHeader()
		Response.Expires = 0
		Response.AddHeader "Pragma","no-cache"
		Response.AddHeader "cache-ctrol","no-cache"
		Response.ContentType = "Image/BMP"
	End Function
	Private Function SetBmpHead(BmpSize,Width,Height)
		BmpHead = ChrB(66) & ChrB(77) '类型"BM"
		BmpHead = BmpHead & Getbinary(BmpSize+54) '文件的大小(字节)
		BmpHead = BmpHead & Getbinary(0) '保留必须为0
		BmpHead = BmpHead & Getbinary(54) '从文件开始到位图数据开始的偏移动量
		BmpHead = BmpHead & Getbinary(40) '述位图的颜色、压缩方法等
		BmpHead = BmpHead & Getbinary(Width) '位图的宽度,以象素为单位 
		BmpHead = BmpHead & Getbinary(Height) '位图的高度,以象素为单位
		BmpHead = BmpHead & ChrB(1) & ChrB(0) '位图的位面数(注:该值将总是
		BmpHead = BmpHead & ChrB(24) & ChrB(0) '每个象素的位数
		BmpHead = BmpHead & Getbinary(0) '压缩说明 
		BmpHead = BmpHead & Getbinary(BmpSize) '用字节数表示的位图数据的大小。该数必须是4的倍数
		BmpHead = BmpHead & Getbinary(65536) '用象素/米表示的水平分辨率
		BmpHead = BmpHead & Getbinary(65536) '用象素/米表示的垂直分辨率
		BmpHead = BmpHead & Getbinary(16777216) '位图使用的颜色数
		BmpHead = BmpHead & Getbinary(16777216) '指定重要的颜色数
	End Function
	Private Function GetRndTextData()
		ReDim TextData(TextLength-1)
		Dim IText
		For IText = 0 To TextLength-1 Step +1
			TextData(IText) = GetColorString(BackColor) & " " & GetColorString(TextColor) & " " & TextDataLib(GetRnd(1,TextDataLength))
			SessionString = SessionString & GetTextData(IText)(4)
		Next
	End Function
	Private Function GetTextData(IText)
		Dim TextArray,ArrayLength,ITextData
			TextArray = Split(TextData(IText)," ")
			ArrayLength = UBound(TextArray)
		Dim TextDataArray(5)
			TextDataArray(0) = TextArray(0)	'背景颜色
			TextDataArray(1) = TextArray(1)	'字符颜色
			TextDataArray(2) = Len(TextArray(3))	'单字符宽度
			TextDataArray(3) = ArrayLength - 2	'单字符高度
			TextDataArray(4) = TextArray(2)	'字符
		For ITextData = 3 To ArrayLength Step +1
			TextDataArray(5) = TextDataArray(5) & " " & TextArray(ITextData) '点阵数据
		Next
			GetTextData = TextDataArray
	End Function
	Private Function GetColor(ColorString)
		GetColor = ChrB("&H" & Mid(ColorString,6,2)) & ChrB("&H" & Mid(ColorString,4,2)) & ChrB("&H" & Mid(ColorString,2,2))
	End Function
	Private Function BmpColor(ColorA,ColorB)
		Dim BmpColor_(1)
			BmpColor_(0) = GetColor(ColorA)
			BmpColor_(1) = GetColor(ColorB)
			BmpColor = BmpColor_
	End Function
	Private Function SetBmpData()
		Dim TextInfo,FontData,I,J,K
			GetRndTextData()
			TextInfo = GetTextData(0)
			BmpHeight = TextInfo(3)
			BmpWidth = TextInfo(2) * TextLength
			BmpSize = BmpHeight * BmpWidth * 3
		For I = BmpHeight To 1 Step -1
			For J = 0 To TextLength -1 Step +1
				TextInfo = GetTextData(J)
				FontData = Split(TextInfo(5)," ")(I)
				For K = 1 To TextInfo(2) Step +1
					If GetRnd(1,99) < YawpCount Then
						BmpData = BmpData & GetColor(GetColorString(YawpColor))
					Else
						BmpData = BmpData & BmpColor(TextInfo(0),TextInfo(1))(Mid(FontData,K,1))
					End If
				Next
			Next
		Next
	End Function
	Public Function Write()
		FileHeader()
		SetBmpData()
		SetBmpHead BmpSize,BmpWidth,BmpHeight
		Response.BinaryWrite BmpHead
		Response.BinaryWrite BmpData
		Session(SessionName) = SessionString
	End Function
End Class
Dim Bmp
Set Bmp = New CAMXAM_COM_RndCodeBmp
	Bmp.SetTextInfo "8 × 12 字库 字库来源 Wh_BmpText http://vcc5.vicp.net Email: wuyingke5155@163.com Oicq:54883661"	'字库信息
	Bmp.AddTextData "0 00000000 00000000 00111000 01000100 01000100 01000100 01000100 01000100 01000100 00111000 00000000 00000000"
	Bmp.AddTextData "1 00000000 00000000 00110000 01010000 00010000 00010000 00010000 00010000 00010000 01111100 00000000 00000000"
	Bmp.AddTextData "2 00000000 00000000 01111000 00000100 00000100 00001000 00010000 00100000 01000000 01111100 00000000 00000000"
	Bmp.AddTextData "3 00000000 00000000 01111000 00000100 00000100 00111000 00000100 00000100 00000100 01111000 00000000 00000000"
	Bmp.AddTextData "4 00000000 00000000 00001000 00011000 00101000 00101000 01001000 01111100 00001000 00001000 00000000 00000000"
	Bmp.AddTextData "5 00000000 00000000 01111000 01000000 01000000 01110000 00001000 00001000 00001000 01110000 00000000 00000000"
	Bmp.AddTextData "6 00000000 00000000 00111100 01000000 01000000 01011000 01100100 01000100 01000100 00111000 00000000 00000000"
	Bmp.AddTextData "7 00000000 00000000 01111100 00000100 00001000 00010000 00100000 00100000 01000000 01000000 00000000 00000000"
	Bmp.AddTextData "8 00000000 00000000 00111000 01000100 01000100 00111000 01001100 01000100 01000100 00111000 00000000 00000000"
	Bmp.AddTextData "9 00000000 00000000 00111000 01000100 01000100 01001100 00110100 00000100 00000100 01111000 00000000 00000000"
	Bmp.AddTextData "A 00000000 00000000 00010000 00101000 00101000 00101000 01000100 01111100 01000100 10000010 00000000 00000000"
	Bmp.AddTextData "B 00000000 00000000 01111000 01000100 01000100 01111000 01001000 01000100 01000100 01111000 00000000 00000000"
	Bmp.AddTextData "C 00000000 00000000 00011100 00100000 01000000 01000000 01000000 01000000 00100000 00011100 00000000 00000000"
	Bmp.AddTextData "D 00000000 00000000 01110000 01001000 01000100 01000100 01000100 01000100 01001000 01110000 00000000 00000000"
	Bmp.AddTextData "E 00000000 00000000 01111100 01000000 01000000 01111000 01000000 01000000 01000000 01111100 00000000 00000000"
	Bmp.AddTextData "F 00000000 00000000 01111100 01000000 01000000 01111000 01000000 01000000 01000000 01000000 00000000 00000000"
	Bmp.AddTextData "G 00000000 00000000 00011100 00100000 01000000 01000000 01000100 01000100 00100100 00011100 00000000 00000000"
	Bmp.AddTextData "H 00000000 00000000 01000100 01000100 01000100 01111100 01000100 01000100 01000100 01000100 00000000 00000000"
	Bmp.AddTextData "I 00000000 00000000 01111100 00010000 00010000 00010000 00010000 00010000 00010000 01111100 00000000 00000000"
	Bmp.AddTextData "J 00000000 00000000 00111000 00001000 00001000 00001000 00001000 00001000 00001000 01110000 00000000 00000000"
	Bmp.AddTextData "K 00000000 00000000 01000100 01001000 01010000 01100000 01100000 01010000 01001000 01000100 00000000 00000000"
	Bmp.AddTextData "L 00000000 00000000 01000000 01000000 01000000 01000000 01000000 01000000 01000000 01111100 00000000 00000000"
	Bmp.AddTextData "M 00000000 00000000 10000100 10000100 11001100 11001100 10110100 10110100 10000100 10000100 00000000 00000000"
	Bmp.AddTextData "N 00000000 00000000 01000100 01100100 01100100 01010100 01010100 01001100 01001100 01000100 00000000 00000000"
	Bmp.AddTextData "O 00000000 00000000 00010000 00101000 01000100 01000100 01000100 01000100 00101000 00010000 00000000 00000000"
	Bmp.AddTextData "P 00000000 00000000 01111000 01000100 01000100 01001000 01110000 01000000 01000000 01000000 00000000 00000000"
	Bmp.AddTextData "Q 00000000 00000000 00010000 00101000 01000100 01000100 01000100 01000100 00101000 00011000 00000100 00000000"
	Bmp.AddTextData "R 00000000 00000000 01111000 01000100 01000100 01000100 01111000 01001000 01000100 01000100 00000000 00000000"
	Bmp.AddTextData "S 00000000 00000000 00111100 01000000 01000000 00110000 00001000 00000100 00000100 01111000 00000000 00000000"
	Bmp.AddTextData "T 00000000 00000000 11111110 00010000 00010000 00010000 00010000 00010000 00010000 00010000 00000000 00000000"
	Bmp.AddTextData "U 00000000 00000000 01000100 01000100 01000100 01000100 01000100 01000100 01000100 00111000 00000000 00000000"
	Bmp.AddTextData "V 00000000 00000000 10000010 01000100 01000100 01000100 00101000 00101000 00101000 00010000 00000000 00000000"
	Bmp.AddTextData "W 00000000 00000000 10000010 10000010 10010010 10010010 01101100 01101100 01000100 01000100 00000000 00000000"
	Bmp.AddTextData "X 00000000 00000000 01000100 00101000 00101000 00010000 00010000 00101000 01000100 01000100 00000000 00000000"
	Bmp.AddTextData "Y 00000000 00000000 01000100 01000100 00101000 00101000 00010000 00010000 00010000 00010000 00000000 00000000"
	Bmp.AddTextData "Z 00000000 00000000 01111100 00000100 00001000 00010000 00010000 00100000 01000000 01111100 00000000 00000000"
	Bmp.SessionName = "code"	'验证码用Session名称
	Bmp.TextLength = 6	'验证码长度
	Bmp.BackColor = "#FFFFFF"	'背景颜色,多个颜色用"," 分隔
	Bmp.TextColor = "#FF0000,#00FF00,#0000FF"	'文字颜色,多个颜色用"," 分
	Bmp.YawpColor = "#000000"	'噪波点颜色,多个颜色使用"," 分隔
	Bmp.YawpCount = 10	'噪波点比例 0-100
	Bmp.Write()
%>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值