+------------------------------------------------------------------------------------------------------+
敝帚自珍:ASP验证码类ValidCode [2005-10-21] Xmercy 发表在 Develop
| 1.支持背景色 2.文字颜色随机 3.支持噪点 4.文字字数可控 5.Session名可控
<% 'ValidCode 图片验证码类 '我佛山人@2005.8.23 Option Explicit Response.Buffer = true Class ValidCode Private PNoise Private PBgColor Private PLength Private charSet Private charSetCount
'噪点 Public Property Let Noise(ByVal value) If IsNumeric(value) Then PNoise = CInt(value) Mod 100 End If End Property Public Property Get Noise() Noise = PNoise End Property
'背景颜色 Public Property Let BgColor(ByVal value) PBgColor = value End Property Public Property Get BgColor() BgColor = PBgColor End Property
'验证码长度 Public Property Let Length(ByVal value) PLength = value End Property Public Property Get Length() Length = PLength End Property
Private Sub Class_Initialize() charSet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" charSetCount = Len(charSet) Noise = 6 Length = 4 BgColor = ChrB(250) & ChrB(250) & ChrB(240) End Sub Private Sub Class_Terminate() End Sub
Public Sub Generate(sessionName) ' 字符数据 Dim numberSet(35) numberSet(0) = "1110000111110111101111011110111101001011110100101111010010111101001011110111101111011110111110000111" numberSet(1) = "1111011111110001111111110111111111011111111101111111110111111111011111111101111111110111111100000111" numberSet(2) = "1110000111110111101111011110111111111011111111011111111011111111011111111011111111011110111100000011" numberSet(3) = "1110000111110111101111011110111111110111111100111111111101111111111011110111101111011110111110000111" numberSet(4) = "1111101111111110111111110011111110101111110110111111011011111100000011111110111111111011111111000011" numberSet(5) = "1100000011110111111111011111111101000111110011101111111110111111111011110111101111011110111110000111" numberSet(6) = "1111000111111011101111011111111101111111110100011111001110111101111011110111101111011110111110000111" numberSet(7) = "1100000011110111011111011101111111101111111110111111110111111111011111111101111111110111111111011111" numberSet(8) = "1110000111110111101111011110111101111011111000011111101101111101111011110111101111011110111110000111" numberSet(9) = "1110001111110111011111011110111101111011110111001111100010111111111011111111101111011101111110001111" numberSet(10) = "1111111111111100111111110011111110110111111011011111000000111101111011110111101111011110111000110001" numberSet(11) = "0000001111100111011110011110111001111011100000011110011110111001111101100111101110011101110000001111" numberSet(12) = "1111000010111011110011011111101011111110101111111110111111111011111110110111111011101111001111000010" numberSet(13) = "0000001111100111011110011110111001111101100111110110011111011001111101100111101110011101110000001111" numberSet(14) = "0000000011100111110110011111111001111011100000001110011110111001111111100111111110011111100000000001" numberSet(15) = "0000000011100111110110011111111001111011100000001110011110111001111111100111111110011111110001111111" numberSet(16) = "1111000010111011110011011111101011111110101111111110110000001011111100110111110011101111001111000010" numberSet(17) = "0000110000100111100110011110011001111001100000000110011110011001111001100111100110011110010000110000" numberSet(18) = "1100000011111100111111110011111111001111111100111111110011111111001111111100111111110011111100000011" numberSet(19) = "1100000011111100111111110011111111001111111100111111110011111111001111110100111110010011111100011111" numberSet(20) = "1000010001110011101111001101111100101111110000111111001101111100110111110011101111001110111000010001" numberSet(21) = "1000011111110011111111001111111100111111110011111111001111111100111111110011111111001110111000000011" numberSet(22) = "0000110000100111100110011100011010110001101011000110101100011010101001101100100110110110010001010000" numberSet(23) = "0001111000100011110110001111011000011101101000110110110001011011100101101110000110111100010001111001" numberSet(24) = "1111001111110011001110111111010011111100001111110000111111000011111100101111110111001100111111001111" numberSet(25) = "0000001111100111011110011100111001110011100111001110011101111000001111100111111110011111110000111111" numberSet(26) = "1110000111110011001110011110011001111001100111100110011110011001111001100110000111001100111110000001" numberSet(27) = "1000000011100111100110011110011001111001100111100110000000111001111001100111100110011110011001111101" numberSet(28) = "1110000011110011100111001110011100111111111000111111110001111111110011110011100111001110011110000011" numberSet(29) = "1000000001111100111111110011111111001111111100111111110011111111001111111100111111110011111110000111" numberSet(30) = "1001111001100111100110011110011001111001100111100110011110011001111001100111100111001100111110000111" numberSet(31) = "1001111001100111100111001100111100110011110011001111101101111110000111111000011111110011111111001111" numberSet(32) = "0111111110011101111001110111101010101101101010110110101011011010110101110111001111011110111101111011" numberSet(33) = "1001111001100111100111001100111110000111111000011111100001111110000111110011001110011110011001111001" numberSet(34) = "0000110000100111100111001100111110000111111000011111110011111111001111111100111111110011111110000111" numberSet(35) = "1000000000111111110011111110011110110011111100011111110011111110010111110011111110011111111000000000"
' 颜色数据 Randomize Dim i, ii, iii Dim colorSet : colorSet = Split(Space(Length - 1), " ") For i = 0 To Length - 1 colorSet(i) = RandomColor() Next ' 随机字符 Dim codes, code : code = Split(Space(Length - 1), " ") For i = 0 To Length - 1 code(i) = Int(Rnd * charSetCount) codes = codes & Mid(charSet, code(i) + 1, 1) Next Session(sessionName) = codes '记录Session
With Response .Expires = -1 .ExpiresAbsolute = Now - 1 .AddHeader "Pragma","no-cache" .AddHeader "cache-ctrol","no-cache" .CacheControl = "no-cache" .ContentType = "Image/BMP"
'dword对齐处理 Dim byteCount,BytePatch byteCount=((Length*10*3) mod 4) If byteCount>0 Then byteCount= 4 - ((Length*10*3) Mod 4) For i=1 To byteCount : BytePatch = BytePatch & chrB(00) : Next End If
'处理文件尺寸和图像数据信息 Dim datalength, filelength, fsize, datasize, schar, scharlen datasize = (Length*10*3+byteCount) * 10 + 2 fsize = datasize+54 schar = CStr(Hex(datasize)) schar = String(8 - Len(schar), "0") & schar For i=7 To 1 Step -2 datalength = datalength & ChrB("&H" & Mid(schar,i,2)) '文件尺寸 Next schar = CStr(Hex(fsize)) schar = String(8 - Len(schar), "0") & schar For i=7 To 1 Step -2 filelength = filelength & ChrB("&H" & Mid(schar,i,2)) '图像数据尺寸 Next '图像文件头 .BinaryWrite _ ChrB(66) & ChrB(77) & _ filelength & _ ChrB(0) & ChrB(0) & _ ChrB(0) & ChrB(0) & ChrB(54) & ChrB(0) & _ ChrB(0) & ChrB(0) & ChrB(40) & ChrB(0) & _ ChrB(0) & ChrB(0) & ChrB(10 * Length) & ChrB(0) & _ ChrB(0) & ChrB(0) & ChrB(10) & ChrB(0) & _ ChrB(0) & ChrB(0) & ChrB(1) & ChrB(0) ' 图像信息头 .BinaryWrite _ ChrB(24) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & _ datalength & _ ChrB(18) & ChrB(11) & ChrB(0) & ChrB(0) & _ ChrB(18) & ChrB(11) & ChrB(0) & ChrB(0) & _ ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & _ ChrB(0) & ChrB(0) & ChrB(0) For i = 9 To 0 Step -1 '行 For ii = 0 To Length - 1 ' 字 For iii = 1 To 10 ' 列 If Rnd * 99 + 1 < Noise Then ' 杂点 .BinaryWrite RandomColor() Else If Mid(numberSet(code(ii)), i * 10 + iii, 1) = "1" Then .BinaryWrite BgColor Else .BinaryWrite colorSet(ii) End If End If Next Next If byteCount>0 Then .BinaryWrite BytePatch Next End With End Sub
Private Function RandomColor() RandomColor = ChrB(Rnd * 230 + 25) & ChrB(Rnd * 230 + 25) & ChrB(Rnd * 230 + 25) End Function End Class
Dim VCode : Set VCode = New ValidCode VCode.BgColor = ChrB(255) & ChrB(255) & ChrB(255) VCode.Noise = 5 VCode.Length = 5 VCode.Generate("vCode") Set VCode = Nothing %>
| |
+------------------------------------------------------------------------------------------------------+ |