随笔- 49  评论- 51  文章- 3 

生成随机验证码图片程序

 

ashx代码
Imports System
Imports System.Web
Imports System.Drawing
Imports System.IO
Imports System.Web.UI

Public Class login_validatecode : Implements IHttpHandler
    
#Region "验证码的长度(默认6个)"
    
Private m_codeLenght As Integer = 6

    
Public Property CodeLenght() As Integer
        
Get
            
Return m_codeLenght
        
End Get
        
Set(ByVal value As Integer)
            m_codeLenght 
= value
        
End Set
    
End Property
#End Region
#Region "验证码的字体大小(默认13相素)"
    
Private m_fontSize As Integer = 13
    
Public Property FontSize() As Integer
        
Get
            
Return m_fontSize
        
End Get
        
Set(ByVal value As Integer)
            m_fontSize 
= value
        
End Set
    
End Property
#End Region
#Region "验证码的字体样式(默认Roman)"
    
Private m_fontFamily As String = "Roman"
    
Public Property FontFamily() As String
        
Get
            
Return m_fontFamily
        
End Get
        
Set(ByVal value As String)
            m_fontFamily 
= value
        
End Set
    
End Property
#End Region
#Region "是否输出燥点"
    
Private m_point As Boolean = True
    
Public Property Point() As Boolean
        
Get
            
Return m_point
        
End Get
        
Set(ByVal value As Boolean)
            m_point 
= value
        
End Set
    
End Property
#End Region
#Region "输出燥点的颜色(默认海洋蓝)"
    
Private m_pointColor As Color = Color.LightSeaGreen
    
Public Property PointColor() As Color
        
Get
            
Return m_pointColor
        
End Get
        
Set(ByVal value As Color)
            m_pointColor 
= value
        
End Set
    
End Property
#End Region
    
#Region "图片背景噪音线数量(默认5条)"
    
Private m_lineNumber As Integer = 5
    
Public Property LineNumber() As Integer
        
Get
            
Return m_lineNumber
        
End Get
        
Set(ByVal value As Integer)
            m_lineNumber 
= value
        
End Set
    
End Property
#End Region
#Region "图片背景噪音线颜色(默认灰色)"
    
Private m_lineColor As Color = Color.LightGray
    
Public Property LineColor() As Color
        
Get
            
Return m_lineColor
        
End Get
        
Set(ByVal value As Color)
            m_lineColor 
= value
        
End Set
    
End Property
#End Region
#Region "图片的背景颜色(默认白色)"
    
Private m_backgroundColor As Color = Color.White
    
Public Property BackgroundColor() As Color
        
Get
            
Return m_backgroundColor
        
End Get
        
Set(ByVal value As Color)
            m_backgroundColor 
= value
        
End Set
    
End Property
#End Region
    
#Region "图片边框颜色(默认灰色)"
    
Private m_rectangleColor As Color = Color.LightGray
    
Public Property RectangleColor() As Color
        
Get
            
Return m_rectangleColor
        
End Get
        
Set(ByVal value As Color)
            m_rectangleColor 
= value
        
End Set
    
End Property
#End Region
    
#Region "随即颜色数组"
    
Private m_colors As Color() = {Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, _
    Color.DarkCyan, Color.Purple}
    
Public Property Colors() As Color()
        
Get
            
Return m_colors
        
End Get
        
Set(ByVal value As Color())
            m_colors 
= value
        
End Set
    
End Property
#End Region
#Region "随即字符串"
    
Private m_randomCode As String = "2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z"
    
Public Property RandomCode() As String
        
Get
            
Return m_randomCode
        
End Get
        
Set(ByVal value As String)
            m_randomCode 
= value
        
End Set
    
End Property
#End Region
#Region "生成验证码图片"
    
Public Function CreateImage(ByVal code As StringAs Bitmap
        
'设置字体大小 
        Dim FSize As Integer = Me.FontSize
        
Dim FWidth As Integer = FSize  ' FSize + 2
        '设置图片大小 
        Dim ImgWidth As Integer = CInt((code.Length * FWidth)) + code.Length * 2 ' CInt((code.Length * FWidth)) + 4
        Dim ImaHeight As Integer = FSize +6 ‘ FSize * 2
        
'创建图片和画笔 
        Dim iamge As New Bitmap(ImgWidth, ImaHeight)
        
Dim gh As Graphics = Graphics.FromImage(iamge)
        gh.Clear(m_backgroundColor)
        
        
'绘制图片的背景噪音线
        Dim rand As New Random()
        
For i As Integer = 1 To m_lineNumber
            
Dim x1 As Integer = rand.Next(ImgWidth)
            
Dim x2 As Integer = rand.Next(ImgWidth)
            
Dim y1 As Integer = rand.Next(ImaHeight)
            
Dim y2 As Integer = rand.Next(ImaHeight)
            gh.DrawLine(
New Pen(m_lineColor), x1, y1, x2, y2)
        
Next
        
        
'绘制图片边框线
        gh.DrawRectangle(New Pen(m_rectangleColor, 1), 00, ImgWidth - 1, (ImaHeight - 1))
        
'绘制图片的前景噪音点
        If m_point Then
            
For i As Integer = 0 To m_codeLenght * 2 - 1
                
Dim x As Integer = rand.Next(ImgWidth)
                
Dim y As Integer = rand.Next(ImaHeight)
                iamge.SetPixel(x, y, Color.FromArgb(rand.Next()))
            
Next
            
'Me.MakePoint(gh, ImgWidth, ImaHeight)
        End If
        
'绘制字符串随即颜色 
        MakeFontColor(gh, code, ImaHeight, FSize)

        
Return iamge
    
End Function
#End Region
#Region "产生随即字符串"
    
''' <summary> 
    
''' 返回产成的随即字符串 
    
''' </summary> 
    
''' <param name="codeLenght">字符串的长度</param> 
    
''' <returns>返回产成的随即字符串</returns> 
    Public Function MakeCode(ByVal codeLenght As IntegerAs String
        
Dim splitStr As String() = m_randomCode.Split(",")
        
Dim newCode As String = Nothing
        
Dim rand As New Random(CType(DateTime.Now.Ticks Mod System.Int32.MaxValue, Integer))
        
For i As Integer = 0 To codeLenght - 1
            newCode 
&= splitStr(rand.Next(0, splitStr.Length - 1))
        
Next
        
Return newCode
    
End Function
#End Region
#Region "产成字符串的随即颜色"
    
Public Sub MakeFontColor(ByVal g As Graphics, ByVal str As StringByVal imgHeight As IntegerByVal fontSize As Integer)
        
Dim b As Brush
        
Dim colorIndex As Integer
        
Dim rand As New Random()
        
Dim left As Integer = 0, top As Integer = 0, top1 As Integer = 1, top2 As Integer = 1
        
Dim n1 As Integer = imgHeight - fontSize - 4
        
Dim n2 As Integer = n1 / 4
        top1 
= n2
        top2 
= n2 * 2
        
For i As Integer = 0 To m_codeLenght - 1
            colorIndex 
= rand.[Next](m_colors.Length - 1)
            b 
= New System.Drawing.SolidBrush(m_colors(colorIndex))
            
If i Mod 2 = 1 Then
                top 
= top2
            
Else
                top 
= top1
            
End If
            
left = i * (fontSize)
            
Dim f As New Font(Me.FontFamily, Me.FontSize)
            g.DrawString(
str.Substring(i, 1), f, b, left, top)
        
Next
    
End Sub
#End Region
#Region "随即产生燥点"
    
''' <summary> 
    
''' 随即产生燥点 
    
''' </summary> 
    
''' <param name="g">画笔</param> 
    
''' <param name="imgWidth">绘制的宽度</param> 
    
''' <param name="imgHeight">绘制的高度</param> 
    Public Sub MakePoint(ByVal g As Graphics, ByVal imgWidth As IntegerByVal imgHeight As Integer)
        
Dim rand As New Random()
        
Dim p As New Pen(m_pointColor, 0)
        
For i As Integer = 0 To m_codeLenght * 2 - 1
            
Dim x As Integer = rand.Next(imgWidth)
            
Dim y As Integer = rand.Next(imgHeight)
            g.DrawRectangle(p, x, y, 
11)
        
Next
    
End Sub
#End Region

#Region "将绘制的图片输出到页面"
    
Public Sub CreateImageOnPage(ByVal code As StringByVal text As HttpContext)

        
Dim ms As New MemoryStream()
        
Dim img As Bitmap = CreateImage(code)
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
        text.Response.ClearContent()
        text.Response.ContentType 
= "image/Jpeg"
        text.Response.BinaryWrite(ms.GetBuffer())
        ms.Close()
        ms 
= Nothing
        img.Dispose()
        img 
= Nothing
    
End Sub
#End Region
    
    
    
    
Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        
Dim gvc As New login_validatecode()
        gvc.CodeLenght 
= 4
        gvc.FontSize 
= 13
        gvc.Point 
= False
        
Dim code As String = gvc.MakeCode(gvc.CodeLenght) '获取随即字符串
        HttpContext.Current.Response.Cookies.Add(New HttpCookie("BBS_LOGIN_VALIDATECODE", code))
        gvc.CreateImageOnPage(code, context)
        context.Response.End()
    
End Sub
 
    
Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
        
Get
            
Return False
        
End Get
    
End Property
End Class

 

 

posted on 2009-04-17 15:02 Theo 阅读(...) 评论(...) 编辑 收藏