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
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
相关文章推荐
- EXCEL VBA代码,实现点击Sheet1按钮控件保存不连续单元格的数据到Sheet2中,然后清空输入内容
- VBS脚本运行库 ——文本文件的建立、追加、删除等
- vb调用Excel时指定打印机
- VB作业
- Vbs备份数据脚本集合
- 怎样计算两位数与一位数相乘
- 怎样计算一位数与一位数相乘
- VB中输入函数InputBox的用法
- 网页上下载文件提示框(vb.net)
- 怎样计算阶乘
- vb作业
- vb作业
- VB 监听U盘插入并拷贝U盘内容
- 迟到的vb作业
- 去掉navbar或者tabbar的预留间距
- vboxmanage查询正在运行的vbox虚拟机
- VB 定时终止进程
- VB6 Access 事务(Transaction)
- VBA删除表格最后一行
- VBA表格单元格替换文字