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 = "";
List LL = 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); //取得對應的答案並秀出
}


留言
張貼留言