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

调用

    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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值