CreateImage.cs
上传用户:woolgirl
上传日期:2020-04-18
资源大小:243k
文件大小:4k
源码类别:

SCSI/ASPI

开发平台:

Others

  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.UI;
  7. using System.Web.UI.WebControls;
  8. using System.Web.UI.WebControls.WebParts;
  9. using System.Web.UI.HtmlControls;
  10. using System.IO;
  11. using System.Drawing;
  12. using System.Drawing.Imaging;
  13. using System.Drawing.Drawing2D;
  14. /// <summary>
  15. /// 验证码模块
  16. /// </summary>
  17. public class CreateImage
  18. {
  19.     public static void DrawImage()
  20.     {
  21.         CreateImage img = new CreateImage();
  22.         HttpContext.Current.Session["CheckCode"] = img.RndNum(5);
  23.         img.CreateImages(HttpContext.Current.Session["CheckCode"].ToString());
  24.     }
  25.     /// <summary>
  26.     /// 生成验证图片
  27.     /// </summary>
  28.     /// <param name="checkCode">验证字符</param>
  29.     private void CreateImages(string checkCode)
  30.     {
  31.         int iwidth = (int)(checkCode.Length * 13);
  32.         System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 23);
  33.         Graphics g = Graphics.FromImage(image);
  34.         g.Clear(Color.White);
  35.         //定义颜色
  36.         Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
  37.         //定义字体 
  38.         string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
  39.         Random rand = new Random();
  40.         //随机输出噪点
  41.         for (int i = 0; i < 50; i++)
  42.         {
  43.             int x = rand.Next(image.Width);
  44.             int y = rand.Next(image.Height);
  45.             g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);
  46.         }
  47.         //输出不同字体和颜色的验证码字符
  48.         for (int i = 0; i < checkCode.Length; i++)
  49.         {
  50.             int cindex = rand.Next(7);
  51.             int findex = rand.Next(5);
  52.             Font f = new System.Drawing.Font(font[findex], 10, System.Drawing.FontStyle.Bold);
  53.             Brush b = new System.Drawing.SolidBrush(c[cindex]);
  54.             int ii = 4;
  55.             if ((i + 1) % 2 == 0)
  56.             {
  57.                 ii = 2;
  58.             }
  59.             g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * 12), ii);
  60.         }
  61.         //画一个边框
  62.         g.DrawRectangle(new Pen(Color.Black, 0), 0, 0, image.Width - 1, image.Height - 1);
  63.         //输出到浏览器
  64.         System.IO.MemoryStream ms = new System.IO.MemoryStream();
  65.         image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
  66.         HttpContext.Current.Response.ClearContent();
  67.         //Response.ClearContent();
  68.         HttpContext.Current.Response.ContentType = "image/Jpeg";
  69.         HttpContext.Current.Response.BinaryWrite(ms.ToArray());
  70.         g.Dispose();
  71.         image.Dispose();
  72.     }
  73.     /// <summary>
  74.     /// 生成随机的字母
  75.     /// </summary>
  76.     /// <param name="VcodeNum">生成字母的个数</param>
  77.     /// <returns>string</returns>
  78.     private string RndNum(int VcodeNum)
  79.     {
  80.         string Vchar = "0,1,2,3,4,5,6,7,8,9";
  81.         string[] VcArray = Vchar.Split(',');
  82.         string VNum = ""; //由于字符串很短,就不用StringBuilder了
  83.         int temp = -1; //记录上次随机数值,尽量避免生产几个一样的随机数
  84.         //采用一个简单的算法以保证生成随机数的不同
  85.         Random rand = new Random();
  86.         for (int i = 1; i < VcodeNum + 1; i++)
  87.         {
  88.             if (temp != -1)
  89.             {
  90.                 rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));
  91.             }
  92.             int t = rand.Next(VcArray.Length);
  93.             if (temp != -1 && temp == t)
  94.             {
  95.                 return RndNum(VcodeNum);
  96.             }
  97.             temp = t;
  98.             VNum += VcArray[t];
  99.         }
  100.         return VNum;
  101.     }
  102. }