C# 繪圖 圖片Bitmap應用 驗證圖(二)
前面繪圖的應用上手後,接下來是比較有趣跟實作:
在專案中呼叫:
產生網路帳號注冊驗證時,常常會出現的亂數認證圖片
說明:
本例操作後,會隨機產生如上面的圖
預期結果:
一、排除易混淆字體 數字:0 1 ,英文:I O l o
二、字的顏色與圖的顏色互斥,避免看不清楚
三、產生亂數雜點
由於此隨機產生的圖能給多個專案使用
所以會另外寫一個類別庫 (*.dll)
要使用時,記得先加入參考!
步驟:
一、新增專案,設定「類別庫」,命名Vaild
二、撰寫隨機產生的引擎,寫好記得建置
三、另開啟專案,引入參考
四、撰寫程式使用該引擎
程式碼:
隨機引擎:public class VaildNum { private Bitmap vaildNumImage; public Bitmap VaildNumImage { get { return this.vaildNumImage; } } //傳亂數產生後的圖 private String vaildNumAnswer; public String VaildNumAnswer { get { return this.vaildNumAnswer; } } //傳亂數產生的字 private Random rr; private char[] texts; private int numCount; public VaildNum(int num=6) { //(int num=6),意思是若呼叫這個建構子,不給參數預設為6 this.numCount = num; rr = new Random(); vaildNumAnswer = ""; ListLL = new List (); //用來存放篩選後的字 for (int i = 50; i <= 57; i++) //ASCII碼,找出數字 LL.Add((char)i); //從2開始,排除了0,1,放入列表 for (int i = 65; i <=90; i++) { //ASCII碼,找出大寫英文 if (i == 73) continue; //排除I if (i == 79) continue; //排除O LL.Add((char)i); } for (int i = 97; i <= 122; i++) { //參考ASCII碼,找出小寫英文 if (i == 108) continue; //排除l if (i == 111) continue; //排除o LL.Add((char)i); } texts = new char[LL.Count]; texts = LL.ToArray(); //亂數產生驗證答案 vaildNumAnswer = ""; for (int i = 1; i <= this.numCount; i++) { char c = texts[rr.Next(texts.Length)]; vaildNumAnswer += c; } //產生驗證圖片 RenderImage(); } //產生驗證圖片 private void RenderImage() { int ww=30 * 2 + this.numCount * 20; //寬度=(留邊)30*2 + 每個字*20 int hh=70; vaildNumImage = new Bitmap(ww, hh); Graphics gg = Graphics.FromImage(vaildNumImage); //產生背景色 Color cc = Color.FromArgb(rr.Next(256), rr.Next(256), rr.Next(256)); Brush bb = new SolidBrush(cc); gg.FillRectangle(bb, 0, 0, ww, hh); //產生字色,斥掉背景色 bb = new SolidBrush(Color.FromArgb(cc.R ^ 255, cc.G ^ 255, cc.B ^ 255)); //產生字體 Font ff = new Font("Arial Black", 18, FontStyle.Regular); //逐一畫每一個字 for (int i = 0; i < this.vaildNumAnswer.Length; i++) { gg.DrawString( this.vaildNumAnswer.Substring(i, 1), ff, bb, i * 20 + 30, 20); } //加入雜點 bb = new SolidBrush(Color.White); for (int i = 1; i <= 500; i++) gg.FillRectangle(bb, rr.Next(ww), rr.Next(hh), 2, 2); } }
在專案中呼叫:
private void button8_Click(object sender, EventArgs e) { Vaild.VaildNum vn = new Vaild.VaildNum(10); Bitmap mm=vn.VaildNumImage; //取得對應的圖 gg.DrawImage(mm, 50, 50); MessageBox.Show(vn.VaildNumAnswer); //取得對應的答案並秀出 }
留言
張貼留言