生成随机验证码图片程序

时间:2023-02-04 23:24:11

 

生成随机验证码图片程序生成随机验证码图片程序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   String As  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 ),  0 0 , 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   Integer As   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   String ByVal  imgHeight  As   Integer ByVal  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   Integer ByVal  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, 
1 1 )
        
Next
    
End Sub
#End Region

#Region  "将绘制的图片输出到页面"
    
Public   Sub  CreateImageOnPage( ByVal  code  As   String ByVal  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