mvc實現(xiàn)圖片驗證碼功能
更新時間:2018年12月13日 13:48:43 作者:HI阡陌
這篇文章主要為大家詳細(xì)介紹了mvc實現(xiàn)圖片驗證碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
mvc中實現(xiàn)圖片驗證碼很簡單,只需要創(chuàng)建一個 FileContentResult的方法,返回file就行
/// <summary> /// 創(chuàng)建一個文件方法 /// </summary> /// <returns></returns> public FileContentResult GetCode() { //參數(shù)一:產(chǎn)生幾個字符的驗證碼圖片 參數(shù)二:驗證碼的形式(數(shù)字、字母、數(shù)字字母混合都有) ValidateCode validCode = new ValidateCode(5, ValidateCode.CodeType.Alphas); //將圖片轉(zhuǎn)換為二進制 MemoryStream ms =validCode.CreateCheckCodeImage() as MemoryStream; dateCode = validCode.CheckCode; //通過 CheckCode獲取當(dāng)前的驗證碼 byte[] buffurPic = ms.ToArray(); return File(buffurPic, "image/jpeg"); }
以下是生成驗證碼代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; using System.Drawing.Drawing2D; using System.IO; namespace Helper { public class ValidateCode { #region Private Fields private const double PI = 3.1415926535897932384626433832795; private const double PI2 = 6.283185307179586476925286766559; //private readonly int _wordsLen = 4; private int _len; private CodeType _codetype; private readonly Single _jianju = (float)18.0; private readonly Single _height = (float)24.0; private string _checkCode; #endregion #region Public Property public string CheckCode { get { return _checkCode; } } #endregion #region Constructors /// /// public constructors /// /// 驗證碼長度 /// 驗證碼類型:字母、數(shù)字、字母+ 數(shù)字 public ValidateCode(int len, CodeType ctype) { this._len = len; this._codetype = ctype; } #endregion #region Public Field public enum CodeType { Words, Numbers, Characters, Alphas } #endregion #region Private Methods public string GenerateNumbers() { string strOut = ""; System.Random random = new Random(); for (int i = 0; i < _len; i++) { string num = Convert.ToString(random.Next(10000) % 10); strOut += num; } return strOut.Trim(); } public string GenerateCharacters() { string strOut = ""; System.Random random = new Random(); for (int i = 0; i < _len; i++) { string num = Convert.ToString((char)(65 + random.Next(10000) % 26)); strOut += num; } return strOut.Trim(); } // public string GenerateAlphas() { string strOut = ""; string num = ""; System.Random random = new Random(); for (int i = 0; i < _len; i++) { if (random.Next(500) % 2 == 0) { num = Convert.ToString(random.Next(10000) % 10); } else { num = Convert.ToString((char)(65 + random.Next(10000) % 26)); } strOut += num; } return strOut.Trim(); } private System.Drawing.Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase) { System.Drawing.Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height); // 將位圖背景填充為白色 System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(destBmp); graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), 0, 0, destBmp.Width, destBmp.Height); graph.Dispose(); double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width; for (int i = 0; i < destBmp.Width; i++) { for (int j = 0; j < destBmp.Height; j++) { double dx = 0; dx = bXDir ? (PI2 * (double)j) / dBaseAxisLen : (PI2 * (double)i) / dBaseAxisLen; dx += dPhase; double dy = Math.Sin(dx); // 取得當(dāng)前點的顏色 int nOldX = 0, nOldY = 0; nOldX = bXDir ? i + (int)(dy * dMultValue) : i; nOldY = bXDir ? j : j + (int)(dy * dMultValue); System.Drawing.Color color = srcBmp.GetPixel(i, j); if (nOldX >= 0 && nOldX < destBmp.Width && nOldY >= 0 && nOldY < destBmp.Height) { destBmp.SetPixel(nOldX, nOldY, color); } } } return destBmp; } #endregion #region Public Methods public Stream CreateCheckCodeImage() { string checkCode; switch (_codetype) { case CodeType.Alphas: checkCode = GenerateAlphas(); break; case CodeType.Numbers: checkCode = GenerateNumbers(); break; case CodeType.Characters: checkCode = GenerateCharacters(); break; default: checkCode = GenerateAlphas(); break; } this._checkCode = checkCode; MemoryStream ms = null; // if (checkCode == null || checkCode.Trim() == String.Empty) return null; Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * _jianju)), (int)_height); Graphics g = Graphics.FromImage(image); try { Random random = new Random(); g.Clear(Color.White); // 畫圖片的背景噪音線 for (int i = 0; i < 18; i++) { 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.FromArgb(random.Next()), 1), x1, y1, x2, y2); } Font font = new System.Drawing.Font("Times New Roman", 14, System.Drawing.FontStyle.Bold); LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true); if (_codetype != CodeType.Words) { for (int i = 0; i < checkCode.Length; i++) { g.DrawString(checkCode.Substring(i, 1), font, brush, 2 + i * _jianju, 1); } } else { g.DrawString(checkCode, font, brush, 2, 2); } // 畫圖片的前景噪音點 for (int i = 0; i < 150; i++) { int x = random.Next(image.Width); int y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next())); } // 畫圖片的波形濾鏡效果 if (_codetype != CodeType.Words) { image = TwistImage(image, true, 3, 1); } // 畫圖片的邊框線 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); } finally { g.Dispose(); image.Dispose(); } return ms; } #endregion } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- springmvc處理響應(yīng)數(shù)據(jù)的解析
- springmvc中RequestMappingHandlerAdapter與HttpMessageConverter的裝配講解
- Springmvc的運行流程圖文詳解
- Spring整合Springmvc的相關(guān)介紹
- 詳解Spring MVC/Boot 統(tǒng)一異常處理最佳實踐
- C#語言MVC框架Aspose.Cells控件導(dǎo)出Excel表數(shù)據(jù)
- Spring mvc防止數(shù)據(jù)重復(fù)提交的方法
- Spring MVC處理參數(shù)中的枚舉類型通用實現(xiàn)方法
- spring+springmvc+mybatis 開發(fā)JAVA單體應(yīng)用
- MVC設(shè)定默認(rèn)路由為指定的Area下的某個action
相關(guān)文章
運用.net core中實例講解RabbitMQ高可用集群構(gòu)建
這篇文章主要介紹了運用.net core中實例講解RabbitMQ高可用集群構(gòu)建,文中相關(guān)示例代碼講解的非常清晰,感興趣的小伙伴可以參考一下這篇文章,相信可以幫助到你2021-09-09ASP.NET從字符串中查找字符出現(xiàn)次數(shù)的具體實現(xiàn)方法
今天在一場“特殊的討論”中引入了一個問題,如何在C#求出字符串中某字符的出現(xiàn)次數(shù),比如求“ADSFGEHERGASDF”中“A”出現(xiàn)的次數(shù)2013-11-11iis的http 500內(nèi)部服務(wù)器錯誤的解決
iis的http 500內(nèi)部服務(wù)器錯誤是我們經(jīng)常碰到的錯誤之一,它的主要錯誤表現(xiàn)就是asp程序不能瀏覽但htm靜態(tài)網(wǎng)頁不受影響。另外當(dāng)錯誤發(fā)生時,系統(tǒng)事件日志和安全事件日志都會有相應(yīng)的記錄2007-04-04