标准验证码图片生成

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

?using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Text;

namespace Impression.Logic.DataAccess
{
internal class VerifyCodeDataAccess : DataAccessBase
{
public byte[] GetVerifyCode()
{

return null;

}


///


/// 选择要生成的验证码样式
///

/// 指定验证码的长度
/// 样式编号
///
public byte[] select(int length, int num)
{
switch (num)
{
case 1:
//数字+字母
return CreateValidateCode(length);
case 2:
//纯数字
return CreateNumCode(length);
case 3:
//纯字母
return CreateLetterCode(length);
case 4:
//汉字
return CreateChineseCode(length);
default:
return null;
}
}


///
/// 生成验证码(数字+字母)
///

/// 指定验证码的长度
/// 数字+字母字符串
public byte[] CreateValidateCode(int length)
{
string chars = "0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
string code = "";
if (length <= 0)
{
return null;
}
Random rnd = new Random();
for (int i = 0; i < length; i++)
{
int index = rnd.Next(0, 62);
code = code + chars[index];
}

double width = 18.0;
return CreateImage(code, width);
}

///
/// 生成验证码(数字)
///

/// 指定验证码的长度
/// 数字字符串
public byte[] CreateNumCode(int length)
{
//创建整型变量
int number;
//创建字符型变量
char code;
//创建字符串变量并初始化为空
string checkCode = String.Empty;
//创建Random对象
Random random = new Random();
//使用For循环生成4个数字
for (int i = 0; i < length; i++)
{
//生成一个随机数
number = random.Next();
//将数字转换成为字符型
code = (char)('0' + (char)(number % 10));

checkCode += code.ToString();
}
//返回字符串

double width = 18.0;
return CreateImage(checkCode, width);
}


///


/// 生成验证码(字母)
///

/// 指定验证码的长度
/// 字母字符串
public byte[] CreateLetterCode(int length)
{
string chars = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
string code = "";
if (length <= 0)
{
return null;
}
Random rnd = new Random();
for (int i = 0; i < length; i++)
{
int index = rnd.Next(0, 52);
code = code + chars[index];
}
double width = 18.0;
return CreateImage(code, width);
}

///
/// 生成验证码(汉字)
///

/// 指定验证码的长度
/// 汉字字符串
public byte[] CreateChineseCode(int length)
{
Encoding gb = Encoding.GetEncoding("gb2312"); object[] bytes = CreateString(length);
//根据汉字字节解码出中文汉字
string code1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));
string code2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));
string code3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));
string code4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));
string code = code1 + code2 + code3 + code4;
double width = 30.0;
return CreateImage(code, width);
}


///
/// 创建验证码的图片
///

public byte[] CreateValidateGraphic(string validateCode, double width)
{
Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * width), 22);
Graphics g = Graphics.FromImage(image);
try
{
//生成随机生成器
Random random = new Random();
//清空图片背景色
g.Clear(Color.White);
//画图片的干扰线
for (int i = 0; i < 25; i++)
{
int x1 = random.Next(image.Width);
int x2 = random.Next(image.Width);
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);
g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
}
Font font = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic));
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height),
Color.Blue,

Color.DarkRed, 1.2f, true);
g.DrawString(validateCode, font, brush, 3, 2);
//画图片的前景干扰点
for (int i = 0; i < 100; i++)
{
int x = random.Next(image.Width);
int y = random.Next(image.Height);
image.SetPixel(x, y, Color.FromArgb(random.Next()));
}
//画图片的边框线
g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
//保存图片数据
MemoryStream stream = new MemoryStream();
image.Save(stream, ImageFormat.Jpeg);
//输出图片流
return stream.ToArray();
}
finally
{
g.Dispose();
image.Dispose();
}
}



///


/// 生成验证码(汉字)
///

