gif验证码生成技术

<%
'--------------------------------------
'Fly38.com - VerifyCode Class
' gif 验证码生成类
' 原作者:NetRube
'--------------------------------------
Class Fly38_VerifyCode
Public GlobalColorTable(), LocalColorTable()
Public TransparentColorIndex, UseTransparency
Public GIF89a
Public Comment

Private FGroundColorIndex, BGroundColorIndex
Private Image
Private GlobalColorTableSize, GlobalColorTableFlag, LocalColorTableSize, LocalColorTableFlag
Private Width_, Height_
Private LeftPosition, TopPosition
Private Bits, ColorResolution, CodeSize
Private PixelAspectRatio
Private SortFlag, InterlaceFlag
Private Seperator, GraphicControl, EndOfImage
Private Reserved

Private Font
Private Letter(19)

Private Sub Class_Initialize()
Image = ""

GIF89a = False

ReDim GlobalColorTable(256)
GlobalColorTableSize = 7
GlobalColorTableFlag = True

GlobalColorTable(2) = RGB(255, 0, 0)
GlobalColorTable(3) = RGB(0, 255, 0)
GlobalColorTable(4) = RGB(0, 0, 255)
GlobalColorTable(5) = RGB(255, 255, 0)
GlobalColorTable(6) = RGB(0, 255, 255)
GlobalColorTable(7) = RGB(255, 0, 255)

ReDim LocalColorTable(0)
LocalColorTableSize = 0
LocalColorTableFlag = False

ColorResolution = 7
Bits = 7
CodeSize = 7

BGroundColorIndex = 0
FGroundColorIndex = 1
TransparentColorIndex = 0
UseTransparency = False

LeftPosition = 0
TopPosition = 0
Width_ = 20
Height_ = 20

Clear

PixelAspectRatio = 0
SortFlag = False
InterlaceFlag = False
Seperator = Asc(",")
GraphicControl = Asc("!")
EndOfImage = Asc(";")

Comment = ""

Reserved = 0

Set Font = Server.CreateObject("Scripting.Dictionary")

Letter(0) = "00000000000000"
Letter(1) = "00001111100000"
Letter(2) = "00011111110000"
Letter(3) = "00111000111000"
Letter(4) = "00110000011100"
Letter(5) = "01110000001100"
Letter(6) = "01100000001110"
Letter(7) = "01100000001110"
Letter(8) = "11100000001110"
Letter(9) = "11000000001110"
Letter(10) = "11000000001110"
Letter(11) = "11100000001110"
Letter(12) = "11100000001100"
Letter(13) = "11100000001100"
Letter(14) = "01100000001100"
Letter(15) = "01110000011100"
Letter(15) = "00111000011000"
Letter(16) = "00011111110000"
Letter(17) = "00001111100000"
Letter(18) = "00000000000000"
Font.Add "0", Letter

Letter(0) = "00000000000000"
Letter(1) = "00000001110000"
Letter(2) = "00000001110000"
Letter(3) = "00000011100000"
Letter(4) = "00000011000000"
Letter(5) = "00000011000000"
Letter(6) = "00000011000000"
Letter(7) = "00000111000000"
Letter(8) = "00000111000000"
Letter(9) = "00000111000000"
Letter(10) = "00000110000000"
Letter(11) = "00000110000000"
Letter(12) = "00000110000000"
Letter(13) = "00000110000000"
Letter(14) = "00000110000000"
Letter(15) = "00000110000000"
Letter(15) = "00000110000000"
Letter(16) = "00000110000000"
Letter(17) = "00000010000000"
Letter(18) = "00000000000000"
Font.Add "1", Letter

Letter(0) = "00000000000000"
Letter(1) = "00001111110000"
Letter(2) = "00011111111000"
Letter(3) = "00111000011100"
Letter(4) = "01110000011100"
Letter(5) = "01110000011000"
Letter(6) = "01100000011000"
Letter(7) = "00000000111000"
Letter(8) = "00000001110000"
Letter(9) = "00000001110000"
Letter(10) = "00000011000000"
Letter(11) = "00000111000000"
Letter(12) = "00001110000000"
Letter(13) = "00011000000000"
Letter(14) = "00011000000000"
Letter(15) = "00110000011100"
Letter(16) = "01101111111100"
Letter(17) = "01111111111110"
Letter(18) = "01111100000000"
Letter(19) = "00000000000000"
Font.Add "2", Letter

