可以生成驗證碼類型有“字母字符串” 、“常用的漢字”、“簡單的數學運算”。生成的驗證碼圖片有jpeg和gif兩種格式。
生成隨機驗證碼包括數字字母和漢字兩種形式,漢字形式利用GB2312編碼表生成而且是常用的漢字。
GB2312 字符編碼分布表:
分區范圍
|
符號類型
|
第01區
|
中文標點、數學符號以及一些特殊字符
|
第02區
|
各種各樣的數學序號
|
第03區
|
全角西文字符
|
第04區
|
日文平假名
|
第05區
|
日文片假名
|
第06區
|
希臘字母表
|
第07區
|
俄文字母表
|
第08區
|
中文拼音字母表
|
第09區
|
制表符號
|
第10-15區
|
無字符
|
第16-55區
|
一級漢字(以拼音字母排序)
|
第56-87區
|
二級漢字(以部首筆畫排序)
|
第88-94區
|
無字符
|
public class VerificationCode { //產生驗證碼的字符集 private static string[] ValidateCharArray = new string[] { "2", "3", "4", "5", "6", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "M", "N", "P", "R", "S", "U", "W", "X", "Y", "a", "b", "c", "d", "e", "f", "g", "h", "j", "k", "m", "n", "p", "r", "s", "u", "w", "x", "y" }; //產生驗證碼的算術符號 private static string[] ArithmeticSymbol = new string[] { "+", "-", "×", "÷" }; //64位圖片字符串開頭描述 private const string imageStr = "data:image/{0};base64,"; ///<summary> ///生成隨機驗證碼(數字字母) ///</summary> ///<param name="length">驗證碼的長度</param> ///<returns></returns> public static string CreateValidateNumber(int length) { string randomCode = ""; int temp = -1; Random rand = new Random(); for (int i = 0; i < length; i++) { if (temp != -1) { rand = new Random(i * temp * ((int)DateTime.Now.Ticks)); } int t = rand.Next(ValidateCharArray.Length); if (temp != -1 && temp == t) { return CreateValidateNumber(length); } temp = t; randomCode += ValidateCharArray[t]; } return randomCode; } /// <summary> /// 生成隨機驗證碼(常用漢字) /// </summary> /// <param name="length">要產生常用漢字的個數</param> /// <returns></returns> public static string CreateValidateChinese(int length) { /*gb2312中文編碼表由區碼和位碼表示*/ string randomCode = ""; Random rand = new Random(); Encoding encoding = Encoding.GetEncoding("gb2312");//從gb2312中文編碼表提取漢字 for (int i = 0; i < length; i++) { int regionCode = rand.Next(16, 56); // 獲取區碼(常用漢字的區碼范圍為16-55) int locationCode = rand.Next(1, (regionCode == 55 ? 90 : 95));// 獲取位碼(位碼范圍為1-94 由於55區的90,91,92,93,94為空,故將其排除) randomCode += encoding.GetString(new byte[] { (byte)(regionCode + 160), (byte)(locationCode + 160) });//區碼位碼分別加上A0H(160)的方法轉換為存儲碼 } return randomCode; } ///<summary> ///生成隨機驗證碼(算術等式) ///</summary> ///<param name="length">驗證碼的長度</param> ///<returns></returns> public static ArithmeticEquation CreateValidateArithmetic() { Random rand = new Random(); ArithmeticEquation ai = new ArithmeticEquation(); ai.text = new List<string>(); ai.text.Add(""); ai.text.Add(""); ai.text.Add(""); ai.text.Add("="); ai.text[1] = ArithmeticSymbol[rand.Next(0, 4)]; if (ai.text[1] == ArithmeticSymbol[0])//加 { int len = rand.Next(1, 3); if (len == 1) { ai.text[0] = rand.Next(0, 10).ToString(); } else { ai.text[0] = rand.Next(1, 10).ToString(); ai.text[0] += rand.Next(0, 10).ToString(); } if (len == 1) { ai.text[2] = rand.Next(1, 10).ToString(); ai.text[2] += rand.Next(0, 10).ToString(); } else { ai.text[2] = rand.Next(0, 10).ToString(); } } else if (ai.text[1] == ArithmeticSymbol[1])//減 { int len = rand.Next(1, 3); if (len == 1) { ai.text[0] = rand.Next(0, 10).ToString(); } else { ai.text[0] = rand.Next(1, 10).ToString(); ai.text[0] += rand.Next(0, 10).ToString(); } if (len == 1) { ai.text[2] = rand.Next(0, int.Parse(ai.text[0]) + 1).ToString(); } else { ai.text[2] = rand.Next(0, 10).ToString(); } } else if (ai.text[1] == ArithmeticSymbol[2])//乘 { ai.text[0] = rand.Next(1, 10).ToString(); ai.text[2] = rand.Next(1, 10).ToString(); } else { ai.text[2] = rand.Next(1, 10).ToString(); ai.text[0] = (int.Parse(ai.text[2]) * rand.Next(1, 10)).ToString(); } ai.value = calculate(ai.text[1], int.Parse(ai.text[0]), int.Parse(ai.text[2])).ToString(); return ai; } ///<summary> ///創建驗證碼的圖片 ///</summary> ///<param name="bitmapParam">驗證碼參數</param> ///<param name="isGif">Gif樣式</param> public static Bitmap CreateValidateImage(BitmapParam bitmapParam, BitmapStyle bitmapStyle) { Bitmap result = null; Random random = new Random(); string text = String.Concat(bitmapParam.textarr); int count = bitmapParam.textarr.Count; Bitmap bmp_template = new Bitmap(bitmapParam.width, bitmapParam.height); Graphics g_template = Graphics.FromImage(bmp_template); #region 繪制干擾線 g_template.Clear(bitmapParam.backColor); using (Pen pen = new Pen(Color.Silver)) { for (int i = 0; i < 25; i++) { int x1 = random.Next(bmp_template.Width); int x2 = random.Next(bmp_template.Width); int y1 = random.Next(bmp_template.Height); int y2 = random.Next(bmp_template.Height); g_template.DrawLine(pen, x1, y1, x2, y2); } } #endregion List<Dot> dotlist = new List<Dot>(); #region 計算干擾點坐標 for (int i = 0; i < 100; i++) { dotlist.Add(new Dot() { gyd = new Point(random.Next(bmp_template.Width), random.Next(bmp_template.Height)), color = Color.FromArgb(random.Next()) }); } #endregion int defaultfontsize = 7; int defaultfontmargin = 3; #region 根據RECT計算文本字體大小 for (int i = defaultfontsize; i < 300; i++) { using (Font f = new Font(bitmapParam.fontName, i, bitmapParam.fontStyle)) { if (g_template.MeasureString(text, f).Width > bitmapParam.width - defaultfontmargin * 2) { defaultfontsize = i; break; } } } for (int i = defaultfontsize; i > 1; i--) { using (Font f = new Font(bitmapParam.fontName, i, bitmapParam.fontStyle)) { if (g_template.MeasureString(text, f).Height < bitmapParam.height - defaultfontmargin * 2) { defaultfontsize = i; break; } } } #endregion Font text_font = new Font(bitmapParam.fontName, defaultfontsize, bitmapParam.fontStyle); SizeF text_size = g_template.MeasureString(text, text_font); LinearGradientBrush text_brush = new LinearGradientBrush(new Rectangle(0, 0, bmp_template.Width, bmp_template.Height), Color.FromArgb(193, 0, 91), Color.FromArgb(136, 193, 0), 1.2f, true); float x_align = ((float)bitmapParam.width - text_size.Width) / 2.0f; float y_align = ((float)bitmapParam.height - text_size.Height) / 2.0f; List<BitmapFrame> bitmapframelist = new List<BitmapFrame>(); if (!bitmapStyle.IsGif || (bitmapStyle.IsGif && bitmapStyle.FrameType == GifFrameType.FullFrame)) { bitmapframelist.Add(new BitmapFrame() { frame = (Bitmap)bmp_template.Clone() }); using (Graphics graphics = Graphics.FromImage(bitmapframelist[0].frame)) { graphics.DrawString(text, text_font, text_brush, x_align, y_align); foreach (Dot dot in dotlist) { bitmapframelist[0].frame.SetPixel(dot.gyd.X, dot.gyd.Y, dot.color); } } if (!bitmapStyle.IsGif) { result = bitmapframelist[0].frame; } else { GifCore gif = new GifCore(bitmapStyle.Delay, bitmapStyle.Repeat); foreach (Dot dot in dotlist) { bmp_template.SetPixel(dot.gyd.X, dot.gyd.Y, dot.color); } gif.AddFrame(bmp_template, delay: -1); gif.AddFrame((Image)bitmapframelist[0].frame, delay: -1); result = gif.Finish(); foreach (BitmapFrame item in bitmapframelist) { item.frame.Dispose(); } } } else { for (int i = 0; i < count; i++) { bitmapframelist.Add(new BitmapFrame() { frame = (Bitmap)bmp_template.Clone() }); } #region 計算每一幀文字坐標 if (count == 1) { bitmapframelist[0].x = x_align; bitmapframelist[0].y = y_align; bitmapframelist[0].z_width = 0; } else { for (int k = 0; k < count; k++) { if (k == 0) { bitmapframelist[0].x = x_align; bitmapframelist[0].y = y_align; bitmapframelist[0].z_width = g_template.MeasureString(GetScopeString(bitmapParam.textarr, 0, k + 2), text_font).Width - g_template.MeasureString(bitmapParam.textarr[k + 1], text_font).Width; } else { bitmapframelist[k].x = bitmapframelist[k - 1].x + bitmapframelist[k - 1].z_width; bitmapframelist[k].y = y_align; bitmapframelist[k].z_width = g_template.MeasureString(GetScopeString(bitmapParam.textarr, 0, k + 1), text_font).Width - g_template.MeasureString(GetScopeString(bitmapParam.textarr, 0, k), text_font).Width; } } } #endregion #region 繪制每一幀文字坐標 for (int k = 0; k < count; k++) { using (Graphics graphics = Graphics.FromImage(bitmapframelist[k].frame)) { graphics.DrawString(bitmapParam.textarr[k], text_font, text_brush, bitmapframelist[k].x, bitmapframelist[k].y); foreach (Dot dot in dotlist) //畫圖片的前景干擾點 { bitmapframelist[k].frame.SetPixel(dot.gyd.X, dot.gyd.Y, dot.color); } } } #endregion #region 生成Gif GifCore gif = new GifCore(bitmapStyle.Delay, bitmapStyle.Repeat); if (count == 1) { foreach (Dot dot in dotlist) { bmp_template.SetPixel(dot.gyd.X, dot.gyd.Y, dot.color); } gif.AddFrame(bmp_template, delay: -1); } foreach (BitmapFrame item in bitmapframelist) { gif.AddFrame((Image)item.frame, delay: -1); } result = gif.Finish(); foreach (BitmapFrame item in bitmapframelist) { item.frame.Dispose(); } #endregion } text_font.Dispose(); text_brush.Dispose(); g_template.Dispose(); bmp_template.Dispose(); return result; } // ///<summary> ///創建驗證碼的圖片 ///</summary> ///<param name="bitmapParam">驗證碼參數</param> ///<param name="isGif">Gif樣式</param> public static byte[] CreateValidateImageBytes(BitmapParam bitmapParam, BitmapStyle bitmapStyle) { using (MemoryStream ms = new MemoryStream()) { Bitmap image = CreateValidateImage(bitmapParam, bitmapStyle); image.Save(ms, bitmapStyle.IsGif ? ImageFormat.Gif : ImageFormat.Jpeg); if (image != null) image.Dispose(); return ms.ToArray(); } } // ///<summary> ///創建驗證碼的圖片 ///</summary> ///<param name="bitmapParam">驗證碼參數</param> ///<param name="isGif">Gif樣式</param> public static string CreateValidateImageBase64String(BitmapParam bitmapParam, BitmapStyle bitmapStyle) { return String.Format(imageStr, bitmapStyle.IsGif ? "gif" : "jpeg") + Convert.ToBase64String(CreateValidateImageBytes(bitmapParam, bitmapStyle)); } /// <summary> /// 拆分文本 /// </summary> /// <param name="str"></param> /// <returns></returns> public static List<string> StringToArray(string str) { str = str.Trim(); List<string> result = new List<string>(); for (int i = 0; i < str.Length; i++) { result.Add(str.Substring(i, 1)); } return result; } /// <summary> ///獲取數組指定范圍字符 /// </summary> /// <param name="arr"></param> /// <param name="start"></param> /// <param name="len"></param> /// <returns></returns> public static string GetScopeString(List<string> arr, int start, int len) { string result = String.Empty; for (int i = 0; i < len; i++) { result += arr[start + i]; } return result; } /// <summary> /// 計算 /// </summary> /// <param name="type"></param> /// <param name="value1"></param> /// <param name="value2"></param> /// <returns></returns> private static int calculate(string type, int value1, int value2) { if (type == ArithmeticSymbol[0])//加 { return value1 + value2; } else if (type == ArithmeticSymbol[1])//減 { return value1 - value2; } else if (type == ArithmeticSymbol[2])//乘 { return value1 * value2; } else { return value1 / value2; } } /// <summary> /// 干擾點 /// </summary> private class Dot { public Point gyd; public Color color; } /// <summary> /// 圖片幀 /// </summary> private class BitmapFrame { /// <summary> /// 幀 /// </summary> public Bitmap frame; public float x; public float y; public float z_width; } /// <summary> /// 驗證碼(算術等式) /// </summary> public class ArithmeticEquation { /// <summary> /// 算術等式 /// </summary> public List<string> text; /// <summary> /// 算術值 /// </summary> public string value; } /// <summary> /// Gif幀類型 /// </summary> public enum GifFrameType { /// <summary> /// 每個字符一幀 /// </summary> EveryFrame, /// <summary> /// 全部字符一幀 /// </summary> FullFrame } /// <summary> /// 驗證碼參數 /// </summary> public class BitmapParam { public BitmapParam() { } public BitmapParam(List<string> _textarr, int _width, int _height, Color _backColor, string _fontName, Color _fontBrushStrat, Color _fontBrushEnd, FontStyle _fontStyle) { this.textarr = _textarr; this.width = _width; this.height = _height; this.backColor = _backColor; this.fontName = _fontName; this.fontBrushStrat = _fontBrushStrat; this.fontBrushEnd = _fontBrushEnd; this.fontStyle = _fontStyle; } /// <summary> /// 驗證碼字符集 /// </summary> public List<string> textarr; /// <summary> /// 驗證碼圖片寬 /// </summary> public int width = 120; /// <summary> /// 驗證碼圖片高 /// </summary> public int height = 50; /// <summary> /// 圖片背景顏色 /// </summary> public Color backColor = Color.White; /// <summary> /// 字體 /// </summary> public string fontName = "微軟雅黑"; /// <summary> /// 字體畫筆顏色開始 /// </summary> public Color fontBrushStrat = Color.FromArgb(193, 0, 91); /// <summary> /// 字體畫筆顏色結束 /// </summary> public Color fontBrushEnd = Color.FromArgb(136, 193, 0); /// <summary> /// 驗證碼字體樣式 /// </summary> public FontStyle fontStyle = FontStyle.Bold | FontStyle.Italic; } /// <summary> /// Gif樣式 /// </summary> public class BitmapStyle { public BitmapStyle() { } public BitmapStyle(bool _IsGif, GifFrameType _FrameType, int _Delay, int _Repeat) { this.IsGif = _IsGif; this.FrameType = _FrameType; this.Delay = _Delay; this.Repeat = _Repeat; } /// <summary> /// 是否生成Gif動畫 /// </summary> public bool IsGif = false; /// <summary> /// Gif幀類型 /// </summary> public GifFrameType FrameType = GifFrameType.EveryFrame; /// <summary> /// 幀之間的延遲(毫秒) /// </summary> public int Delay = 500; /// <summary> /// GIF重復計數(0表示永久) /// </summary> public int Repeat = 0; } }
源碼下載地址:CSharp隨機驗證碼.zip