/// <summary> /// 获取图形验证码 /// </summary> /// <param name="postVal"></param> /// <returns></returns> [HttpPost] public IActionResult ValidateImgCode([FromBody]JObject postVal) { int width = 100; int height = 40; int fontsize = 20; string ImgCode = string.Empty; //第一种用内存流的返回值 // System.IO.MemoryStream ms = ValidateCode.Create_Validate_Graphic(out ImgCode, 4, width, height, fontsize); return File(ms.ToArray(), @"image/jpeg"); // //下面是用字节返回 // //byte[] bytes = ValidateCode.CreateValidateGraphic(out ImgCode, 4, width, height, fontsize); // return File(bytes, @"image/jpeg"); //return AsResult.Success(new //{ // CodeImg = ImgCode, // CodeByte= File(bytes, @"image/jpeg") //} //); // // }
/// <summary> /// 随机码和图片流生成 /// </summary> public class ValidateCode { /// <summary> /// 产生图像验证码 /// </summary> /// <param name="Code">验证码。</param> /// <param name="CodeLength">验证码元数。</param> /// <param name="Width"></param> /// <param name="Height"></param> /// <param name="FontSize"></param> /// <returns></returns> public static byte[] CreateValidateGraphic(out String ImgCode, int CodeLength, int Width, int Height, int FontSize) { String sCode = String.Empty; //顏色列表,用于验证码噪点 噪线 Color[] oColors ={ Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue}; //字体列表用于验证码 string[] oFontNames = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact" }; //驗證碼的字元集,去掉了一些容易混淆的字元 char[] oCharacter = { '2', '3', '4', '5', '6', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y' }; Random oRnd = new Random(); Bitmap oBmp = null; Graphics oGraphics = null; int N1 = 0; Point oPoint1 = default(Point); Point oPoint2 = default(Point); string sFontName = null; Font oFont = null; Color oColor = default(Color); //生成验证码字串 for (N1 = 0; N1 <= CodeLength - 1; N1++) { sCode += oCharacter[oRnd.Next(oCharacter.Length)]; } //定义图像的大小,生成图像的实例 oBmp = new Bitmap(Width, Height); //从Img对象生成新的Graphics对象 oGraphics = Graphics.FromImage(oBmp); //背景设为白色 oGraphics.Clear(Color.White); try { for (N1 = 0; N1 <= 4; N1++) { //画噪线 oPoint1.X = oRnd.Next(Width); oPoint1.Y = oRnd.Next(Height); oPoint2.X = oRnd.Next(Width); oPoint2.Y = oRnd.Next(Height); oColor = oColors[oRnd.Next(oColors.Length)]; oGraphics.DrawLine(new Pen(oColor), oPoint1, oPoint2); } float spaceWith = 0, dotX = 0, dotY = 0; if (CodeLength != 0) { spaceWith = (Width - FontSize * CodeLength - 10) / CodeLength; } for (N1 = 0; N1 <= sCode.Length - 1; N1++) { //画验证码子串 sFontName = oFontNames[oRnd.Next(oFontNames.Length)]; oFont = new Font(sFontName, FontSize, FontStyle.Italic); oColor = oColors[oRnd.Next(oColors.Length)]; dotY = (Height - oFont.Height) / 2 + 2;//中心下移2像素 dotX = Convert.ToSingle(N1) * FontSize + (N1 + 1) * spaceWith; oGraphics.DrawString(sCode[N1].ToString(), oFont, new SolidBrush(oColor), dotX, dotY); } //在随机位置画背景点 for (int i = 0; i <= 30; i++) { //画噪点 int x = oRnd.Next(oBmp.Width); int y = oRnd.Next(oBmp.Height); Color clr = oColors[oRnd.Next(oColors.Length)]; oBmp.SetPixel(x, y, clr); } ImgCode = sCode; //保存图片数据 MemoryStream stream = new MemoryStream(); oBmp.Save(stream, ImageFormat.Jpeg); //输出图片流 return stream.ToArray(); } finally { oGraphics.Dispose(); oBmp.Dispose(); } } /// <summary> /// 内存流的方式返回 随机码和图片流生成 /// </summary> /// <param name="ImgCode"></param> /// <param name="CodeLength"></param> /// <param name="Width"></param> /// <param name="Height"></param> /// <param name="FontSize"></param> /// <returns></returns> public static MemoryStream Create_Validate_Graphic(out String ImgCode, int CodeLength, int Width, int Height, int FontSize) { String sCode = String.Empty; //顏色列表,用于验证码噪点 噪线 Color[] oColors ={ Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue}; //字体列表用于验证码 string[] oFontNames = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact" }; //驗證碼的字元集,去掉了一些容易混淆的字元 char[] oCharacter = { '2', '3', '4', '5', '6', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y' }; Random oRnd = new Random(); Bitmap oBmp = null; Graphics oGraphics = null; int N1 = 0; Point oPoint1 = default(Point); Point oPoint2 = default(Point); string sFontName = null; Font oFont = null; Color oColor = default(Color); //生成验证码字串 for (N1 = 0; N1 <= CodeLength - 1; N1++) { sCode += oCharacter[oRnd.Next(oCharacter.Length)]; } //定义图像的大小,生成图像的实例 oBmp = new Bitmap(Width, Height); //从Img对象生成新的Graphics对象 oGraphics = Graphics.FromImage(oBmp); //背景设为白色 oGraphics.Clear(Color.White); try { for (N1 = 0; N1 <= 4; N1++) { //画噪线 oPoint1.X = oRnd.Next(Width); oPoint1.Y = oRnd.Next(Height); oPoint2.X = oRnd.Next(Width); oPoint2.Y = oRnd.Next(Height); oColor = oColors[oRnd.Next(oColors.Length)]; oGraphics.DrawLine(new Pen(oColor), oPoint1, oPoint2); } float spaceWith = 0, dotX = 0, dotY = 0; if (CodeLength != 0) { spaceWith = (Width - FontSize * CodeLength - 10) / CodeLength; } for (N1 = 0; N1 <= sCode.Length - 1; N1++) { //画验证码子串 sFontName = oFontNames[oRnd.Next(oFontNames.Length)]; oFont = new Font(sFontName, FontSize, FontStyle.Italic); oColor = oColors[oRnd.Next(oColors.Length)]; dotY = (Height - oFont.Height) / 2 + 2;//中心下移2像素 dotX = Convert.ToSingle(N1) * FontSize + (N1 + 1) * spaceWith; oGraphics.DrawString(sCode[N1].ToString(), oFont, new SolidBrush(oColor), dotX, dotY); } //在随机位置画背景点 for (int i = 0; i <= 30; i++) { //画噪点 int x = oRnd.Next(oBmp.Width); int y = oRnd.Next(oBmp.Height); Color clr = oColors[oRnd.Next(oColors.Length)]; oBmp.SetPixel(x, y, clr); } ImgCode = sCode; //保存图片数据 MemoryStream stream = null; stream = new MemoryStream(); oBmp.Save(stream, ImageFormat.Jpeg); //输出图片流 return stream; } finally { oGraphics.Dispose(); oBmp.Dispose(); } } }