Letter(0) = "00000000000000"
Letter(1) = "00001111111000"
Letter(2) = "00111111111000"
Letter(3) = "01110000111100"
Letter(4) = "01100000011000"
Letter(5) = "01000000111000"
Letter(6) = "00000000111000"
Letter(7) = "00000001110000"
Letter(8) = "00000011000000"
Letter(9) = "00000111110000"
Letter(10) = "00000100111000"
Letter(11) = "00000000011100"
Letter(12) = "00000000011100"
Letter(13) = "00000000011100"
Letter(14) = "00000000011100"
Letter(15) = "00000000011000"
Letter(16) = "11100000111000"
Letter(17) = "11111111110000"
Letter(18) = "01111111100000"
Letter(19) = "00000000000000"
Font.Add "3", Letter

Letter(0) = "00000000000000"
Letter(1) = "00000000111000"
Letter(2) = "00000001111000"
Letter(3) = "00000011100000"
Letter(4) = "00000111011100"
Letter(5) = "00001110011100"
Letter(6) = "00001100011000"
Letter(7) = "00011000111000"
Letter(8) = "00111000110000"
Letter(9) = "01110000110000"
Letter(10) = "01100000110000"
Letter(11) = "01100000110000"
Letter(12) = "11000111111110"
Letter(13) = "11111111111100"
Letter(14) = "11111111100000"
Letter(15) = "11100001100000"
Letter(16) = "00000001110000"
Letter(17) = "00000000110000"
Letter(18) = "00000000110000"
Letter(19) = "00000000100000"
Font.Add "4", Letter

Letter(0) = "00000000000000"
Letter(1) = "00001100000100"
Letter(2) = "00011111111110"
Letter(3) = "00011111111100"
Letter(4) = "00011110000000"
Letter(5) = "00011000000000"
Letter(6) = "00111000000000"
Letter(7) = "00111000000000"
Letter(8) = "00111111110000"
Letter(9) = "00111111111000"
Letter(10) = "00000000011000"
Letter(11) = "00000000011000"
Letter(12) = "00000000011000"
Letter(13) = "00000000011000"
Letter(14) = "00000000011000"
Letter(15) = "00000000011000"
Letter(16) = "00000001111000"
Letter(17) = "01111111110000"
Letter(18) = "00111111000000"
Letter(19) = "00000000100000"
Font.Add "5", Letter

Letter(0) = "00000000000000"
Letter(1) = "00000011110000"
Letter(2) = "00000111100000"
Letter(3) = "00001110000000"
Letter(4) = "00011100000000"
Letter(5) = "00111000000000"
Letter(6) = "00110000000000"
Letter(7) = "00110000000000"
Letter(8) = "01111111110000"
Letter(9) = "01111111111000"
Letter(10) = "01110000011100"
Letter(11) = "01100000001100"
Letter(12) = "01100000001100"
Letter(13) = "01100000001100"
Letter(14) = "01100000001100"
Letter(15) = "01110000011100"
Letter(16) = "00110000011100"
Letter(17) = "00111111111000"
Letter(18) = "00011111110000"
Letter(19) = "00000000000000"
Font.Add "6", Letter

Letter(0) = "00000000000000"
Letter(1) = "00100111111110"
Letter(2) = "01111111111100"
Letter(3) = "01111110011100"
Letter(4) = "00000000011000"
Letter(5) = "00000000111000"
Letter(6) = "00000000110000"
Letter(7) = "00000000110000"
Letter(8) = "00000000110000"
Letter(9) = "00000001110000"
Letter(10) = "00000001100000"
Letter(11) = "00000001100000"
Letter(12) = "00000001100000"
Letter(13) = "00000001100000"
Letter(14) = "00000011100000"
Letter(15) = "00000011100000"
Letter(16) = "00000011100000"
Letter(17) = "00000001000000"
Letter(18) = "00000001000000"
Letter(19) = "00000000000000"
Font.Add "7", Letter

Letter(0) = "00000000000000"
Letter(1) = "00001111110000"
Letter(2) = "00011111111000"
Letter(3) = "00111000011000"
Letter(4) = "00110000011000"
Letter(5) = "01110000011100"
Letter(6) = "01110000011000"
Letter(7) = "00110000011000"
Letter(8) = "00111101111000"
Letter(9) = "00011111111000"
Letter(10) = "00111000111100"
Letter(11) = "01110000001100"
Letter(12) = "01110000001100"
Letter(13) = "01100000001110"
Letter(14) = "01100000001100"
Letter(15) = "01100000001100"
Letter(16) = "01110000011100"
Letter(17) = "00111111111100"
Letter(18) = "00011111110000"
Letter(19) = "00000000000000"
Font.Add "8", Letter

Letter(0) = "00000000000000"
Letter(1) = "00011111110000"
Letter(2) = "00111111111000"
Letter(3) = "01110000111000"
Letter(4) = "01110000011100"
Letter(5) = "01100000001100"
Letter(6) = "01100000001100"
Letter(7) = "01100000001100"
Letter(8) = "01100000001100"
Letter(9) = "01110000011100"
Letter(10) = "00111111111100"
Letter(11) = "00011111111100"
Letter(12) = "00000000011000"
Letter(13) = "00000000011000"
Letter(14) = "00000000111000"
Letter(15) = "00000001110000"
Letter(16) = "00000011100000"
Letter(17) = "00000111000000"
Letter(18) = "00011110000000"
Letter(19) = "00000000000000"
Font.Add "9", Letter
End Sub
Private Sub Class_Terminate()
Font.RemoveAll
Set Font = Nothing
End Sub

Public Property Get Width()
Width = Width_
End Property

Public Property Get Height()
Height = Height_
End Property

Public Property Get Version()
Version = "NetRube VerifyCode Class 1.0 Build 20041225"
End Property

Public Property Let BGroundColor(ByVal Color)
GlobalColorTable(0) = MakeColor(Color)
BGroundColorIndex = 0
End Property

Public Property Let FGroundColor(ByVal Color)
GlobalColorTable(1) = MakeColor(Color)
FGroundColorIndex = 1
End Property

Public Property Get Pixel(ByVal PX, ByVal PY)
If (PX > 0 And PX <= Width_) And (PY > 0 And PY <= Height_) Then
Pixel = AscB(MidB(Image, (Width_ * (PY - 1)) + PX, 1))
Else
Pixel = 0
End If
End Property

Public Property Let Pixel(ByVal PX, ByVal PY, PValue)
Dim Offset

PX = Int(PX)
PY = Int(PY)
PValue = Int(PValue)

Offset = Width_ * (PY - 1)

If (PX > 0 And PX <= Width_) And (PY > 0 And PY <= Height_) Then
Image = LeftB(Image, Offset + (PX - 1)) & ChrB(PValue) & RightB(Image, LenB(Image) - (Offset + PX))
End If
End Property

Public Sub Clear()
Image = String(Width_ * (Height_ + 1) / 2, ChrB(BGroundColorIndex) & ChrB(BGroundColorIndex))
End Sub

Public Sub Resize(ByVal NewWidth, ByVal NewHeight, RPreserve)
Dim OldImage, OldWidth, OldHeight
Dim CopyWidth, CopyHeight
Dim X, Y

If RPreserve Then
OldImage = Image
OldWidth = Width_
OldHeight = Height_
End If

Width_ = NewWidth
Height_ = NewHeight

Clear

If RPreserve Then
If NewWidth > OldWidth Then CopyWidth = OldWidth Else CopyWidth = NewWidth
If NewHeight > OldHeight Then CopyHeight = OldHeight Else CopyHeight = NewHeight

Width_ = NewWidth
Height_ = NewHeight

For Y = 1 To CopyHeight
For X = 1 To CopyWidth
Pixel(X, Y) = AscB(MidB(OldImage, (OldWidth * (Y - 1)) + X, 1))
Next
Next
End If
End Sub

Private Function ShiftLeft(SLValue, SLBits)
ShiftLeft = SLValue * (2 ^ SLBits)
End Function

Private Function ShiftRight(SRValue, SRBits)
ShiftRight = Int(SRValue / (2 ^ SRBits))
End Function

Private Function Low(LValue)
Low = LValue And &HFF
End Function

Private Function High(HValue)
High = ShiftRight(HValue, 8)
End Function

Private Function Blue(BValue)
Blue = Low(ShiftRight(BValue, 16))
End Function

Private Function Green(GValue)
Green = Low(ShiftRight(GValue, 8))
End Function

Private Function Red(RValue)
Red = Low(RValue)
End Function

Private Function MakeColor(MCValue)
MakeColor = CLng("&H" & Right(MCValue, 2) & Mid(MCValue, 4, 2) & Mid(MCValue, 2, 2))
End Function

Private Function GetWord(GWValue)
GetWord = ShiftLeft(AscB(RightB(GWValue, 1)), 8) Or AscB(LeftB(GWValue, 1))
End Function

Private Function MakeWord(MWValue)
MakeWord = ChrB(Low(MWValue)) & ChrB(High(MWValue))
End Function

Private Function MakeByte(MBValue)
MakeByte = ChrB(Low(MBValue))
End Function

Private Function UncompressedData()
Dim ClearCode, ChunkMax, EndOfStream
Dim UDData, UD, U

