您的位置:首页 > 编程语言 > VB

vb.net 生成验证码图片-转载

2016-04-20 14:51 489 查看
调用

Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click

randCode = CreatCode(4).ToUpper

End Sub

Private Sub frm1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

randCode = CreatCode(4).ToUpper

End Sub

''' <summary>
''' 生成图片验证码
''' </summary>
''' <param name="intNum">验证码显示的字符个数</param>
''' <returns>验证码字符串</returns>
''' <remarks></remarks>
Private Function CreatCode(ByVal intNum As Integer) As String

Dim x, y, x1, y1 As Single
Dim PenWidth1, PenWidth2 As Integer
Dim VerifyChar As String = RndChar(intNum) '产生随机字符串
Dim backBrush As Brush = Brushes.DimGray '背景颜色
Dim textBrush As Brush = Brushes.Black '验证码颜色
Dim VerifyVharFont As Integer = Int(7 * Rnd()) + 14  '验证码字符字体大小随机生成
Dim gWidth As Integer = Int(Len(VerifyChar)) * VerifyVharFont + VerifyVharFont
If gWidth > 100 Then '避免字体超过画布宽度
VerifyVharFont = 15
End If
Dim textFont As New Font("Arial", VerifyVharFont, FontStyle.Strikeout)  '验证码字体
Dim ms As MemoryStream
Dim Img As System.Drawing.Bitmap
Dim g As Graphics
Img = New Bitmap(88, 30)  '图片的长宽固定为88*30可改
g = Graphics.FromImage(Img)
'生成随机背景颜色
Dim nRed, nGreen, nBlue As Integer
Dim rd = New Random
nRed = rd.Next(255) Mod 128 + 128
nGreen = rd.Next(255) Mod 128 + 128
nBlue = rd.Next(255) Mod 128 + 128
'填充位图背景
g.FillRectangle(New SolidBrush(System.Drawing.Color.FromArgb(nRed, nGreen, nBlue)), 0, 0, Img.Width, Img.Height)
'随机输出噪音线,随机数可修改
Dim i As Int32
For i = 0 To 2
Randomize()
x = Img.Width * Rnd()
y = Img.Height * Rnd()
x1 = Img.Width * Rnd()
y1 = Img.Height * Rnd()
PenWidth1 = 3 * Rnd()
g.DrawLine(New Pen(backBrush, PenWidth1), x, y, x1, y1)
Next
'随机输出噪点,随机数可修改
PenWidth2 = 3
For i = 0 To 10
Randomize()
x = Img.Width * Rnd()
y = Img.Height * Rnd()
nRed = rd.Next(255) Mod 128 + 128
nGreen = rd.Next(255) Mod 128 + 128
nBlue = rd.Next(255) Mod 128 + 128
g.DrawRectangle(New Pen(Color.FromArgb(nRed, nGreen, nBlue), PenWidth2), x, y, 1, 1)
Next
'随机产生X轴位置,增加程序识别难度
x = 16 * Rnd() - 6
y = 0
'随机画3D背景
Dim S3d As Single = Rnd()
If S3d > 0.9 Then
For i = 1 To 0 Step -1
g.DrawString(VerifyChar, textFont, backBrush, x - i, y + i)
Next
End If
'将全局变换平移(x, y),也就是使画布上将要画的所有内容向左边移动x,向下移动y
g.TranslateTransform(1.5, 1)
'做切变,将原始矩形的下边缘水平移动矩形高度的0.2倍
Dim textTransform As Matrix = g.Transform
textTransform.Shear(0.2, 0)
g.Transform = textTransform
g.DrawString(VerifyChar, textFont, textBrush, x, y)

'扭曲验证字符。TwistImage参数可自行修改
Dim Twist1, Twist2 As Single
If S3d > 0.9 Then  '3D背景减少扭曲
Twist1 = 0
Twist2 = 0
Else
Twist1 = Rnd() * 3  '扭曲参数随机生成
Twist2 = Rnd() * 2  '扭曲参数随机生成
End If
Img = TwistImage(Img, True, -Twist1, -Twist2)
Img = TwistImage(Img, False, Twist1, Twist2)
ms = New MemoryStream
Img.Save(ms, ImageFormat.Png)
g.DrawImage(Img, 0, 0)
Me.PictureBox1.Image = Img
Return VerifyChar
End Function

''' <summary>
''' 产生随机字符与数字组合
''' </summary>
''' <param name="VcodeNum">字符串的长度</param>
''' <returns>随机数</returns>
''' <remarks></remarks>
Private Function RndChar(ByVal VcodeNum As Integer) As String
Dim Vchar As String = "1,2,3,4,5,6,7,8,7,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,j,k,m,n,p,q,r,s,t,u,v,w,x,y,z"
Dim VcArray() As String = Split(Vchar, ",")
Vchar = ""
Dim i As Byte
'For i = 0 To Int(VcodeNum * Rnd())'小于vcodenum的随机数
For i = 0 To VcodeNum - 1
Randomize()
Vchar = Vchar & VcArray(Int(UBound(VcArray) * Rnd()))
Next
Return Vchar
End Function

''' <summary>
''' 正弦曲线Wave扭曲图片
''' </summary>
''' <param name="srcBmp">图片</param>
''' <param name="bXDir">正弦或者反弦</param>
''' <param name="dMultValue">波形的幅度倍数</param>
''' <param name="dPhase">波形的起始相位</param>
''' <returns>返回扭曲过的图片</returns>
''' <remarks></remarks>
Private Function TwistImage(ByVal srcBmp As Bitmap, ByVal bXDir As Boolean, ByVal dMultValue As Double, ByVal dPhase As Double) As Bitmap

Dim destBmp = New Bitmap(srcBmp.Width, srcBmp.Height)
Dim dBaseAxisLen As Double = IIf(bXDir, CDbl(destBmp.Height), CDbl(destBmp.Width)) 'ToDo: Unsupported feature: conditional (?) operator.
Dim i As Integer
For i = 0 To destBmp.Width - 1
Dim j As Integer
For j = 0 To destBmp.Height - 1
Dim dx As Double = 0
dx = IIf(bXDir, PI2 * CDbl(j) / dBaseAxisLen, PI2 * CDbl(i) / dBaseAxisLen) 'ToDo: Unsupported feature: conditional (?) operator.
dx += dPhase
Dim dy As Double = Math.Sin(dx)
' 取得当前点的颜色
Dim nOldX As Integer = 0
Dim nOldY As Integer = 0
nOldX = IIf(bXDir, i + CInt(dy * dMultValue), i) 'ToDo: Unsupported feature: conditional (?) operator.
nOldY = IIf(bXDir, j, j + CInt(dy * dMultValue)) 'ToDo: Unsupported feature: conditional (?) operator.
Dim color As System.Drawing.Color = srcBmp.GetPixel(i, j)
If nOldX >= 0 And nOldX < destBmp.Width And nOldY >= 0 And nOldY < destBmp.Height Then
destBmp.SetPixel(nOldX, nOldY, color)
End If
Next j
Next i
Return destBmp

End Function
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: