验证码生成页面代码(清理掉没用的html)
代码语言:javascript复制using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Threading;
using System.Drawing.Text;
using System.Drawing.Drawing2D;
namespace ZhuoYueE.Dop.Web.UI.FenFa
{
public partial class CodeImg : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string randomcode = CreateRandomCode(4);
Session["Code"] = randomcode;
this.CreateImage(randomcode);
}
/// 生成随机码
/// </summary>
/// <param name="length">随机码个数</param>
/// <returns></returns>
private string CreateRandomCode(int length)
{
int rand;
char code;
string randomcode = String.Empty;
//生成一定长度的验证码
System.Random random = new Random();
for (int i = 0; i < length; i )
{
start:
rand = random.Next();
if (rand % 3 == 0)
{
code = (char)('A' (char)(rand % 26));
}
else
{
code = (char)('0' (char)(rand % 10));
}
if (code == '0' || code == 'o' || code == 'O' || code == '1' || code == 'i' || code == 'I' || code == 'l')
goto start;
randomcode = code.ToString();
}
return randomcode;
}
/// <summary>
/// 创建随机码图片
/// </summary>
/// <param name="randomcode">随机码</param>
private void CreateImage(string randomcode)
{
//定义颜色
Random rand = new Random();
Color c = Color.FromArgb(rand.Next(155), rand.Next(155), rand.Next(155));
int randAngle = 45; //随机转动角度
int mapwidth = (int)(randomcode.Length * 16);
Bitmap map = new Bitmap(mapwidth, 22);//创建图片背景
Graphics graph = Graphics.FromImage(map);
graph.Clear(Color.FromArgb(rand.Next(200, 255), rand.Next(200, 255), rand.Next(200, 255)));//清除画面,填充背景
graph.DrawRectangle(new Pen(Color.Black, 0), 0, 0, map.Width - 1, map.Height - 1);//画一个边框
//graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//模式
//背景噪点生成
//Pen blackPen = new Pen(c[cindex], 0);
//for (int i = 0; i < 30; i )
//{
// int x = rand.Next(0, map.Width);
// int y = rand.Next(0, map.Height);
// graph.DrawRectangle(blackPen, x, y, 1, 1);
//}
//验证码旋转,防止机器识别
char[] chars = randomcode.ToCharArray();//拆散字符串成单字符数组
//文字距中
StringFormat format = new StringFormat(StringFormatFlags.NoClip);
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
//定义字体
string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体", "Microsoft New Tai Lue" };
int Count = font.Length;
LinearGradientBrush b = new LinearGradientBrush(
new Point(0, 0), new Point(250, 250),
Color.FromArgb(rand.Next(155), rand.Next(155), rand.Next(155)),
Color.FromArgb(rand.Next(155), rand.Next(155), rand.Next(155)));
for (int i = 0; i < chars.Length; i )
{
int findex = rand.Next(Count);
//渐变色:起点(0, 0)从红色 --->终点(250, 250)蓝色
Font f = new System.Drawing.Font(font[findex], 14, System.Drawing.FontStyle.Bold);//字体样式(参数2为字体大小)
// Brush b = new System.Drawing.SolidBrush(c);
Point dot = new Point(14, 14);
//graph.DrawString(dot.X.ToString(),fontstyle,new SolidBrush(Color.Black),10,150);//测试X坐标显示间距的
float angle = rand.Next(-randAngle, randAngle);//转动的度数
graph.TranslateTransform(dot.X, dot.Y);//移动光标到指定位置
graph.RotateTransform(angle);
graph.DrawString(chars[i].ToString(), f, b, 1, 1, format);
//graph.DrawString(chars[i].ToString(),fontstyle,new SolidBrush(Color.Blue),1,1,format);
graph.RotateTransform(-angle);//转回去
graph.TranslateTransform(-2, -dot.Y);//移动光标到指定位置,每个字符紧凑显示,避免被软件识别
}
//画干扰线
Graphics graph1 = Graphics.FromImage(map);
int intw = map.Width / 4;
int inth = map.Height / 4;
for (int i = 0; i < 3; i )
{
int x1, x2, y1, y2;
x1 = rand.Next(0, intw);
y1 = rand.Next(inth, map.Height - inth);
Thread.Sleep(5);
x2 = rand.Next(map.Width - intw, map.Width);
Thread.Sleep(5);
y2 = rand.Next(inth, map.Height - inth);
graph1.DrawLine(new Pen(b, 1f), x1, y1, x2, y2);
}
for (int i = 0; i < map.Width; i )
{
for (int j = 0; j < map.Height; j )
{
Color cc = map.GetPixel(i, j);
map.SetPixel(i, j, GetColorByColor(cc));
}
}
//生成图片
System.IO.MemoryStream ms = new System.IO.MemoryStream();
map.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
Response.ClearContent();
Response.ContentType = "image/gif";
Response.BinaryWrite(ms.ToArray());
graph.Dispose();
graph1.Dispose();
map.Dispose();
}
private Color GetColorByColor(Color c)
{
int[] cs = new int[] { c.R, c.G, c.B };
Random r = new Random();
for (int i = 0; i < cs.Length; i )
{
if (cs[i] < 50 || cs[i] > 205)
continue;
int rn = r.Next(-50, 50);
cs[i] = rn;
}
return Color.FromArgb(cs[0], cs[1], cs[2]);
}
}
}
调用代码
代码语言:javascript复制<img style="height: 30px" src="codeimg.aspx" id="imgcode" onclick="GetCode()" />
function GetCode() {
document.getElementById("imgcode").src = "codeimg.aspx?t=" new Date().getTime();
}
效果如下: