复制代码- <%
- '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
- If PLength < 2 Then PLength = 2
- 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) = UCase(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对齐处理 by V37
- 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 * 150 + 50) & ChrB(Rnd * 200 + 20) & ChrB(Rnd * 150 + 50)
- End Function
- End Class
- Dim VCode : Set VCode = New ValidCode
- VCode.BgColor = ChrB(255) & ChrB(255) & ChrB(255)
- VCode.Noise = 5 + Rnd(3)
- VCode.Length = 4
- VCode.Generate("GetCode")
- Set VCode = Nothing
- %>
|