首先需要添加的命名空間
using System.Web.UI.WebControls;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
編寫一個生成隨機數的方法,此方法很簡單,返回的是一個字符串也就是需要顯示到驗證碼中的字符串,Random 類是偽隨機數生成器,可以根據自定義的任何字符串生成指定長度的字符串。詳情請參照 https://msdn.microsoft.com/zh-cn/library/system.random.aspx
//獲取隨機數,調用該方法的一個參數是指定返回的字符串的長度
private string GetRandString(int len)
{
string s = "0123456789zxcbvnmasdfghjklpoiuyrtewqQWERTYUIOPLKJHGFDSAXZCVNBM";
string str = "";
Random r = new Random();
for (int i = 0; i < len; i++)
{
str += s.Substring(r.Next(s.Length), 1);
}
return str;
}
好了,隨機生成的字符串已經有了,接下來就是以圖形的方式顯示
這裡可以直接寫到Load事件裡面,也可以把實現的過程封裝起來(寫成一個類)以方便重用,我這裡就直接寫到Load加載事件裡面了
protected void Page_Load(object sender, EventArgs e)
{
Random rand = new Random();
//獲取隨機字符
string str = GetRandString(5);
//創建畫板
Bitmap image = new Bitmap(100, 30);
Graphics g = Graphics.FromImage(image);
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
g.SmoothingMode = SmoothingMode.AntiAlias;
//繪制漸變背景
Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);
Brush brushBack = new LinearGradientBrush(rect, Color.FromArgb(rand.Next(150, 256), 255, 255),
Color.FromArgb(255, rand.Next(150, 256), 255), rand.Next(90));
g.FillRectangle(brushBack, rect);
//繪制干擾曲線
for (int i = 0; i < 2; i++)
{
Point p1 = new Point(0, rand.Next(image.Height));
Point p2 = new Point(rand.Next(image.Width), rand.Next(image.Height));
Point p3 = new Point(rand.Next(image.Width), rand.Next(image.Height));
Point p4 = new Point(image.Width, rand.Next(image.Height));
Point[] p = { p1, p2, p3, p4 };
Pen pen = new Pen(Color.Gray, 1);
g.DrawBeziers(pen, p);
}
//逐個繪制文字
for (int i = 0; i < str.Length; i++)
{
string strChar = str.Substring(i, 1);
int deg = rand.Next(-15, 15);
float x = (image.Width / str.Length / 2) + (image.Width / str.Length) * i;
float y = image.Height / 2;
//隨機字體大小
Font font = new Font("Consolas", rand.Next(16, 24), FontStyle.Regular);
SizeF size = g.MeasureString(strChar, font);
Matrix m = new Matrix();
//旋轉
m.RotateAt(deg, new PointF(x, y), MatrixOrder.Append);
//扭曲
m.Shear(rand.Next(-10, 10) * 0.03f, 0);
g.Transform = m;
//隨機漸變畫筆
Brush brushPen = new LinearGradientBrush(rect, Color.FromArgb(rand.Next(0, 256), 0, 0), Color.FromArgb(0, 0, rand.Next(0, 256)), rand.Next(90));
g.DrawString(str.Substring(i, 1), font, brushPen, new PointF(x - size.Width / 2, y - size.Height / 2));
g.Transform = new Matrix();
}
g.Save();
Response.ContentType = "image/jpeg";
Response.Clear();
Response.BufferOutput = true;
image.Save(Response.OutputStream, ImageFormat.Jpeg);
//釋放使用的資源
g.Dispose();
image.Dispose();
Response.Flush();
}
執行結果
這裡只實現了一個簡單的圖形驗證碼,我這裡只做了兩條干擾線,其實還可以做的更逼真更復雜一些,例如可以在背景上面再添加一些噪音點之類的,使字體不顯示的不這麼明顯,從而進行干擾字體。。。。。
當然這裡還只是一個顯示的圖形而已,你的目的肯定是還有一個文本框的,那麼怎麼判斷輸入的驗證碼是否正確呢,驗證碼都出來了,驗證就簡單了,GetRandString(int len)方法返回的是不是就是隨機生成的圖形驗證碼裡面的字符串,只要拿該方法返回的字符串和文本框裡面的內存進行比較就知道輸入的驗證碼對不對了。。。。