.net生成随机验证码图片
/// <summary> /// 自定义图片验证码函数 /// 该函数将生成一个图片验证码,并将生成的code存放于Session["VerifyCode"]变量内。 /// </summary> /// <param name="codeLength">验证码长度</param> /// <param name="codeFontsize">字体大小</param> /// <value>该函数将生成一个图片验证码,并把生成的code存放于Session["VerifyCode"]变量内</value> public static void VerifyCode(int codeLength, int codeFontsize) { double PI = 6.283185307179586476925286766559; int m_ImgWidth = (int)(codeLength * (codeFontsize + 2.5)) + 8; //图像宽度 int m_ImgHeight = codeFontsize * 2 + 2; //图像高度 string[] m_Fonts = { "Arial", "Georgia" }; //随机字体 string[] m_StrarraySource ={"2","3","4","5","6","7","8","9", "A","B","C","D","E","F","G","H","J","K","M","N", "P","Q","R","S","T","U","V","W","X","Y","Z", "a","b","c","d","e","f","g","h","j","k","m","n", "p","q","r","s","t","u","v","w","x","y","z"}; //随机字符所包含范围 Color[] m_ColorarraySource ={Color.Maroon,Color.Red,Color.IndianRed,Color.Tomato,Color.OrangeRed, Color.SaddleBrown,Color.Goldenrod,Color.Olive,Color.OliveDrab,Color.ForestGreen, Color.Green,Color.SeaGreen,Color.LightSeaGreen,Color.Teal,Color.CadetBlue, Color.SteelBlue,Color.DodgerBlue,Color.CornflowerBlue,Color.Blue, Color.MediumSlateBlue,Color.BlueViolet,Color.DarkViolet,Color.Fuchsia, Color.DeepPink,Color.Crimson};//随机字符颜色所包含范围 string m_StrCode = ""; //用于存放生成的随机数 Random m_StrRandom = new Random(); for (int i = 0; i < codeLength; i++) { m_StrCode += m_StrarraySource[m_StrRandom.Next(0, m_StrarraySource.Length)]; //生成随机字符串 } Bitmap m_BitmapImg = new Bitmap(m_ImgWidth, m_ImgHeight);//定义一个画板 Graphics m_GraphicsSl = Graphics.FromImage(m_BitmapImg);//在画板上定义绘图的实例 Rectangle m_RectangleJx = new Rectangle(0, 0, m_ImgWidth, m_ImgHeight);//定义一个矩形 m_GraphicsSl.FillRectangle(new SolidBrush(Color.White), m_RectangleJx);//填充矩形 //bPsl.DrawString(code, new Font("新宋体", 12), new SolidBrush(Color.Black), bPjx);//在矩形内画出字符串 for (int i = 0; i < m_StrCode.Length; i++) { m_GraphicsSl.DrawString(m_StrCode.Substring(i, 1), new Font(m_Fonts[m_StrRandom.Next(0, m_Fonts.Length)].ToString(), codeFontsize, FontStyle.Bold), new SolidBrush(Color.FromKnownColor(m_ColorarraySource[m_StrRandom.Next(0, m_ColorarraySource.Length)].ToKnownColor())), i * (codeFontsize + 2) + 2, Convert.ToBoolean(i % 2) ? (m_ImgHeight - codeFontsize - 4) / 2 : (m_ImgHeight - codeFontsize - 4) / 4); } //生成干扰 Random m_RandomR = new Random(); //生成干扰线条 Pen pen = new Pen(new SolidBrush(Color.FromKnownColor(m_ColorarraySource[m_StrRandom.Next(0, m_ColorarraySource.Length)].ToKnownColor())), 1); for (int i = 0; i < m_ImgHeight / 10; i++) { m_GraphicsSl.DrawLine(pen, new Point(m_RandomR.Next(0, m_ImgWidth), m_RandomR.Next(0, m_ImgHeight)), new Point(m_RandomR.Next(0, m_ImgWidth), m_RandomR.Next(0, m_ImgHeight))); } //生成干扰点 //SolidBrush m_SolidbrushP2 = new SolidBrush(ColorTranslator.FromHtml("#f0f0f0"));//干扰点颜色 SolidBrush m_SolidbrushP2 = new SolidBrush(Color.FromKnownColor(m_ColorarraySource[m_StrRandom.Next(0, m_ColorarraySource.Length)].ToKnownColor()));//干扰点颜色 for (int i = 0; i < m_ImgWidth / 10; i++) { for (int j = 0; j < m_ImgHeight / 5; j++) { m_GraphicsSl.FillEllipse(m_SolidbrushP2, m_RandomR.Next(m_ImgWidth), j, m_RandomR.Next(2), 2);//在矩形内画干扰点 } } m_GraphicsSl.Dispose(); //正弦曲线Wave扭曲图片 Bitmap m_TempBmp = new Bitmap(m_ImgWidth, m_ImgHeight); // 将位图背景填充为白色 Graphics m_Graph = Graphics.FromImage(m_TempBmp); m_Graph.FillRectangle(new SolidBrush(Color.White), 0, 0, m_ImgWidth, m_ImgHeight); m_Graph.Dispose(); for (int i = 0; i < m_ImgWidth; i++) { for (int j = 0; j < m_ImgHeight; j++) { double m_dx = (PI * (double)j) / (double)m_ImgHeight + 3; double m_dy = Math.Sin(m_dx); // 取得当前点的颜色 int m_nOldX = 0, m_nOldY = 0; m_nOldX = i + (int)(m_dy * 2); m_nOldY = j; Color m_color = m_BitmapImg.GetPixel(i, j); if (m_nOldX >= 0 && m_nOldX < m_ImgWidth && m_nOldY >= 0 && m_nOldY < m_ImgHeight) { m_TempBmp.SetPixel(m_nOldX, m_nOldY, m_color); } } } m_BitmapImg = m_TempBmp; //生成边框 Graphics m_GraphicsSl2 = Graphics.FromImage(m_BitmapImg);//在画板上定义绘图的实例 m_GraphicsSl2.DrawRectangle(new Pen(Color.FromKnownColor(m_ColorarraySource[m_StrRandom.Next(0, m_ColorarraySource.Length)].ToKnownColor()), 0), 0, 0, m_ImgWidth - 1, m_ImgHeight - 1); //bPimg.Save(fullfilename, System.Drawing.Imaging.ImageFormat.Gif);//保存为文件 m_BitmapImg.Save(System.Web.HttpContext.Current.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);//将图片显示出来 //释放资源 m_GraphicsSl.Dispose(); m_BitmapImg.Dispose(); //返回值 //将字符串保存到Session中,以便需要时进行验证 System.Web.HttpContext.Current.Session["VerifyCode"] = m_StrCode; }
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Drawing; namespace FeiBoLaiTe.Admin { public partial class Yanzhengma : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { GenImg(GenCode(4)); } } private string GenCode(int num) { string[] source ={"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"}; string code = ""; Random rd = new Random(); for (int i = 0; i < num; i++) { code += source[rd.Next(0, source.Length)]; } return code; } //生成图片 private void GenImg(string code) { Bitmap myPalette = new Bitmap(45, 16);//定义一个画板 Graphics gh = Graphics.FromImage(myPalette);//在画板上定义绘图的实例 Rectangle rc = new Rectangle(0, 0, 45, 16);//定义一个矩形 gh.FillRectangle(new SolidBrush(Color.CornflowerBlue), rc);//填充矩形 gh.DrawString(code, new Font("宋体", 13), new SolidBrush(Color.White), rc);//在矩形内画出字符串 myPalette.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);//将图片显示出来 Session["code"] = code;//将字符串保存到Session中,以便需要时进行验证 gh.Dispose(); myPalette.Dispose(); } } }
private string GenerateCheckCode() { int number; string strCode = string.Empty; //随机种子 //Random random = new Random(); //for (int i = 0; i < 4; i++) //验证码长度为4 //{ // //随机整数 // number = random.Next(); // //字符从0-9,A-Z中产生,对应的ASCII码为48-57,65-90 // number = number % 36; // if (number < 10) // { // number += 48; // } // else // { // number += 55; // } // strCode += ((char)number).ToString(); //} //产生随机字符串 strCode = GenCode(4); //将字符串保存在Cookies Response.Cookies.Add(new HttpCookie("gst_checkCode", strCode)); return strCode; } private string GenCode(int num) { string[] source ={"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"}; string code = ""; Random rd = new Random(); for (int i = 0; i < num; i++) { code += source[rd.Next(0, source.Length)]; } return code; } //生成图片 private void CreateCheckCodeImage(string checkCode) { //若检验码为空,则直接返回 if (checkCode == null || checkCode.Trim() == string.Empty) return; //根据验证码长度确定输出图片的长度 System.Drawing.Bitmap image = new Bitmap((int)Math.Ceiling(float.Parse((checkCode.Length * 15).ToString())), 20); //创建Graphics对象 System.Drawing.Graphics g = Graphics.FromImage(image); //生成随机数种子 Random random = new Random(); //清除图片背景颜色 g.Clear(Color.White); //画背景图片的噪音线10条 for (int i = 0; i < 6; i++) { //噪音线起点坐标(x1,y1),终点坐标(x2,y2) int x1 = random.Next(image.Width); int x2 = random.Next(image.Width); int y1 = random.Next(image.Height); int y2 = random.Next(image.Height); //用银色线画出噪音线 g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2); } //输出图片中校验码的字体:12号Arial,粗斜体 Font font = new Font("Arial", 12, FontStyle.Bold); //线性渐变画刷 System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Width), Color.Blue, Color.Purple, 1.2f, true); g.DrawString(checkCode, font, brush, 2, 2); //画图片的前景噪点50个 for (int i = 0; i < 50; i++) { int x = random.Next(image.Width); int y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next())); } //画图片段边框线 g.DrawRectangle(new Pen(Color.SaddleBrown), 0, 0, image.Width - 1, image.Height - 1); //创建内存流用于输出图片 System.IO.MemoryStream ms = new System.IO.MemoryStream(); //图片格式指定为png image.Save(ms, System.Drawing.Imaging.ImageFormat.Png); //清除缓冲区流中的所有输出 Response.ClearContent(); //输出流的Http Mime类型设置为"image/Png" Response.ContentType = "image/Png"; //输出图片的二进制流 Response.BinaryWrite(ms.ToArray()); //释放Bitmap和Graphics对象 g.Dispose(); image.Dispose(); }