用asp实现无组件生成验证码的方法2种

2018-09-06 11:56

阅读:332

  无组件生成验证码-GIF格式
复制代码 代码如下:
<%
OptionExplicit显示声明

ClassCom_GifCode_Class

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.AddHeaderpragma,no-cache
Response.AddHeadercache-ctrol,no-cache

文件类型
Response.BinaryWriteChrB(Asc(G))&ChrB(Asc(I))&ChrB(Asc(F))
版本信息
Response.BinaryWriteChrB(Asc(8))&ChrB(Asc(9))&ChrB(Asc(a))
逻辑屏幕宽度
Response.BinaryWriteChrB(WidthMod256)&ChrB((Width\256)Mod256)
逻辑屏幕高度
Response.BinaryWriteChrB(HeightMod256)&ChrB((Height\256)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((Width\256)Mod256)
图象高度
Response.BinaryWriteChrB(HeightMod256)&ChrB((Height\256)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



禁止缓存
Response.Expires=-9999
Response.AddHeaderPragma,no-cache
Response.AddHeadercache-ctrol,no-cache

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



评论


亲,登录后才可以留言!