/// 指定验证码的长度
///
private object[] CreateString(int length)
{
//定义一个数组存储汉字编码的组成元素
string[] str = new string[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
Random ran = new Random();
//定义一个随机数对象
object[] bytes = new object[length];
for (int i = 0; i < length; i++)
{
//获取区位码第一位
int ran1 = ran.Next(11, 14);
string str1 = str[ran1].Trim();
//获取区位码第二位并防止数据重复
ran = new Random(ran1 * unchecked((int)DateTime.Now.Ticks) + i);
int ran2;
if (ran1 == 13)
{
ran2 = ran.Next(0, 7);
}
else
{
ran2 = ran.Next(0, 16);
}
string str2 = str[ran2].Trim();
//获取区位码第三位
ran = new Random(ran2 * unchecked((int)DateTime.Now.Ticks) + i);
int ran3 = ran.Next(10, 16);
string str3 = str[ran3].Trim();
//获取区位码第四位
ran = new Random(ran3 * unchecked((int)DateTime.Now.Ticks) + i);
int ran4;
if (ran3 == 10) { ran4 = ran.Next(1, 16); } else if (ran3 == 15) { ran4 = ran.Next(0, 15); } else { ran4 = ran.Next(0, 16); }
string str4 = str[ran4].Trim();
//定义字节变量存储产生的随机汉字区位码
byte byte1 = Convert.ToByte(str1 + str2, 16);
byte byte2 = Convert.ToByte(str3 + str4, 16);

byte[] stradd = new byte[] { byte1, byte2 };
//将产生的汉字字节放入数组
bytes.SetValue(stradd, i);
}
return bytes;
}


///


/// 生成扭曲验证码图片
///

/// 指定验证码的长度
///
public byte[] twisty(int length)
{
using (Image img = new Bitmap(120, 40))//背景图片
{
using (Image fontImg = new Bitmap(120, 38))//预先画验证码的临时图片
{
//先将验证码画到临时图片fontImg上
using (Graphics fontGraphic = Graphics.FromImage(fontImg))
{
fontGraphic.Clear(Color.White);//将画布涂白
//画验证码图片
//fontGraphic.DrawString(CreateValidateCode(length), new Font("宋体", 18, FontStyle.Italic | FontStyle.Bold), Brushes.Black, new PointF(4, 4));
}
//将临时验证码图片fontImg分成若干份画到背景图片img上
using (Graphics g = Graphics.FromImage(img))
{
Random random = new Random();


int sum = 60;//分成60份
int niu = 6;//上下最多偏移10像素
float x = 0, y = 1;//从临时图片fontImg选取矩形区域的起始坐标
//从临时图片fontImg选取矩形区域的宽度,由于有背景图片映衬,这里只确定宽度
float width = ((float)fontImg.Width) / sum;
//依次把临时图片fontImg各部分画到背景图片上

for (int i = 0; i < sum; i++)
{
//获取当前部分的正弦值,计算上下偏移量。但这样会使验证码的扭曲单一
//float rate = (float)Math.Sin(360 * 1.0 / sum * i / 180 * Math.PI) * niu;
//如果使用随机数,会有不同的变化
Random r = new Random(lisecond);
float rate = (float)Math.Sin(360 * 1.0 / sum * i / 180 * Math.PI) * r.Next(1, niu);

//把临时图片fontImg当前部分画到背景图片上
g.DrawImage(fontImg, new Rectangle(x == 0 ? 1 : (int)x, (int)y, img.Width, img.Height - 2), x, y * rate, width, fontImg.Height, GraphicsUnit.Pixel);
//依次改变横坐标的下一个位置
x += width;
}
//为背景图片画边框

g.DrawRectangle(new Pen(Brushes.Black), new Rectangle(0, 0, img.Width - 1, img.Height - 1));
}
}
//保存图片数据
MemoryStream stream = new MemoryStream();
//将背景图片保存到输出流
img.Save(stream, ImageFormat.Jpeg);
//输出图片流
return stream.ToArray();
}
}



///


/// 旋转验证码图片
///

/// 随机码
/// 图片宽度
private byte[] CreateImage(string randomcode, double width)
{
int randAngle = 45; //随机转动角度
int mapwidth = (int)(randomcode.Length * width);
Bitmap map = new Bitmap(mapwidth, 25);//创建图片背景
Graphics graph = Graphics.FromImage(map);
graph.Clear(Color.AliceBlue);//清除画面,填充背景
graph.DrawRectangle(new Pen(Color.Black, 0), 0, 0, map.Width - 1, map.Height - 1);//画一个边框
//graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//模式
Random rand = new Random();
//背景噪点生成
Pen blackPen = new Pen(Color.LightGray, 0);
for (int i = 0; i < 50; 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;
//定义颜色
Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
//定义字体
string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
int cindex = rand.Next(7);
for (int i = 0; i < chars.Length; i++)
{
int findex = rand.Next(5);
Font f = new System.Drawing.Font(font[findex], 14, System.Drawing.FontStyle.Bold);//字体样式(参数2为字体大小)
Brush b = new System.Drawing.SolidBrush(c[cindex]);
Point dot = new Point(14, 14);
//graph.DrawString(dot.X.ToString(), f, 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(), f, new SolidBrush(Color.Blue), 1, 1, format);
graph.RotateTransform(-angle);//转回去
graph.TranslateTransform(0, -dot.Y);//移动光标到指定位置,每个字符紧凑显示,避免被软件识别
}
//保存图片数据
MemoryStream stream = new MemoryStream();
//将背景图片保存到输出流
map.Save(stream, ImageFormat.Jpeg);
graph.Dispose();
map.Dispose();
//输出图片流
return stream.ToArray();
}




}
}

相关文档
最新文档