.NET学习,生成图片验证码(一)

最近,在做一个登录界面,界面上想有一个生成随机验证码的功能,就自己实现了一个,主要是使用了GDI+。思路如下:
1、在内存中生成一张Bitmap图片;
2、生成随机数字;
3、Graphics.FromImage()方法获取DC(设备上下文);
4、Graphics.DrawString();
5、将图片写入内存流,将内存流通过http传输给网页;
 
代码如下:
一、生成图片的网页
    /// <summary>
    /// 生成随机字符串
    /// </summary>
    /// <param name="codeLength">需要生成随机字符串的长度</param>
    /// <returns>生成的字符串</returns>
    private string GenerateCode(int codeLength)
    {
        //存放生成随机数据的字符数组共62个
        char[] charArray = {
                                '0','1','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','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
                               };
        int arrayLength = charArray.Length;
        string returnValue = "";
        int flag = 0;
        Random rand = new Random();
        //生成制定数字的字符串
        for (int i = 0; i < codeLength; i++)
        {
            while (flag != -1)
            {
                int pos = rand.Next(0, arrayLength);
                flag = returnValue.IndexOf(charArray[pos]);
                if (flag == -1)
                {
                    returnValue += charArray[pos];
                    flag = 0;
                    break;
                }
            }
        }
        return returnValue;
    }
 
 
    /// <summary>
    /// 生成验证码图片
    /// </summary>
    /// <param name="ImageWidth">图片宽度</param>
    /// <param name="ImageHeight">图片高度</param>
    /// <param name="font">内容字体</param>
    /// <param name="brush">画刷</param>
    /// <param name="backgroundColor">图片背景色</param>
    /// <param name="codeLength">生成验证码的长度</param>
    /// <returns></returns>
    private MemoryStream GenerateMemoryImage(int ImageWidth, int ImageHeight, Font font, Brush brush, Color backgroundColor, int codeLength)
    {
        MemoryStream ms = new MemoryStream();
        Bitmap image = new Bitmap(ImageWidth, ImageHeight);
        Graphics g = Graphics.FromImage(image);
        g.Clear(backgroundColor);
        string code = GenerateCode(codeLength);
        SizeF size = g.MeasureString(code, font);
        g.DrawString(code, font, brush, (ImageWidth - (int)size.Width) / 2, (ImageHeight - (int)size.Height) / 2);
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        return ms;
    }
 
    //网页调用生成图片方法,并将内存流转换为byte[]通过http传输
    protected void Page_Load(object sender, EventArgs e)
    {
        Font font = new Font("Arial", 20f);
        MemoryStream ms = GenerateMemoryImage(150, 30, font, new SolidBrush(Color.Black), Color.WhiteSmoke, 4);
        Response.ClearContent();
        Response.ContentType = "image/jpeg";
        Response.BinaryWrite(ms.ToArray());
        Response.End();
    }
 
二、调用图片的网页
<img id="code" alt="" οnclick="this.src='Default.aspx?'+Math.random();" src="Default.aspx" style="padding-left: 10px;
                                        vertical-align: middle; cursor: pointer" />
只要在需要使用图片的网页上调用该标记即可,之所以="this.src='Default.aspx?'+Math.random();" 要加上Math.random()是因为防止缓存。
 
生成图片时可以对图片写入的文字,对每个字符/汉字随机使用字体、字号、颜色等等。
 
下一讲,更深入说明如何对验证码进行图片的效果处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值