C# 生成验证码 详解

using System;  
using System.Data;  
using System.Configuration;  
using System.Collections;  
using System.ComponentModel;  
using System.Web;  
using System.Web.Security;  
using System.Web.UI;  
using System.Web.UI.WebControls;  
using System.Web.UI.WebControls.WebParts;  
using System.Web.UI.HtmlControls;  
using System.Web.SessionState;  
using System.Drawing;  
using System.Drawing.Imaging;  
  
namespace ShvnetAdmin  
{  
    public partial class CheckCode : System.Web.UI.Page  
    {  
            /** <summary>  
            /// 验证码长度   
            /// </summary>   
            private int codeLen = 4;  
            /** <summary>  
            /// 图片宽度   
            /// </summary>   
            private int imgWidth = 100;  
            /** <summary>  
            /// 图片高度   
            /// </summary>   
            private int imgHeight = 35;  
            /** <summary>  
            /// 字体大小   
            /// </summary>   
            private int fontSize = 18;  
            /** <summary>  
            /// 干扰度(百分之几)   
            /// </summary>   
            private int fineness = 1;  
  
            protected void Page_Load(object sender, EventArgs e)  
            {  
                Response.Expires = 0;  
                string validateCode = CreateValidateCode();  
                Bitmap bitmap = new Bitmap(imgWidth, imgHeight);  
  
                //给图像设置干扰   
                DisturbBitmap(bitmap);  
  
                //绘制验证码图像   
                DrawValidateCode(bitmap, validateCode);  
  
                //保存验证码图像,等待输出   
                bitmap.Save(Response.OutputStream, ImageFormat.Jpeg);  
            }  
  
            /** <summary>  
            /// 随机生成验证码,并保存到SESSION中   
            /// </summary>   
            /// <returns></returns>   
            private string CreateValidateCode()  
            {  
                string validateCode = "";  
                Random random = new Random();  
                string tmp = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";  
                for (int i = 0; i < codeLen; i++)  
                {  
                    int n = random.Next(tmp.Length);  
                    validateCode += tmp[n];  
                }  
                Session["ValidateCode"] = validateCode;  
                return validateCode;  
            }  
  
            /** <summary>  
            /// 为图片设置干扰点   
            /// </summary>   
            /// <param name="bitmap"></param>   
            private void DisturbBitmap(Bitmap bitmap)  
            {  
                Random rand = new Random();  
                int iRed = rand.Next(200, 255);  
                int iGreen = rand.Next(200, 255);  
                int iBlue = rand.Next(200, 255);  
                int iAlpha = rand.Next(0, 100);  
                // 通过随机数生成   
                Random random = new Random();  
                for (int i = 0; i < bitmap.Width; i++)  
                {  
                    for (int j = 0; j < bitmap.Height; j++)  
                    {  
                        if (random.Next(100) <= this.fineness)  
                        {  
                            //设置干扰点   
                            iAlpha = rand.Next(0, 100);  
                            iRed = rand.Next(50, 150);  
                            iGreen = rand.Next(50, 150);  
                            iBlue = rand.Next(50, 150);  
                            bitmap.SetPixel(i, j, Color.FromArgb(iAlpha, iRed, iGreen, iBlue));  
                        }  
                        else  
                        {  
                            //绘制背景色   
                            iAlpha = rand.Next(0, 100);  
                            iRed = rand.Next(240, 255);  
                            iGreen = rand.Next(200, 255);  
                            iBlue = rand.Next(200, 255);  
                            bitmap.SetPixel(i, j, Color.FromArgb(iAlpha, iRed, iGreen, iBlue));  
                        }  
                    }  
                }  
                //画边框   
                iAlpha = rand.Next(0, 100);  
                iRed = rand.Next(0, 0);  
                iGreen = rand.Next(0, 255);  
                iBlue = rand.Next(0, 255);  
                for (int i = 0; i < bitmap.Width; i++)  
                {  
                    bitmap.SetPixel(i, 0, Color.FromArgb(iAlpha, iRed, iGreen, iBlue));  
                    bitmap.SetPixel(i, 1, Color.FromArgb(iAlpha, iRed, iGreen, iBlue));  
                    bitmap.SetPixel(i, bitmap.Height - 1, Color.FromArgb(iAlpha, iRed, iGreen, iBlue));  
                    bitmap.SetPixel(i, bitmap.Height - 2, Color.FromArgb(iAlpha, iRed, iGreen, iBlue));  
                }  
                for (int i = 0; i < bitmap.Height; i++)  
                {  
                    bitmap.SetPixel(0, i, Color.FromArgb(iAlpha, iRed, iGreen, iBlue));  
                    bitmap.SetPixel(1, i, Color.FromArgb(iAlpha, iRed, iGreen, iBlue));  
                    bitmap.SetPixel(bitmap.Width - 1, i, Color.FromArgb(iAlpha, iRed, iGreen, iBlue));  
                    bitmap.SetPixel(bitmap.Width - 2, i, Color.FromArgb(iAlpha, iRed, iGreen, iBlue));  
                }  
            }  
  
            /** <summary>  
            /// 绘制验证码图片   
            /// </summary>   
            /// <param name="bitmap"></param>   
            /// <param name="validateCode"></param>   
            private void DrawValidateCode(Bitmap bitmap, string validateCode)  
            {  
                //随机获取颜色   
                Random rand = new Random();  
                int iRed = rand.Next(0, 50);  
                int iGreen = rand.Next(0, 50);  
                int iBlue = rand.Next(0, 50);  
                int iAlpha = rand.Next(50, 100);  
                char[] chr = validateCode.ToCharArray();  
                for (int i = 0; i < codeLen; i++)  
                {  
                    Font f = new Font(new FontFamily("Microsoft Sans Serif"), fontSize, FontStyle.Bold | FontStyle.Italic);  
                    Brush b = new SolidBrush(Color.FromArgb(iAlpha, iRed, iGreen, iBlue));  
                    Graphics g = Graphics.FromImage(bitmap);  
                    //设置各字符的漂浮范围   
                    int iX, iY;  
                    iX = rand.Next(-5, 5);  
                    iY = rand.Next(-5, 5);  
                    //绘制验证码图像   
                    g.DrawString(chr[i].ToString(), f, b,  
                        (float)((bitmap.Width / codeLen) * (i) + iX),  
                        (float)(bitmap.Height / 2 - g.MeasureString(chr[i].ToString(), f).Height / 2 + iY));  
                }  
            }  
  
    }  
 }  

调用页面放个图片,Src 指向这个验证码生成的页面,Cs 代码 判断是否相同

String.Compare(Session["ValidateCode"].ToString(), this.txtcode.Text.Trim(), true) != 0

即可

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值