代码:
public class VerifyCode
{
public VerifyCode()
{
}
public static string Generate(int length)
{
string s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//0123456789";
System.Text.StringBuilder sb = new System.Text.StringBuilder(length);
Random r = new Random();
for(int i = 0; i < length; i++)
{
sb.Append(s[r.Next(0, s.Length)]);
}
return sb.ToString();
}
public static void WriteToOutput(string verifyCode, HttpResponse response)
{
int fontSize;
fontSize = 11;
System.Drawing.Bitmap bitmap = new Bitmap(verifyCode.Length * (fontSize + 2), 45);
Graphics g = Graphics.FromImage(bitmap);
Font f = new System.Drawing.Font("Arial", fontSize);
Brush b = null;//new System.Drawing.SolidBrush(Color.White);
g.Clear(Color.Blue);
Random r = new Random();
for(int i = 0; i < verifyCode.Length; i++)
{
b = new SolidBrush(Color.FromArgb(r.Next(204, 255), r.Next(204, 255), r.Next(204, 255)));
g.DrawString(verifyCode[i].ToString(), f, b, 10 + 11 * i, r.Next(10, 20));
}
bitmap = TwistImage(bitmap);
bitmap = AddNoisePointToImage(bitmap);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
bitmap.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
response.ClearContent();
response.ContentType = "image/Jpeg";
response.BinaryWrite(ms.ToArray());
g.Dispose();
bitmap.Dispose();
}
private static Bitmap TwistImage(Bitmap bitmap)
{
Bitmap bitmapret = new Bitmap(bitmap);
Graphics g = Graphics.FromImage(bitmapret);
g.Clear(Color.Blue);
bitmapret = AddNoiseLineToImage(bitmapret);//在这里加噪音弧线可以保证其不影响人对验证码的识别
Random r = new Random();
double k = Convert.ToDouble(r.Next(0, 4));
try
{
for (int j = 0; j < bitmapret.Width; j++)
{
int offset = Convert.ToInt32(Math.Sin(Convert.ToDouble(j) / 20 + k) * 10);
for(int i = bitmapret.Height - 10; i > 10; i--)
if(i + offset >= 0 && i + offset < bitmapret.Height)
bitmapret.SetPixel(j, i + offset, bitmap.GetPixel(j, i));
}
return bitmapret;
}
catch (Exception)
{
throw;
}
}
private static Bitmap AddNoiseLineToImage(Bitmap bitmap)
{
Random r = new Random();
for(int i = 0; i < bitmap.Width * bitmap.Height / 200; i++)
{
Point point = new Point(r.Next(1, bitmap.Width), r.Next(1, bitmap.Height));
Size size = new Size(r.Next(10, 20), r.Next(10, 20));
int startAngle = r.Next(0, 360);
int sweepAngle = r.Next(startAngle, startAngle + r.Next(60, 180));
Pen pen = new Pen(Color.FromArgb(r.Next(204, 255), r.Next(204, 255), r.Next(204, 255)), (float)1);
Graphics g = Graphics.FromImage(bitmap);
g.DrawArc(pen, new Rectangle(point, size), startAngle, sweepAngle);
g.Dispose();
}
return bitmap;
}
private static Bitmap AddNoisePointToImage(Bitmap bitmap)
{
Random r = new Random();
for (int num1 = 0; num1 < (bitmap.Height - 1); num1++)
{
for (int num2 = 0; num2 < (bitmap.Width - 1); num2++)
{
Color color1 = bitmap.GetPixel(num2, num1);
if(r.Next(0, 40) == 20)
{
bitmap.SetPixel(num2, num1, Color.FromArgb(r.Next(204, 255), r.Next(204, 255), r.Next(204, 255)));
}
}
}
return bitmap;
}
}
调用:
if(this.TextBox1.Text == Session["VerifyCode"].ToString()) this.Literal1.Text = "验证成功!"; else this.Literal1.Text = "验证失败!";
Session["VerifyCode"] = VerifyCode.Generate(10);
VerifyCode.WriteToOutput(Session["VerifyCode"].ToString(), this.Response);
验证:
下面是效果图:
