C#基础回顾:用GDI+绘制验证码

      验证码在很多需要用户登陆或发表言论的网页上都可以见到。传统的一般是用代表各种不同数字或字符的图片来进行组合,从而实现效果。但是,很明显这种方式的灵活性不高,而且需要准备大量的图片作素材。

      目前,一般就是采用全自动生成,整个验证码为一张图片,而不是多张图片的组合。在.Net中,可以通过GDI+来实现,可能你会觉得很麻烦,但只要跟着我操作一遍,你就会发现其实很简单。
      现在,就开始制作一个最简单的验证码。 (这里并不介绍如何使用GDI+技术,相关内容请大家查看这里)
      1.既然要产生验证码,那是关键的莫过于生成随机数(这里的随机数,指的是数字与字母的组合)。
      大家想一下数字和字符是不是都有是用ASCII码进行编码进行表示?因此,想要生成含字母和数字的随机数,不仅仅只有通过事先提供所有数字和字母这种方法,还可以有很多种办法。大家如果什么好的办法,希望不吝赐教。我今天要介绍的是一种很简单的办法。直接来看代码吧:

ContractedBlock.gif ExpandedBlockStart.gif 生成随机数
public static string Generate(RandomGeneratorStyle style, int length)
{
    
string strValidateString="";
    Random rnd 
= new Random();
    
string strValidateStringSource;
    
switch (style)
    {
        
case RandomGeneratorStyle.Number: 
            strValidateStringSource 
= "0123456789"
            
break;
        
case RandomGeneratorStyle.NumberAndChar: 
            strValidateStringSource 
= "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            
break;
        
case RandomGeneratorStyle.NumberAndCharIgnoreCase:
            strValidateStringSource 
= "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            
break;
        
default:
            strValidateStringSource 
= "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            
break;
    }
    
for (int i = 0; i < length; i++)
    {
        strValidateString 
+= strValidateStringSource[rnd.Next(strValidateStringSource.Length - 1)];
    }
    
return strValidateString;
}

      上面有一个RandomGeneratorStyle,这个是我自己写的一个枚举,用于表示需要生成哪种验证码。

ContractedBlock.gif ExpandedBlockStart.gif RandomGeneratorStyle
public enum RandomGeneratorStyle
{
    
/// <summary>
    
/// 只有数字
    
/// </summary>
    Number,
    
/// <summary>
    
/// 包含数字和大小写字符
    
/// </summary>
    NumberAndChar,
    
/// <summary>
    
/// 包含数字和大写字符
    
/// </summary>
    NumberAndCharIgnoreCase
}


      2.有了这些数,那下面就基本上考你是画画的功夫了。当然这里用到的不是颜料、水彩笔等,而是要用GDI+。
      平时,我们看见的验证码是什么样式子的?是不是一个矩形?矩形里面有一些随机数?那接下去要做的就是用GDI+技术把生成的随机数画到一个矩形中。
      这个要用到的主要的就只有一个方法:Graphics.DrawString();不了解的朋友可以先去网上查查关于这个方法的介绍。下面直接来看代码:

ContractedBlock.gif ExpandedBlockStart.gif 绘制验证码
public static void Generate(RandomGeneratorStyle style, int length,Page curPage)
{
    Bitmap bmp 
= new Bitmap((int)Math.Ceiling(length * 12.5), 20);//新建一个图片对象
    Graphics g = Graphics.FromImage(bmp);//利用该图片对象生成“画板”
    string strCode = RandomGenerator.Generate(style, length);//生成随机数
    curPage.Session["yzmCode"= strCode;//保存到Session中,为验证服务.你也可以存放在其它地方,只要在需要验证的时候你能取到
    Font font = new Font("Arial"12, FontStyle.Bold | FontStyle.Italic);//设置字体颜色
    SolidBrush brush = new SolidBrush(Color.White);//新建一个画刷,到这里为止,我们已经准备好了画板、画刷、和数据
    g.DrawString(strCode, font, brush, 00);//关键的一步,进行绘制。
    bmp.Save(curPage.Response.OutputStream, ImageFormat.Jpeg);//保存为输出流,否则页面上显示不出来
    g.Dispose();//释放掉该资源
}

      现在,就可以来测试下它的效果了。想要调用上面的方法,我们必须要传入一个当前的Page对象,为此我们可以新建一个页面命名为yzm.aspx。然后,在PageLoad中调用该方法。这样,我们便可以看到它了。如下图1所示:

     
图1 验证码

      如果,你需要在img元素中显示,那也很简单,只需要把src设置为yzm.aspx就可以了。<img src="yzm.aspx" alt="" />
      最后,再来介绍下如何进行验证。(如果只显示,不验证,那就不能管它叫验证码了。)
      细心的朋友应该已经发现,在绘制验证码的方法中,我设置了一个Session。那要进行验证的话,自然是通过与这个绘制时所设置的Session比较了。代码如下:

ContractedBlock.gif ExpandedBlockStart.gif 验证方法
public static bool Validate(string codeToBeValidate,Page curPage)
{
    
if (curPage.Session["yzmCode"!= null)
    {
        
return curPage.Session["yzmCode"].ToString() == codeToBeValidate;
    }
    
else
        
return false;
}


      通过上面的这种方式,就可以生成验证码了。如果你想要生成漂亮些的验证码,那就需要你自己在绘制过程中再动动脑筋了。

作者: stg609
出处: http://stg609.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值