无组件生成验证码-GIF格式
复制代码 代码如下:
<%
OptionExplicit'显示声明
ClassCom_GifCode_Class
'''''''''''''''''''''''''''''''''''''''''''''
'Author:Layensupport@ssaw.net84815733(QQ)
'Thanks:Laomi,Laomiao,NetRube
'2006-01-02
'''''''''''''''''''''''''''''''''''''''''''''
PublicNoisy,Count,Width,Height,Angle,Offset,Border
PrivateGraph(),Margin(3)
PrivateSubClass_Initialize()
Randomize
Noisy=16'干扰点出现的概率
Count=4'字符数量
Width=80'图片宽度
Height=20'图片高度
Angle=2'角度随机变化量
Offset=20'偏移随机变化量
Border=1'边框大小
EndSub
PublicFunctionCreate()
ConstcCharSet="123456789"
Dimi,x,y
DimvValidCode:vValidCode=""
DimvIndex
ReDimGraph(Width-1,Height-1)
Fori=0ToCount-1
vIndex=Int(Rnd*Len(cCharSet))
vValidCode=vValidCode+Mid(cCharSet,vIndex+1,1)
SetDrawvIndex,i
Next
Create=vValidCode
EndFunction
SubSetDot(pX,pY)
IfpX*(Width-pX-1)>=0AndpY*(Height-pY-1)>=0Then
Graph(pX,pY)=1
EndIf
EndSub
PublicSubSetDraw(pIndex,pNumber)
'字符数据
DimDotData(8)
DotData(0)=Array(30,15,50,1,50,100)
DotData(1)=Array(1,34,30,1,71,1,100,34,1,100,93,100,100,86)
DotData(2)=Array(1,1,100,1,42,42,100,70,50,100,1,70)
DotData(3)=Array(100,73,6,73,75,6,75,100)
DotData(4)=Array(100,1,1,1,1,50,50,35,100,55,100,80,50,100,1,95)
DotData(5)=Array(100,20,70,1,20,1,1,30,1,80,30,100,70,100,100,80,100,60,70,50,30,50,1,60)
DotData(6)=Array(6,26,6,6,100,6,53,100)
DotData(7)=Array(100,30,100,20,70,1,30,1,1,20,1,30,100,70,100,80,70,100,30,100,1,80,1,70,100,30)
DotData(8)=Array(1,80,30,100,80,100,100,70,100,20,70,1,30,1,1,20,1,40,30,50,70,50,100,40)
DimvExtent:vExtent=Width/Count
Margin(0)=Border+vExtent*(Rnd*Offset)/100+Margin(1)
Margin(1)=vExtent*(pNumber+1)-Border-vExtent*(Rnd*Offset)/100
Margin(2)=Border+Height*(Rnd*Offset)/100
Margin(3)=Height-Border-Height*(Rnd*Offset)/100
DimvStartX,vEndX,vStartY,vEndY
DimvWidth,vHeight,vDX,vDY,vDeltaT
DimvAngle,vLength
vWidth=Int(Margin(1)-Margin(0))
vHeight=Int(Margin(3)-Margin(2))
'起始坐标
vStartX=Int((DotData(pIndex)(0)-1)*vWidth/100)
vStartY=Int((DotData(pIndex)(1)-1)*vHeight/100)
Dimi,j
Fori=1ToUBound(DotData(pIndex),1)/2
IfDotData(pIndex)(2*i-2)<>0AndDotData(pIndex)(2*i)<>0Then
'终点坐标
vEndX=(DotData(pIndex)(2*i)-1)*vWidth/100
vEndY=(DotData(pIndex)(2*i+1)-1)*vHeight/100
'横向差距
vDX=vEndX-vStartX
'纵向差距
vDY=vEndY-vStartY
'倾斜角度
IfvDX=0Then
vAngle=Sgn(vDY)*3.14/2
Else
vAngle=Atn(vDY/vDX)
EndIf
'两坐标距离
IfSin(vAngle)=0Then
vLength=vDX
Else
vLength=vDY/Sin(vAngle)
EndIf
'随机转动角度
vAngle=vAngle+(Rnd-0.5)*2*Angle*3.14*2/100
vDX=Int(Cos(vAngle)*vLength)
vDY=Int(Sin(vAngle)*vLength)
IfAbs(vDX)>Abs(vDY)ThenvDeltaT=Abs(vDX)ElsevDeltaT=Abs(vDY)
Forj=1TovDeltaT
SetDotMargin(0)+vStartX+j*vDX/vDeltaT,Margin(2)+vStartY+j*vDY/vDeltaT
Next
vStartX=vStartX+vDX
vStartY=vStartY+vDY
EndIf
Next
EndSub
PublicSubOutput()
Response.Expires=-9999
Response.AddHeader"pragma","no-cache"
Response.AddHeader"cache-ctrol","no-cache"
Response.ContentType="image/gif"
'文件类型
Response.BinaryWriteChrB(Asc("G"))&ChrB(Asc("I"))&ChrB(Asc("F"))
'版本信息
Response.BinaryWriteChrB(Asc("8"))&ChrB(Asc("9"))&ChrB(Asc("a"))
'逻辑屏幕宽度
Response.BinaryWriteChrB(WidthMod256)&ChrB((Width256)Mod256)
'逻辑屏幕高度
Response.BinaryWriteChrB(HeightMod256)&ChrB((Height256)Mod256)
Response.BinaryWriteChrB(128)&ChrB(0)&ChrB(0)
'全局颜色列表
Response.BinaryWriteChrB(255)&ChrB(255)&ChrB(255)
Response.BinaryWriteChrB(0)&ChrB(85)&ChrB(255)
'图象标识符
Response.BinaryWriteChrB(Asc(","))
Response.BinaryWriteChrB(0)&ChrB(0)&ChrB(0)&ChrB(0)
'图象宽度
Response.BinaryWriteChrB(WidthMod256)&ChrB((Width256)Mod256)
'图象高度
Response.BinaryWriteChrB(HeightMod256)&ChrB((Height256)Mod256)
Response.BinaryWriteChrB(0)&ChrB(7)&ChrB(255)
Dimx,y,i:i=0
Fory=0ToHeight-1
Forx=0ToWidth-1
IfRnd<Noisy/100Then
Response.BinaryWriteChrB(1-Graph(x,y))
Else
Ifx*(x-Width)=0Ory*(y-Height)=0Then
Response.BinaryWriteChrB(Graph(x,y))
Else
IfGraph(x-1,y)=1OrGraph(x,y)OrGraph(x,y-1)=1Then
Response.BinaryWriteChrB(1)
Else
Response.BinaryWriteChrB(0)
EndIf
EndIf
EndIf
If(y*Width+x+1)Mod126=0Then
Response.BinaryWriteChrB(128)
i=i+1
EndIf
If(y*Width+x+i+1)Mod255=0Then
If(Width*Height-y*Width-x-1)>255Then
Response.BinaryWriteChrB(255)
Else
Response.BinaryWriteChrB(Width*HeightMod255)
EndIf
EndIf
Next
Next
Response.BinaryWriteChrB(128)&ChrB(0)&ChrB(129)&ChrB(0)&ChrB(59)
EndSub
EndClass
DimmCode
SetmCode=NewCom_GifCode_Class
Session("GetCode")=mCode.Create()
mCode.Output()
SetmCode=Nothing
%>
无组件生成验证码-BMP格式
复制代码 代码如下:
CallCom_CreatValidCode("ValidCode")
SubCom_CreatValidCode(pSN)
'Author:Layen
'QQ:84815733
'E-mail:support@ssaw.net
'禁止缓存
Response.Expires=-9999
Response.AddHeader"Pragma","no-cache"
Response.AddHeader"cache-ctrol","no-cache"
Response.ContentType="Image/BMP"
Randomize
Dimi,ii,iii
ConstcOdds=8'杂点出现的机率
ConstcAmount=36'文字数量
ConstcCode="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
'颜色的数据(字符,背景)
DimvColorData(1)
vColorData(0)=ChrB(0)&ChrB(0)&ChrB(0)'蓝0,绿0,红0(黑色)
vColorData(1)=ChrB(250)&ChrB(236)&ChrB(211)'蓝250,绿236,红211(浅蓝色)
'随机产生字符
DimvCode(4),vCodes
Fori=0To3
vCode(i)=Int(Rnd*cAmount)
vCodes=vCodes&Mid(cCode,vCode(i)+1,1)
Next
Session(pSN)=vCodes'记录入Session
'字符的数据
DimvNumberData(35)
vNumberData(0)="1110000111110111101111011110111101001011110100101111
010010111101001011110111101111011110111110000111"
vNumberData(1)="1111011111110001111111110111111111011111111101111111
110111111111011111111101111111110111111100000111"
vNumberData(2)="1110000111110111101111011110111111111011111111011111
111011111111011111111011111111011110111100000011"
vNumberData(3)="1110000111110111101111011110111111110111111100111111
111101111111111011110111101111011110111110000111"
vNumberData(4)="1111101111111110111111110011111110101111110110111111
011011111100000011111110111111111011111111000011"
vNumberData(5)="1100000011110111111111011111111101000111110011101111
111110111111111011110111101111011110111110000111"
vNumberData(6)="1111000111111011101111011111111101111111110100011111
001110111101111011110111101111011110111110000111"
vNumberData(7)="1100000011110111011111011101111111101111111110111111
110111111111011111111101111111110111111111011111"
vNumberData(8)="1110000111110111101111011110111101111011111000011111
101101111101111011110111101111011110111110000111"
vNumberData(9)="1110001111110111011111011110111101111011110111001111
100010111111111011111111101111011101111110001111"
vNumberData(10)="1111011111111101111111101011111110101111111010111111
101011111100000111110111011111011101111000100011"
vNumberData(11)="1000000111110111101111011110111101110111110000111111
011101111101111011110111101111011110111000000111"
vNumberData(12)="1110000011110111101110111110111011111111101111111110
111111111011111111101111101111011101111110001111"
vNumberData(13)="10000011111101110111110111101111011110111101111011110
11110111101111011110111101111011101111000001111"
vNumberData(14)="10000001111101111011110110111111011011111100001111110
11011111101101111110111111111011110111000000111"
vNumberData(15)="10000001111101111011110110111111011011111100001111110
11011111101101111110111111111011111111000111111"
vNumberData(16)="11100001111101110111101111011110111111111011111111101
11111111011100011101111011111011101111110001111"
vNumberData(17)="10001000111101110111110111011111011101111100000111110
11101111101110111110111011111011101111000100011"
vNumberData(18)="11000001111111011111111101111111110111111111011111111
10111111111011111111101111111110111111100000111"
vNumberData(19)="11100000111111101111111110111111111011111111101111111
11011111111101111111110111110111011111000011111"
vNumberData(20)="10001000111101110111110110111111010111111100011111110
10111111101101111110110111111011101111000100011"
vNumberData(21)="10001111111101111111110111111111011111111101111111110
11111111101111111110111111111011110111000000011"
vNumberData(22)="10001000111100100111110010011111001001111101010111110
10101111101010111110101011111010101111001010011"
vNumberData(23)="10001000111100110111110011011111010101111101010111110
10101111101100111110110011111011001111000110111"
vNumberData(24)="11100011111101110111101111101110111110111011111011101
11110111011111011101111101111011101111110001111"
vNumberData(25)="10000001111101111011110111101111011110111100000111110
11111111101111111110111111111011111111000111111"
vNumberData(26)="11100011111101110111101111101110111110111011111011101
11110111011111011101001101111011001111110001011"
vNumberData(27)="10000011111101110111110111011111011101111100001111110
10111111101101111110110111111011101111000110011"
vNumberData(28)="11100000111101111011110111101111011111111110011111111
11001111111111011110111101111011110111100000111"
vNumberData(29)="10000000111011011011111101111111110111111111011111111
10111111111011111111101111111110111111110001111"
vNumberData(30)="10001000111101110111110111011111011101111101110111110
11101111101110111110111011111011101111110001111"
vNumberData(31)="10001000111101110111110111011111011101111110101111111
01011111110101111111010111111110111111111011111"
vNumberData(32)="10010100111101010111110101011111010101111101010111110
01001111110101111111010111111101011111110101111"
vNumberData(33)="10001000111101110111111010111111101011111111011111111
10111111110101111111010111111011101111000100011"
vNumberData(34)="10001000111101110111110111011111101011111110101111111
10111111111011111111101111111110111111110001111"
vNumberData(35)="11000000111101110111111111011111111011111111101111111
10111111111011111111011111111101110111100000011"
'输出图像文件头
Response.BinaryWriteChrB(66)&ChrB(77)&ChrB(230)&ChrB(4)&ChrB(0)&ChrB(0)&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(40)&ChrB(0)&ChrB(0)&ChrB(0)&ChrB(10)&ChrB(0)&_
ChrB(0)&ChrB(0)&ChrB(1)&ChrB(0)
'输出图像信息头
Response.BinaryWriteChrB(24)&ChrB(0)&ChrB(0)&ChrB(0)&ChrB(0)&ChrB(0)&ChrB(176)&ChrB(4)&_
ChrB(0)&ChrB(0)&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)
Fori=9To0Step-1'历经所有行
Forii=0To3'历经所有字
Foriii=1To10'历经所有像素
'逐行、逐字、逐像素地输出图像数据
IfRnd*99+1<cOddsThen'随机生成杂点
Response.BinaryWritevColorData(0)
Else
Response.BinaryWritevColorData(Mid(vNumberData(vCode(ii)),i*10+iii,1))
EndIf
Next
Next
Next
EndSub