UncompressedData = ""

ClearCode = 2 ^ Bits
ChunkMax = 2 ^ Bits - 2
EndOfStream = ClearCode + 1

UDData = ""

For U = 1 To LenB(Image) Step ChunkMax
UDData = UDData & MidB(Image, U, ChunkMax) & ChrB(ClearCode)
Next

For U = 1 To LenB(UDData) Step &HFF
UD = MidB(UDData, U, &HFF)
UncompressedData = UncompressedData & MakeByte(LenB(UD)) & UD
Next

UncompressedData = UncompressedData & MakeByte(&H00)
UncompressedData = UncompressedData & MakeByte(EndOfStream)
End Function

Private Function GetGColorTable()
Dim GGCT

GetGColorTable = ""

For GGCT = 0 To UBound(GlobalColorTable) - 1
GetGColorTable = GetGColorTable & MakeByte(Red(GlobalColorTable(GGCT)))
GetGColorTable = GetGColorTable & MakeByte(Green(GlobalColorTable(GGCT)))
GetGColorTable = GetGColorTable & MakeByte(Blue(GlobalColorTable(GGCT)))
Next
End Function

Private Function GetLColorTable()
Dim GLCT

GetLColorTable = ""

For GLCT = 0 To UBound(LocalColorTable) - 1
GetLColorTable = GetLColorTable & MakeByte(Red(LocalColorTable(GLCT)))
GetLColorTable = GetLColorTable & MakeByte(Green(LocalColorTable(GLCT)))
GetLColorTable = GetLColorTable & MakeByte(Blue(LocalColorTable(GLCT)))
Next
End Function

Private Function GlobalDescriptor()
GlobalDescriptor = 0

If GlobalColorTableFlag Then GlobalDescriptor = GlobalDescriptor Or ShiftLeft(1, 7)
GlobalDescriptor = GlobalDescriptor Or ShiftLeft(ColorResolution, 7)
If SortFlag Then GlobalDescriptor = GlobalDescriptor Or ShiftLeft(1, 3)
GlobalDescriptor = GlobalDescriptor Or GlobalColorTableSize
End Function

Private Function LocalDescriptor()
LocalDescriptor = 0

If LocalColorTableFlag Then LocalDescriptor = LocalDescriptor Or ShiftLeft(1, 7)
If InterlaceFlag Then LocalDescriptor = LocalDescriptor Or ShiftLeft(1, 6)
If SortFlag Then LocalDescriptor = LocallDescriptor Or ShiftLeft(1, 5)
LocalDescriptor = LocalDescriptor Or ShiftLeft(Reserved, 3)
LocalDescriptor = LocalDescriptor Or LocalColorTableSize
End Function

Private Property Get ImageData()
Dim Text, I

ImageData = GIFHeader
ImageData = ImageData & MakeWord(Width_)
ImageData = ImageData & MakeWord(Height_)
ImageData = ImageData & MakeByte(GlobalDescriptor)
ImageData = ImageData & MakeByte(BGroundColorIndex)
ImageData = ImageData & MakeByte(PixelAspectRatio)
ImageData = ImageData & GetGColorTable

If GIF89a Then
If UseTransparency Then
ImageData = ImageData & MakeByte(GraphicControl)
ImageData = ImageData & MakeByte(&HF9)
ImageData = ImageData & MakeByte(&H04)
ImageData = ImageData & MakeByte(&H01)
ImageData = ImageData & MakeByte(&H00)
ImageData = ImageData & MakeByte(TransparentColorIndex)
ImageData = ImageData & MakeByte(&H00)
End If

If Comment <> "" Then
ImageData = ImageData & MakeByte(GraphicControl)
ImageData = ImageData & MakeByte(&HFE)
Text = Left(Comment, &HFF)
ImageData = ImageData & MakeByte(Len(Text))
For I = 1 To Len(Text)
ImageData = ImageData & MakeByte(Asc(Mid(Text, I, 1)))
Next
ImageData = ImageData & MakeByte(&H00)
End If
End If

ImageData = ImageData & MakeByte(Seperator)
ImageData = ImageData & MakeWord(LeftPosition)
ImageData = ImageData & MakeWord(TopPosition)
ImageData = ImageData & MakeWord(Width_)
ImageData = ImageData & MakeWord(Height_)
ImageData = ImageData & MakeByte(LocalDescriptor)
ImageData = ImageData & MakeByte(CodeSize)
ImageData = ImageData & UncompressedData
ImageData = ImageData & MakeByte(&H00)
ImageData = ImageData & MakeByte(EndOfImage)
End Property

