[转]验证码

验证码效果图:

[转自]http://www.cnblogs.com/moozi/archive/2008/04/09/1143911.html

源码:


using System;
using System.Drawing;
using System.IO;
using System.Text;
using System.Drawing.Imaging;
using System.Security.Cryptography;
using System.Drawing.Drawing2D;

public partial class ValidCode : System.Web.UI.Page
{
    
protected override void OnInit(EventArgs e)
    
{
        
base.OnInit(e);

        
string authStr = CreateAuthStr(4);

        VerifyImage verifyimg 
= new VerifyImage(authStr, 9050);

        System.Drawing.Bitmap image 
= verifyimg.Image;

        System.Web.HttpContext.Current.Response.ContentType 
= "image/pjpeg";

        
//Session["AuthStr"] = authStr.ToLower();

        image.Save(
this.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
    }


    
/// <summary>
    
/// 产生验证码
    
/// </summary>
    
/// <returns>验证码</returns>

    public static string CreateAuthStr(int len)
    
{
        
int number;
        StringBuilder checkCode 
= new StringBuilder();

        Random random 
= new Random();

        
for (int i = 0; i < len; i++)
        
{
            number 
= random.Next();

            
if (number % 2 == 0)
            
{
                checkCode.Append((
char)('0' + (char)(number % 10)));
            }

            
else
            
{
                checkCode.Append((
char)('A' + (char)(number % 26)));
            }


        }


        
return checkCode.ToString();
    }

}


/// <summary>
/// 验证码图片类
/// </summary>

public class VerifyImage
{
    
/// <summary>
    
/// 要显示的文字
    
/// </summary>

    public string Text
    
{
        
get return this.text; }
    }

    
/// <summary>
    
/// 图片
    
/// </summary>

    public Bitmap Image
    
{
        
get return this.image; }
    }

    
/// <summary>
    
/// 宽度
    
/// </summary>

    public int Width
    
{
        
get return this.width; }
    }

    
/// <summary>
    
/// 高度
    
/// </summary>

    public int Height
    
{
        
get return this.height; }
    }


    
private string text;
    
private int width;
    
private int height;
    
private Bitmap image;

    
private static byte[] randb = new byte[4];
    
private static RNGCryptoServiceProvider rand = new RNGCryptoServiceProvider();

    
/// <summary>
    
/// 构造函数
    
/// </summary>
    
/// <param name="code">要显示的验证码</param>
    
/// <param name="width">宽度</param>
    
/// <param name="height">高度</param>

    public VerifyImage(string code, int width, int height)
    
{
        
this.text = code;
        
this.width = width;
        
this.height = height;
        
this.GenerateImage();

    }


    
~VerifyImage()
    
{
        Dispose(
false);
    }


    
public void Dispose()
    
{
        GC.SuppressFinalize(
this);
        
this.Dispose(true);
    }


    
protected virtual void Dispose(bool disposing)
    
{
        
if (disposing)
            
this.image.Dispose();
    }

    
private FontFamily[] fonts = {
                                         
new FontFamily("Times New Roman"),
                                         
new FontFamily("Georgia"),
                                         
new FontFamily("Arial"),
                                         
new FontFamily("Comic Sans MS")
                                     }
;


    
public static int Next()
    
{
        rand.GetBytes(randb);
        
int value = BitConverter.ToInt32(randb, 0);
        
if (value < 0) value = -value;
        
return value;
    }


    
public static int Next(int max)
    
{
        rand.GetBytes(randb);
        
int value = BitConverter.ToInt32(randb, 0);
        value 
= value % (max + 1);
        
if (value < 0) value = -value;
        
return value;
    }


    
public static int Next(int min, int max)
    
{
        
int value = Next(max - min) + min;
        
return value;
    }



    
/// <summary>
    
/// 生成验证码图片
    
/// </summary>

    private void GenerateImage()
    
{
        Bitmap bitmap 
= new Bitmap(this.width, this.height, PixelFormat.Format32bppArgb);

        Graphics g 
= Graphics.FromImage(bitmap);
        Rectangle rect 
= new Rectangle(00this.width, this.height);
        g.SmoothingMode 
= SmoothingMode.AntiAlias;

        g.Clear(Color.White);

        
int emSize = Next(3+ 18;//(int)((this.width - 20) * 2 / text.Length);
        FontFamily family = fonts[Next(fonts.Length - 1)];
        Font font 
= new Font(family, emSize, FontStyle.Bold);

        SizeF measured 
= new SizeF(00);
        SizeF workingSize 
= new SizeF(this.width, this.height);
        
while (emSize > 2 && (measured = g.MeasureString(text, font)).Width > workingSize.Width || measured.Height > workingSize.Height)
        
{
            font.Dispose();
            font 
= new Font(family, emSize -= 2);
        }


        SolidBrush drawBrush 
= new SolidBrush(Color.FromArgb(Next(100), Next(100), Next(100)));
        
for (int x = 0; x < 3; x++)
        
{
            Pen linePen 
= new Pen(Color.FromArgb(Next(150), Next(150), Next(150)), 1);
            g.DrawLine(linePen, 
new PointF(0.0F + Next(20), 0.0F + Next(this.height)), new PointF(0.0F + Next(this.width), 0.0F + Next(this.height)));
        }


        
for (int x = 0; x < this.text.Length; x++)
        
{
            drawBrush.Color 
= Color.FromArgb(Next(150+ 20, Next(150+ 20, Next(150+ 20);
            PointF drawPoint 
= new PointF(0.0F + Next(4+ x * 158.0F + Next(4));
            g.DrawString(
this.text[x].ToString(), font, drawBrush, drawPoint);
        }


        
double distort = Next(510* (Next(10== 1 ? 1 : -1);

        
using (Bitmap copy = (Bitmap)bitmap.Clone())
        
{
            
for (int y = 0; y < height; y++)
            
{
                
for (int x = 0; x < width; x++)
                
{
                    
int newX = (int)(x + (distort * Math.Sin(Math.PI * y / 84.0)));
                    
int newY = (int)(y + (distort * Math.Cos(Math.PI * x / 54.0)));
                    
if (newX < 0 || newX >= width) newX = 0;
                    
if (newY < 0 || newY >= height) newY = 0;
                    bitmap.SetPixel(x, y, copy.GetPixel(newX, newY));
                }

            }

        }



        
//g.DrawRectangle(new Pen(Color.Silver), 0, 0, bitmap.Width - 1, bitmap.Height - 1);

        font.Dispose();
        drawBrush.Dispose();
        g.Dispose();

        
this.image = bitmap;
    }


}
posted @ 2008-04-14 22:43  赖文华.NET  阅读(211)  评论(0编辑  收藏  举报