zoukankan      html  css  js  c++  java
  • 生成中文验证码[源码]

    结合网上其他的一些资料,该cs页可以随机生成 任何位数的中文验证码,调用时只需要
    <img src="该页的地址"/> 即可。

      1using System;
      2using System.Data;
      3using System.Configuration;
      4using System.Collections;
      5using System.Web;
      6using System.Web.Security;
      7using System.Web.UI;
      8using System.Web.UI.WebControls;
      9using System.Web.UI.WebControls.WebParts;
     10using System.Web.UI.HtmlControls;
     11using System.Drawing;
     12using System.Text;
     13public partial class CheckCode : System.Web.UI.Page
     14{
     15    protected void Page_Load(object sender, EventArgs e)
     16    {
     17        Encoding gb = Encoding.GetEncoding("gb2312");
     18
     19        //调用函数产生4个随机中文汉字编码 
     20        object[] bytes = CreateRegionCode(4);
     21
     22        //根据汉字编码的字节数组解码出中文汉字 
     23        string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));
     24        string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));
     25        string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));
     26        // string str4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));
     27
     28        //输出的控制台 
     29        // Console.WriteLine(str1 + str2 + str3 + str4); 
     30        // Response.Write(str1 + str2 + str3 + str4);
     31        //  return;
     32
     33        string srs = str1 + str2 + str3;// +str4;
     34        Bitmap srBmp = srBitmap(srs);
     35        System.IO.MemoryStream srMS = new System.IO.MemoryStream();
     36        srBmp.Save(srMS, System.Drawing.Imaging.ImageFormat.Gif);
     37        Response.ClearContent();
     38        Response.ContentType = "image/gif";
     39        Response.BinaryWrite(srMS.ToArray());
     40        srBmp.Dispose();
     41    }

     42
     43    /// <summary>
     44    /// 根据指定参数返回BitMap对象
     45    /// 引用如下:
     46    /// using System.Drawing;
     47    /// 调用例子如下:
     48    ///     eg1、保存为图象文件为
     49    ///     Bitmap srBmp = srBitmap(srs);
     50    ///     srBmp.Save(Directory.GetCurrentDirectory() + "\\srs.gif", System.Drawing.Imaging.ImageFormat.Gif);
     51    ///     srBmp.Dispose();
     52    ///     eg2。网页中调用方式如下
     53    ///     Bitmap srBmp = srBitmap(srs);
     54    ///     System.IO.MemoryStream srMS = new System.IO.MemoryStream();
     55    ///     srBmp.Save(srMS,System.Drawing.Imaging.ImageFormat.Gif);
     56    ///     Response.ClearContent();
     57    ///     Response.ContentType = "image/gif";
     58    ///     Response.BinaryWrite(srMS.ToArray());
     59    ///     srBmp.Dispose();
     60    /// </summary>
     61    /// <param name="srs"></param>
     62    /// <returns></returns> 

     63    public static Bitmap srBitmap(string srs)
     64    {
     65        //定义图片弯曲的角度
     66        int srseedangle = 10;
     67        //定义图象 
     68        Bitmap srBmp = new Bitmap(srs.Length * 2530);
     69        //画图
     70        Graphics srGraph = Graphics.FromImage(srBmp);
     71        //清空图象
     72        srGraph.Clear(Color.AliceBlue);
     73        //给图象画边框
     74        srGraph.DrawRectangle(new Pen(Color.Black, 0), 00, srBmp.Width - 1, srBmp.Height - 1);
     75        //定义随即数
     76        Random srRandom = new Random();
     77        //定义画笔
     78        Pen srPen = new Pen(Color.LightGray, 0);
     79        //画噪点
     80        for (int i = 0; i < 100; i++)
     81        {
     82            srGraph.DrawRectangle(srPen, srRandom.Next(1, srBmp.Width - 2), srRandom.Next(1, srBmp.Height - 2), 11);
     83        }

     84        //将字符串转化为字符数组 
     85        char[] srchars = srs.ToCharArray();
     86        //封状文本
     87        StringFormat srFormat = new StringFormat(StringFormatFlags.NoClip);
     88        //设置文本垂直居中
     89        srFormat.Alignment = StringAlignment.Center;
     90        //设置文本水平居中
     91        srFormat.LineAlignment = StringAlignment.Center;
     92        //定义字体颜色
     93        Color[] srColors ={ Color.Black, Color.Red, Color.DarkBlue, Color.Blue, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
     94        //定义字体
     95        string[] srFonts ="Verdana""Microsoft Sans Serif""Comic Sans MS""Arial""宋体" };
     96        //循环画出每个字符
     97        for (int i = 0, j = srchars.Length; i < j; i++)
     98        {
     99            //定义字体 参数分别为字体样式 字体大小 字体字形
    100            Font srFont = new Font(srFonts[srRandom.Next(5)], srRandom.Next(1220), FontStyle.Regular);
    101            //填充图形
    102            Brush srBrush = new SolidBrush(srColors[srRandom.Next(7)]);
    103            //定义坐标
    104            Point srPoint = new Point(1616);
    105            //定义倾斜角度
    106            float srangle = srRandom.Next(-srseedangle, srseedangle);
    107            //倾斜
    108            srGraph.TranslateTransform(srPoint.X, srPoint.Y);
    109            srGraph.RotateTransform(srangle);
    110            //填充字符
    111            srGraph.DrawString(srchars[i].ToString(), srFont, srBrush, 11, srFormat);
    112            //回归正常
    113            srGraph.RotateTransform(-srangle);
    114            srGraph.TranslateTransform(2-srPoint.Y);
    115        }

    116        srGraph.Dispose();
    117        return srBmp;
    118    }

    119
    120    /**/
    121    /* 
    122    此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将 
    123    四个字节数组存储在object数组中。 
    124    参数:strlength,代表需要产生的汉字个数 
    125    */

    126    public static object[] CreateRegionCode(int strlength)
    127    {
    128        //定义一个字符串数组储存汉字编码的组成元素 
    129        string[] rBase = new String[16"0""1""2""3""4""5""6""7""8""9""a""b""c""d""e""f" };
    130
    131        Random rnd = new Random();
    132
    133        //定义一个object数组用来 
    134        object[] bytes = new object[strlength];
    135
    136        /**/
    137        /*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中 
    138         每个汉字有四个区位码组成 
    139         区位码第1位和区位码第2位作为字节数组第一个元素 
    140         区位码第3位和区位码第4位作为字节数组第二个元素 
    141        */

    142        for (int i = 0; i < strlength; i++)
    143        {
    144            //区位码第1位 
    145            int r1 = rnd.Next(1114);
    146            string str_r1 = rBase[r1].Trim();
    147
    148            //区位码第2位 
    149            rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i);//更换随机数发生器的种子避免产生重复值 
    150            int r2;
    151            if (r1 == 13)
    152            {
    153                r2 = rnd.Next(07);
    154            }

    155            else
    156            {
    157                r2 = rnd.Next(016);
    158            }

    159            string str_r2 = rBase[r2].Trim();
    160
    161            //区位码第3位 
    162            rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);
    163            int r3 = rnd.Next(1016);
    164            string str_r3 = rBase[r3].Trim();
    165
    166            //区位码第4位 
    167            rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i);
    168            int r4;
    169            if (r3 == 10)
    170            {
    171                r4 = rnd.Next(116);
    172            }

    173            else if (r3 == 15)
    174            {
    175                r4 = rnd.Next(015);
    176            }

    177            else
    178            {
    179                r4 = rnd.Next(016);
    180            }

    181            string str_r4 = rBase[r4].Trim();
    182
    183            //定义两个字节变量存储产生的随机汉字区位码 
    184            byte byte1 = Convert.ToByte(str_r1 + str_r2, 16);
    185            byte byte2 = Convert.ToByte(str_r3 + str_r4, 16);
    186            //将两个字节变量存储在字节数组中 
    187            byte[] str_r = new byte[] { byte1, byte2 };
    188
    189            //将产生的一个汉字的字节数组放入object数组中 
    190            bytes.SetValue(str_r, i);
    191
    192        }

    193
    194        return bytes;
    195
    196    }

    197
    198
    199}

    200
    点个广告:
  • 相关阅读:
    applycationContext.xml文件配置信息
    原生json的异步操作
    解析xm文件
    druid(德鲁伊)连接池的DataSourceUtils的写法及原生写法
    MYSQL的JDBCUtils的写法
    模拟服务器
    关于函数式接口
    浅谈树和二叉树
    &和&&的区别
    全排列问题(c语言实现)
  • 原文地址:https://www.cnblogs.com/hanxianlong/p/1012290.html
Copyright © 2011-2022 走看看