网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

一个可以返回验证码图片的类库源码

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

  验证码字符个数、生成图片宽度、高度自定均可由构造方法自定,无参构造生成默认字符个数和默认大小的Image,方法 GetImgWithValidateCode()返回生成的验证码图片,方法 IsRight(string inputValCode) 判断用户输入的验证码 inputValCode与

图片显示的字符是否一致,不区分大小写

  1. using System; 
  2. using System.IO; 
  3. using System.Data; 
  4. using System.Configuration; 
  5. using System.Collections; 
  6. using System.Drawing; 
  7. using System.Drawing.Imaging; 
  8. using System.Drawing.Drawing2D; 
  9.  
  10. namespace DrawValidateImageLib 
  11.     public class DrawValImg 
  12.     { 
  13.         /// <summary> 
  14.         /// 无参构造 
  15.         /// </summary> 
  16.         public DrawValImg() { } 
  17.         /// <summary> 
  18.         /// 带有生成字符个数的构造 
  19.         /// </summary> 
  20.         /// <param >验证码中包含随机字符的个数</param> 
  21.         public DrawValImg(int charNum) 
  22.         { 
  23.             this.CharNum = charNum; 
  24.         } 
  25.         /// <summary> 
  26.         /// 带有验证码图片宽度和高度的构造 
  27.         /// </summary> 
  28.         /// <param >验证码图片宽度</param> 
  29.         /// <param >验证码图片高度</param> 
  30.         public DrawValImg(int width,int height) 
  31.         { 
  32.             this.width = width; 
  33.             this.height = height; 
  34.         } 
  35.         /// <summary> 
  36.         /// 带有生成字符个数,验证码图片宽度和高度的构造 
  37.         /// </summary> 
  38.         /// <param >验证码中包含随机字符的个数</param> 
  39.         /// <param >验证码图片宽度</param> 
  40.         /// <param >验证码图片高度</param> 
  41.         public DrawValImg(int charNum,int width,int height) 
  42.         { 
  43.             this.CharNum = charNum; 
  44.             this.width = width; 
  45.             this.height = height; 
  46.         } 
  47.  
  48.         /// <summary> 
  49.         /// 验证码中字符个数 
  50.         /// </summary> 
  51.         int charNum = 5; //默认字符个数为5 
  52.  
  53.         public int CharNum 
  54.         { 
  55.             get { return charNum; } 
  56.             set { charNum = value; } 
  57.         } 
  58.         /// <summary> 
  59.         /// 字号 
  60.         /// </summary> 
  61.         int fontSize = 20; 
  62.  
  63.         public int FontSize 
  64.         { 
  65.             get { return fontSize; } 
  66.         } 
  67.         /// <summary> 
  68.         /// 图片宽度 
  69.         /// </summary> 
  70.         int width=200; 
  71.  
  72.         public int Width 
  73.         { 
  74.             get { return width; } 
  75.         } 
  76.  
  77.         /// <summary> 
  78.         /// 图片高度 
  79.         /// </summary> 
  80.         int height=45; 
  81.  
  82.         public int Height 
  83.         { 
  84.             get { return height; } 
  85.             set { height = value; } 
  86.         } 
  87.          
  88.         /// <summary> 
  89.         /// 随机生成的字符串 
  90.         /// </summary> 
  91.         string validStr=""
  92.  
  93.         public string ValidStr 
  94.         { 
  95.             get { return validStr; } 
  96.             set { validStr = value; } 
  97.         } 
  98.  
  99.         /// <summary> 
  100.         /// 产生指定个数的随机字符串,默认字符个数为5 
  101.         /// </summary> 
  102.         void GetValidateCode() 
  103.         { 
  104.             Random rd = new Random(); //创建随机数对象       
  105.  
  106.             //产生由 charNum 个字母或数字组成的一个字符串 
  107.             string str = "abcdefghijkmnpqrstuvwyzABCDEFGHJKLMNPQRSTUVWYZ23456789田国兴";//共57个字符,除 l,o,x,I,O,X,1,0 的所有数字和大写字母 
  108.             for (int i = 0; i < charNum; i++) 
  109.             { 
  110.                 validStr = validStr + str.Substring(rd.Next(57), 1);//返回0到56共57个 
  111.             } 
  112.              
  113.         } 
  114.          
  115.         /// <summary> 
  116.         /// 由随机字符串,随即颜色背景,和随机线条产生的Image 
  117.         /// </summary> 
  118.         /// <returns>Image</returns> 
  119.         public Image GetImgWithValidateCode()//返回 Image 
  120.         { 
  121.             //产生随机字符串 
  122.             GetValidateCode(); 
  123.  
  124.             //声明一个位图对象 
  125.             Bitmap bitMap = null
  126.             //声明一个绘图画面 
  127.             Graphics gph = null
  128.             //创建内存流 
  129.             MemoryStream memStream = new MemoryStream(); 
  130.              
  131.             Random random = new Random(); 
  132.              
  133.             //由给定的需要生成字符串中字符个数 CharNum, 图片宽度 Width 和高度 Height 确定字号 FontSize, 
  134.             //确保不因字号过大而不能全部显示在图片上 
  135.             int fontWidth=(int)Math.Round(width/(charNum+2)/1.3); 
  136.             int fontHeight=(int)Math.Round(height/1.5); 
  137.             //字号取二者中小者,以确保所有字符能够显示,并且字符的下半部分也能显示 
  138.             fontSize = fontWidth <= fontHeight ? fontWidth : fontHeight; 
  139.  
  140.             //创建位图对象 
  141.             bitMap = new Bitmap(width+FontSize,height); 
  142.             //根据上面创建的位图对象创建绘图图面 
  143.             gph = Graphics.FromImage(bitMap); 
  144.  
  145.             //设定验证码图片背景色 
  146.             gph.Clear(GetControllableColor(200)); 
  147.             //产生随机干扰线条 
  148.             for (int i = 0; i < 10; i++) 
  149.             { 
  150.                 Pen backPen = new Pen(GetControllableColor(100), 2); 
  151.                 //线条起点 
  152.                 int x = random.Next(width); 
  153.                 int y = random.Next(height); 
  154.                 //线条终点 
  155.                 int x2 = random.Next(width); 
  156.                 int y2 = random.Next(height); 
  157.                 //划线 
  158.                 gph.DrawLine(backPen, x, y, x2, y2); 
  159.             } 
  160.  
  161.             //定义一个含10种字体的数组 
  162.             String fontFamily ={ "Arial""Verdana""Comic Sans MS""Impact""Haettenschweiler",  
  163.                         "Lucida Sans Unicode""Garamond""Courier New""Book Antiqua""Arial Narrow" }; 
  164.             SolidBrush sb = new SolidBrush(GetControllableColor(0)); 
  165.             //通过循环,绘制每个字符, 
  166.             for (int i = 0; i < validStr.Length; i++) 
  167.             { 
  168.                 Font textFont = new Font(fontFamily[random.Next(10)], fontSize, FontStyle.Bold);//字体随机,字号大小30,加粗  
  169.                  
  170.                 //每次循环绘制一个字符,设置字体格式,画笔颜色,字符相对画布的X坐标,字符相对画布的Y坐标 
  171.                 int space = (int)Math.Round((double)((width - fontSize * (CharNum + 2)) / CharNum)); 
  172.                 //纵坐标 
  173.                 int y = (int)Math.Round((double)((height - fontSize)/3)); 
  174.                 gph.DrawString(validStr.Substring(i, 1), textFont, sb, fontSize + i * (fontSize + space), y); 
  175.             } 
  176.             //扭曲图片 
  177.             bitMap=TwistImage(bitMap, true, random.Next(3,5),random.Next(3)); 
  178.              
  179.             try 
  180.             { 
  181.                  
  182.                 bitMap.Save(memStream, ImageFormat.Gif); 
  183.                 
  184.             } 
  185.             catch (Exception ex) 
  186.             { 
  187.                 System.Windows.Forms.MessageBox.Show(ex.Message); 
  188.             } 
  189.             //gph.Dispose(); 
  190.             bitMap.Dispose(); 
  191.  
  192.             Image img = Image.FromStream(memStream); 
  193.             gph.DrawImage(img, 50, 20, width, 10); 
  194.  
  195.             return img; 
  196.         } 
  197.         /// <summary> 
  198.         /// 产生一种 R,G,B 均大于 colorBase 随机颜色,以确保颜色不会过深 
  199.         /// </summary> 
  200.         /// <returns>背景色</returns> 
  201.         Color GetControllableColor(int colorBase)  
  202.         { 
  203.             Color color=Color.Black; 
  204.             if (colorBase > 200)  
  205.             { 
  206.                 System.Windows.Forms.MessageBox.Show("可控制颜色参数大于200,颜色默认位黑色"); 
  207.             } 
  208.             Random random = new Random(); 
  209.             //确保 R,G,B 均大于 colorBase,这样才能保证背景色较浅 
  210.              color= Color.FromArgb(random.Next(56) + colorBase, random.Next(56) + colorBase, random.Next(56) + colorBase); 
  211.             return color; 
  212.         } 
  213.  
  214.         /// <summary> 
  215.         /// 扭曲图片 
  216.         /// </summary> 
  217.         /// <param ></param> 
  218.         /// <param ></param> 
  219.         /// <param ></param> 
  220.         /// <param ></param> 
  221.         /// <returns></returns> 
  222.         Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase) 
  223.         { 
  224.             int leftMargin = 0; 
  225.             int rightMargin = 0; 
  226.             int topMargin = 0; 
  227.             int bottomMargin = 0; 
  228.             //float PI = 3.14159265358979f; 
  229.             float PI2 = 6.28318530717959f; 
  230.             Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height); 
  231.             double dBaseAxisLen = bXDir ? Convert.ToDouble(destBmp.Height) : Convert.ToDouble(destBmp.Width); 
  232.             for (int i = 0; i < destBmp.Width; i++) 
  233.            { 
  234.                 for (int j = 0; j < destBmp.Height; j++) 
  235.                { 
  236.                     double dx = 0; 
  237.                     dx = bXDir ? PI2 * Convert.ToDouble(j) / dBaseAxisLen : PI2 * Convert.ToDouble(i) / dBaseAxisLen; 
  238.                     dx += dPhase; 
  239.                     double dy = Math.Sin(dx); 
  240.  
  241.                     //取得当前点的颜色     
  242.                     int nOldX = 0; 
  243.                     int nOldY = 0; 
  244.                     nOldX = bXDir ? i + Convert.ToInt32(dy * dMultValue) : i; 
  245.                     nOldY = bXDir ? j : j + Convert.ToInt32(dy * dMultValue); 
  246.                     System.Drawing.Color color = srcBmp.GetPixel(i, j); 
  247.                     if (nOldX >= leftMargin && nOldX < destBmp.Width - rightMargin && nOldY >= bottomMargin && nOldY < destBmp.Height - topMargin) 
  248.                    { 
  249.                         destBmp.SetPixel(nOldX, nOldY, color); 
  250.                     } 
  251.                 } 
  252.         } 
  253.         return destBmp; 
  254.     } 
  255.  
  256.  
  257.         /// <summary> 
  258.         /// 判断验证码是否正确 
  259.         /// </summary> 
  260.         /// <param >待判断的验证码</param> 
  261.         /// <returns>正确返回 true,错误返回 false</returns> 
  262.         public bool IsRight(string inputValCode) 
  263.         { 
  264.  
  265.             if (validStr.ToUpper().Equals(inputValCode.ToUpper()))//无论输入大小写都转换为大些判断 
  266.             { 
  267.                 return true
  268.             } 
  269.             else  
  270.             { 
  271.                 return false
  272.             } 
  273.         } 
  • 下一篇资讯: 一些好用的开源控件
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师