Winform中实现中文验证码(附代码下载)
生活随笔
收集整理的這篇文章主要介紹了
Winform中实现中文验证码(附代码下载)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
場景
中文驗證碼效果
?
?
注:
博客主頁:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程序猿
獲取編程相關電子書、教程推送與免費下載。
實現
新建一個窗體頁面,設計布局如下
?
其中顯示驗證碼的是PictureBox
然后進入窗體代碼中修改為
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing.Imaging; using System.Drawing.Drawing2D; namespace ChineseCode {public partial class Form1 : Form{public Form1(){InitializeComponent();}public string txt = "";private void Form1_Load(object sender, EventArgs e){CreateImage();}private void CreateImage(){//獲取GB2312編碼頁(表)Encoding gb = Encoding.GetEncoding("gb2312");//調用函數產生4個隨機中文漢字編碼object[] bytes = CreateCode(4);//根據漢字編碼的字節數組解碼出中文漢字string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));string str4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));txt = str1 + str2 + str3 + str4;if (txt == null || txt == String.Empty){return;}Bitmap image = new Bitmap((int)Math.Ceiling((txt.Length * 20.5)), 22);Graphics g = Graphics.FromImage(image);try{//生成隨機生成器Random random = new Random();//清空圖片背景色g.Clear(Color.White);//畫圖片的背景噪音線for (int i = 0; i < 2; i++){Point tem_Point_1 = new Point(random.Next(image.Width), random.Next(image.Height));Point tem_Point_2 = new Point(random.Next(image.Width), random.Next(image.Height));g.DrawLine(new Pen(Color.Black), tem_Point_1, tem_Point_2);}Font font = new Font("宋體", 12, (FontStyle.Bold));LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);g.DrawString(txt, font, brush, 2, 2);//畫圖片的前景噪音點for (int i = 0; i < 100; i++){Point tem_point = new Point(random.Next(image.Width),random.Next(image.Height));image.SetPixel(tem_point.X,tem_point.Y, Color.FromArgb(random.Next()));}//畫圖片的邊框線g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);pictureBox1.Image = image;}catch { }}/**//*此函數在漢字編碼范圍內隨機創建含兩個元素的十六進制字節數組,每個字節數組代表一個漢字,并將四個字節數組存儲在object數組中。參數:strlength,代表需要產生的漢字個數*/public static object[] CreateCode(int strlength){//定義一個字符串數組儲存漢字編碼的組成元素string[] r=new String [16]{"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};Random rnd=new Random();//定義一個object數組用來object[] bytes=new object[strlength];/**//*每循環一次產生一個含兩個元素的十六進制字節數組,并將其放入bject數組中每個漢字有四個區位碼組成區位碼第1位和區位碼第2位作為字節數組第一個元素區位碼第3位和區位碼第4位作為字節數組第二個元素*/for(int i=0;i<strlength;i++){//區位碼第1位int r1=rnd.Next(11,14);string str_r1 = r[r1].Trim();//區位碼第2位rnd=new Random(r1*unchecked((int)DateTime.Now.Ticks)+i);//更換隨機數發生器的種子避免產生重復值int r2;if (r1==13)r2=rnd.Next(0,7);elser2=rnd.Next(0,16);string str_r2 = r[r2].Trim();//區位碼第3位rnd=new Random(r2*unchecked((int)DateTime.Now.Ticks)+i);int r3=rnd.Next(10,16);string str_r3 = r[r3].Trim();//區位碼第4位rnd=new Random(r3*unchecked((int)DateTime.Now.Ticks)+i);int r4;if (r3==10){r4=rnd.Next(1,16);}else if (r3==15){r4=rnd.Next(0,15);}else{r4=rnd.Next(0,16);}string str_r4 = r[r4].Trim();//定義兩個字節變量存儲產生的隨機漢字區位碼byte byte1=Convert.ToByte(str_r1 + str_r2,16);byte byte2=Convert.ToByte(str_r3 + str_r4,16);//將兩個字節變量存儲在字節數組中byte[] str_r=new byte[]{byte1,byte2};//將產生的一個漢字的字節數組放入object數組中bytes.SetValue(str_r,i);???}return bytes;}private void button2_Click(object sender, EventArgs e){CreateImage();}private void button1_Click(object sender, EventArgs e){if (txtCode.Text.Trim() == "")return;else{if (txtCode.Text.Trim() == txt){MessageBox.Show("提示:驗證碼輸入正確!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);}else{MessageBox.Show("提示:驗證碼輸入錯誤,請重新輸入!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}}}} }代碼下載
https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/12243420
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Winform中实现中文验证码(附代码下载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Winform中实现颜色拾取器获取RGB
- 下一篇: Winform中实现监控CPU内存使用率