다른 일반적인 방법은 다음을 참조하십시오 https://www.cnblogs.com/zhuanjiao/p/12060937.html
원본 링크 : https://www.cnblogs.com/morang/p/4051935.html
에있어서, 상기 사용이; 하여 System.Drawing을 사용하여, 가에서는 System.Security.Cryptography를 사용하여, System.Web를 사용하여, 네임 스페이스 Common.RandomService을 { /// <요약> /// 클래스 코드 /// </ 요약> 공용 클래스 RandHelper { # 지역 난수 생성 /// <요약> /// 난수를 생성 /// </ 요약> /// <PARAM NAME = "길이"> 생성 길이 </ PARAM> 공공 정적 문자열 수치가 (INT 길이) { 복귀 숫자가 (false로 길이) } /// <요약> /// 난수를 생성 /// </ 요약> /// <매개 변수 이름 = "길이"> 생성 길이 </ PARAM> /// <PARAM NAME = "슬립" > 여부 반복 </ PARAM> 피하기 위해 스톱을 생성하기 전에 현재 스레드 공용 static (길이 INT, BOOL 슬립) 문자열 번호 { IF (절전)을 System.Threading.Thread.Sleep (. 3); 문자열 결과 = ""; System.Random 무작위 임의의 새로운 새로운 = (); (; 나는 <길이; INT I = 0 I ++)에 대한 { 결과 + = Random.Next (10)로 .toString (); } 반환 결과; } #endregion의 # 지역 랜덤 숫자 생성 /// <요약> /// 랜덤 숫자 생성 /// </ 요약> /// <PARAM NAME = "IntStr"> 길이를 생성 </ PARAM> STR 정적 스트링 공개 (길이의 INT) { (거짓으로의 길이)을 반환 STR; } /// <요약> /// 생성 랜덤 숫자 /// </ 요약> /// <PARAM NAME = "길이"> 길이 </ PARAM> 생성 /// <PARAM NAME = "절전"> 여부 반복 </ PARAM> 피하기 위해 스톱을 생성하기 전에 현재 스레드 공용 static 문자열 str을 (길이 INT, BOOL 슬립) { 만약에 휴면 시스템 .Threading.Thread.Sleep (3.) . '1'. '3'. '4'. '5'. '6'. CHAR [] = 패턴 새로운 새 문자 [{ '0', '2',,,,, '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 '}; 결과 = 문자열 ""; N = INT Pattern.Length; 랜덤 랜덤 새로운 새 = System.Random (~ 검사되지 않은 ((int)를 DateTime.Now.Ticks)); (; 나는 <길이 I ++ INT I = 0)에 대한 { INT Random.Next RND = (0, N-) 결과 + 패턴 = RND] } 복귀 결과; } #endregion의 # 지역 난수는 랜덤 순수한 문자 생성은 /// <요약> /// 난수는 랜덤 순수한 문자 생성 /// </ 요약> = /// <PARAM 이름 "IntStr"> 길이를 생성 </ PARAM> 공공 정적 (길이 INT) 문자열 Str_char { (거짓, 길이)를 반환 Str_char; } /// <요약> /// 임의의 숫자는 임의의 순수한 문자를 생성 I ++) { INT RND random.Next = (0, N); + = 패턴 [RND]을 발생; } 결과를 반환; } 문자열 결과 = ""; N = INT Pattern.Length; System.Random 무작위 새로운 랜덤 (~ 체크되지 않은 ((int)를 DateTime.Now.Ticks를)) =; #endregion } /// <요약> /// 이미지 검증 클래스 /// </ 요약> 공용 클래스 YZMHelper { # 지역 민간 분야 개인 문자열 텍스트, 개인 비트 맵 이미지, 개인 letterCount = INT 4;. // 자리 코드 개인 INT letterWidth = 16; 폭 // 단일 폰트 전용 INT letterHeight = 20;의 // 단일 폰트 높이 범위 개인 정적 바이트 [] = randb 새로운 바이트 [4]; 개인 정적 RNGCryptoServiceProvider 랜드 = 새로운 RNGCryptoServiceProvider (); 개인 글꼴 [] 글꼴 = { 새 글꼴 (새 FontFamily를 ( "굴림"), 10 + 다음 (1), System.Drawing.FontStyle.Regular), 새로운 폰트 (새 FontFamily를 ( "조지아"), 다음으로 + 10 (1), System.Drawing.FontStyle.Regular), 새로운 폰트 (새 FontFamily를 ( "굴림"), 다음으로 + 10 (1), System.Drawing.FontStyle .Regular), 새로운 폰트 (새 FontFamily를 ( "만화 산세 MS"), 다음으로 + 10 (1), System.Drawing.FontStyle.Regular) }; #endregion # 지역公有属性 /// <요약> ///验证码 /// </ 요약> 공공 문자열 텍스트 공공 비트 맵 이미지 { GET {this.image를 반환; 얻을 {this.text를 반환; } } /// <요약> ///验证码图片 /// </ 요약> #endregion # 지역构造函数 공개 YZMHelper () { HttpContext.Current.Response.Expires = 0; HttpContext.Current.Response.Buffer = TRUE; HttpContext.Current.Response.ExpiresAbsolute DateTime.Now.AddSeconds = (-1); HttpContext.Current.Response.AddHeader ( "에서 Pragma", "노 캐시"); 없다 HttpContext.Current.Response.CacheControl = "노 캐시"; 없다 this.text = RandHelper.Number (4); createImage의 (); } #endregion # 지역私有方法 /// <요약> ///获得下一个随机数 /// </ 요약> /// < 개인 다음의 정적 INT (INT 최대) { rand.GetBytes (RandB) INT 값 = BitConverter.ToInt32 (RandB 0) . 값 = % 값 (최대 + 1) IF (값 <0) - 값 = 값; 리턴 값; } /// <요약> 다음 난수 /// 수득 /// </ 요약> /// <PARAM NAME = "분"> 최소 </ PARAM> /// <PARAM NAME = "MAX"> 최대 </ PARAM> 다음 (INT 최소, 최대 INT) INT 개인 정적 { INT 다음 값 = (최대 - 최소) + 분; 값을 반환; } #endregion # 지역公共方法 /// <요약> ///绘制验证码 /// </ 요약> 공개 무효 경우는 createImage () { INT int_ImageWidth = this.text.Length * letterWidth; 비트 맵 이미지 = 새로운 맵 (int_ImageWidth, letterHeight); g = Graphics.FromImage 그래픽 (이미지); g.Clear (Color.White); 위한 (INT 난 = 0; I <2; I ++) { INT X1은 다음 (image.Width - 1); INT X2는 다음 (image.Width - 1); Y1 = INT 다음 (image.Height - 1); Y2 = INT 다음 (image.Height - 1); g.DrawLine (새로운 펜 (Color.Silver), X1, Y1, X2, Y2); } INT _x = -12, _y = 0; 대 (INT int_index = 0; int_index <this.text.Length; int_index ++) { _x + = 다음 (12, 16); 다음 _y = (-2, 2); 문자열 str_char = this.text.Substring (int_index, 1); str_char = 다음 (1) == 1? str_char.ToLower () str_char.ToUpper (); 브러시 newBrush 새로운 SolidBrush을 = (GetRandomColor ()); 포인트 thePos 새로운 포인트 (_x, _y를) =; g.DrawString (str_char 폰트 [다음 (fonts.Length - 1)] newBrush, thePos); } 에 대해 INT (I = 0; I <10; I ++) { INT (X) = 다음 (image.Width - 1); INT Y가 다음 (image.Height - 1); image.SetPixel (X, Y, Color.FromArgb (다음의 (0, 255), 다음의 (0, 255), 다음의 (0, 255))); } 이미지 TwistImage (화상 사실, 다음 (1, 3),이어서 (4, 6)) =; g.DrawRectangle (새로운 펜 (Color.LightGray, 1) 0, 0, int_ImageWidth - 1 (letterHeight - 1)); this.image는 이미지 =; } /// <요약> ///字体随机颜色 /// </ 요약> 공공 컬러 GetRandomColor () { 랜덤 RandomNum_First = 새로운 무작위 ((int)를 DateTime.Now.Ticks); System.Threading.Thread.Sleep (RandomNum_First.Next (50)); 임의 RandomNum_Sencond 새로운 랜덤 ((int)를 DateTime.Now.Ticks를) =; INT int_Red = RandomNum_First.Next (180); INT = int_Green RandomNum_Sencond.Next (180) INT int_Blue = (+ int_Green int_Red> 300) :? 0 - 400 int_Red - int_Green; int_Blue = (int_Blue> ? 255) 255 : int_Blue; 창 Color.FromArgb (int_Red, int_Green, int_Blue) } /// <요약> /// 사인 웨이브 찌그러 /// </ 요약> /// <PARAM NAME = "srcBmp "> 이미지 경로 </ PARAM> /// <PARAM NAME ="bXDir는 "> 왜곡되도록 선택되어 있으면 true </ PARAM> /// <PARAM NAME ="nMultValue "> 복수 웨이브 진폭수록 왜곡의 정도 더 일반적. 3 </ PARAM> /// <PARAM NAME = "dPhase "> 파형의 시작 위상 값 간격 [0-2 * PI) </ PARAM> 공개 System.Drawing.Bitmap TwistImage (비트 맵 srcBmp, BOOL bXDir 이중 dMultValue 이중 dPhase) 이중 DX = 0; 더블 dMultValue,이중 dPhase) { 이중 PI = 6.283185307179586476925286766559; 비트 맵 destBmp 새로운 맵 (srcBmp.Width, srcBmp.Height을) =; 그래픽 그래프 = Graphics.FromImage (destBmp); graph.FillRectangle (새 SolidBrush (Color.White), 0, 0, destBmp.Width, destBmp.Height); graph.Dispose (); 이중 dBaseAxisLen는 bXDir을 =? (더블) destBmp.Height : (더블) destBmp.Width; 경우 (나는 <destBmp.Width; INT 난 = 0 난 ++) { 대 (INT J = 0; J <destBmp.Height, J ++) { DX = bXDir? (PI의 * (더블) J) / dBaseAxisLen : (ⅰ)의 PI * (더블) / dBaseAxisLen; DX = + dPhase; 이 때문에, Math.sin 이중 DY (DX를) =; INT nOldX = 0 nOldY = 0; nOldX = bXDir를? I + (INT) (DY dMultValue *) 나; nOldY = bXDir? J : J + (INT) (DY dMultValue *); 컬러 색 srcBmp.GetPixel = (I, J); 경우 (nOldX> = 0 && nOldX <destBmp.Width && nOldY> = 0 && nOldY <destBmp.Height) { destBmp.SetPixel (nOldX, nOldY 색); } } } srcBmp.Dispose (); destBmp를 반환; } #endregion } }