Public Sub ImgWrite()
Response.ContentType = "image/gif"
Response.BinaryWrite ImageData
End Sub

Private Function GIFHeader()
GIFHeader = ""
GIFHeader = GIFHeader & ChrB(Asc("G"))
GIFHeader = GIFHeader & ChrB(Asc("I"))
GIFHeader = GIFHeader & ChrB(Asc("F"))
GIFHeader = GIFHeader & ChrB(Asc("8"))
If GIF89a Then
GIFHeader = GIFHeader & ChrB(Asc("9"))
Else
GIFHeader = GIFHeader & ChrB(Asc("7"))
End If
GIFHeader = GIFHeader & ChrB(Asc("a"))
End Function

Public Sub VerifyCode(Text, VCColor)
Dim I1, I2, I3
Dim VCX, VCY, VCIndex

Resize 14 * Len(Text) + 10, UBound(Letter) + 10, False

Randomize
VCX = Int(Rnd * 10)
VCY = Int(Rnd * (Height_ - UBound(Letter)))

For I1 = 0 To UBound(Letter) - 1
For I2 = 1 To Len(Text)
For I3 = 1 To Len(Font(Mid(Text, I2, 1))(I1))
VCIndex = CLng(Mid(Font(Mid(Text, I2, 1))(I1), I3, 1))

If VCIndex <> 0 Then
If VCColor Then
Randomize
VCIndex = Int(Rnd * 7)
End If

Pixel(VCX + ((I2 - 1) * Len(Letter(0))) + I3, VCY + I1) = VCIndex
End If
Next
Next
Next
End Sub

Public Sub Noises(Amount, NColor)
Dim NI, NIndex

For NI = 1 To Amount
NIndex = 1

If NColor Then
Randomize
NIndex = Int(Rnd * 7)
End If

Pixel(Int(Rnd * Width_), Int(Rnd * Height_)) = NIndex
Next
End Sub

End Class
%>
用法

<%
Dim GBL_CookieName
GBL_CookieName = "gbl_codename" '指定一个想对本站的cookie


Call ShowCode(GBL_CookieName & Request("CodeName")) 'request("CodeName")指定一个相对验证码的cookie
'验证码
Sub ShowCode(ShowCodeName)
Set img = New fly38_VerifyCode
Randomize
Dim code
code = Int(Rnd * 9000 + 1000)
Session(ShowCodeName) = code
img.BGroundColor = "#FFFFFF" ' 图片背景颜色
img.FGroundColor = "#FF0000" ' 前景(文本)颜色
Call img.VerifyCode(code, False) ' 处理验证码,第二个参数为是否显示彩色文本
Call img.Noises(100, True) ' 添加杂点,第一个参数为杂点数量,第二个参数为是否显示彩色杂点
img.ImgWrite ' 输出图片
End Sub
%>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js 图形 GIF 验证码通常是指在 Node.js 环境下生成并用于验证用户身份的动态图片验证码,它包含一组随机图像、字母、数字组合,有时还会包括动画效果。在 Node.js 中,可以借助一些库如 `sharp` (处理图片) 和 `验证码生成器库` (如 `speakeasy`, `qrcode-generator`) 来实现这个功能: 1. **安装依赖**:首先需要安装必要的模块,例如 `sharp` 用于处理图像,`speakeasy` 或类似的库用于生成验证码文本。 ```bash npm install sharp speakeasy ``` 2. **生成验证码**:创建一个函数,通过指定长度生成随机字符,并将其转换为 GIF 图片。例如,`speakeasy` 库允许你生成 QR 码样式验证码。 ```javascript const speakeasy = require('speakeasy'); const sharp = require('sharp'); function generateGifCode(length) { const chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; let code = ''; for (let i = 0; i < length; i++) { code += chars[Math.floor(Math.random() * chars.length)]; } return code; } function createGif验证码(width, height, code) { // 使用sharp库生成二维码或自定义图案,将验证码作为内容 return sharp({ create: { width, height, channels: 1 }, }) .resize(width, height) .toBuffer() .then((buffer) => { const qr = speakeasy.generateBarcode({ type: 'gif', text: code }); return qr.replace(/data:image\/png/, `data:image/gif`); }); } ``` 3. **渲染验证码到文件**:将生成的 Base64 编码的 GIF 内容保存到磁盘上供前端显示。 ```javascript createGif验证码(100, 50, generateGifCode(6)) .then((base64Image) => { fs.writeFileSync('captcha.gif', Buffer.from(base64Image, 'base64')); }) .catch(console.error); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值