验证码文字存在Cookie中
public HttpResponseMessage GetValidateCode()
{int width = 100;
int height = 40;
int fontsize = 20;
string code;
byte[] bytes = ValidateCode.CreateValidateGraphic(out code, 4, width, height, fontsize);
var imageStream = new MemoryStream(bytes);
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ByteArrayContent(bytes),
};
response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
HttpContext.Current.Response.Cookies.Add(new HttpCookie("ValidateCode", StringHelper.AesEncrypt(code)));
return response;
}
/// <summary>
/// 产生图形验证码。
/// </summary>
/// <param name="code">传出验证码。</param>
/// <param name="codeLength">验证码字元数。</param>
/// <param name="width"></param>
/// <param name="height"></param>
/// <param name="fontSize"></param>
/// <returns></returns>
public static byte[] CreateValidateGraphic(out string code, int codeLength, int width, int height, int fontSize)
{
string sCode = string.Empty;
//颜色列表,用于验证码、噪线、噪点
Color[] oColors ={
System.Drawing.Color.Black,
System.Drawing.Color.Red,
System.Drawing.Color.Blue,
System.Drawing.Color.Green,
System.Drawing.Color.Orange,
System.Drawing.Color.Brown,
System.Drawing.Color.Brown,
System.Drawing.Color.DarkBlue
};
//字体列表,用于验证码
string[] oFontNames = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact" };
//验证码的字元集,去掉了一些容易混淆的字元
char[] oCharacter = {
'2','3','4','5','6','8','9',
'A','B','C','D','E','F','G','H','J','K', 'L','M','N','P','R','S','T','W','X','Y'
};
Random oRnd = new Random();
Bitmap oBmp = null;
Graphics oGraphics = null;
int N1 = 0;
System.Drawing.Point oPoint1 = default(System.Drawing.Point);
System.Drawing.Point oPoint2 = default(System.Drawing.Point);
Color oColor;
//生成驗證碼字串
for (N1 = 0; N1 <= codeLength - 1; N1++)
{
sCode += oCharacter[oRnd.Next(oCharacter.Length)];
}
oBmp = new Bitmap(width, height);
oGraphics = Graphics.FromImage(oBmp);
oGraphics.Clear(System.Drawing.Color.White);
try
{
for (N1 = 0; N1 <= 4; N1++)
{
//画噪线
oPoint1.X = oRnd.Next(width);
oPoint1.Y = oRnd.Next(height);
oPoint2.X = oRnd.Next(width);
oPoint2.Y = oRnd.Next(height);
oColor = oColors[oRnd.Next(oColors.Length)];
oGraphics.DrawLine(new Pen(oColor), oPoint1, oPoint2);
}
float spaceWith = 0, dotX = 0, dotY = 0;
if (codeLength != 0)
{
spaceWith = (width - fontSize * codeLength - 10) / codeLength;
}
for (N1 = 0; N1 <= sCode.Length - 1; N1++)
{
//画验证码字串
var sFontName = oFontNames[oRnd.Next(oFontNames.Length)];
var oFont = new Font(sFontName, fontSize, FontStyle.Italic);
oColor = oColors[oRnd.Next(oColors.Length)];
dotY = (height - oFont.Height) / 2 + 2;//中心下移2像素
dotX = Convert.ToSingle(N1) * fontSize + (N1 + 1) * spaceWith;
oGraphics.DrawString(sCode[N1].ToString(), oFont, new SolidBrush(oColor), dotX, dotY);
}
for (int i = 0; i <= 30; i++)
{
//画噪点
int x = oRnd.Next(oBmp.Width);
int y = oRnd.Next(oBmp.Height);
Color clr = oColors[oRnd.Next(oColors.Length)];
oBmp.SetPixel(x, y, clr);
}
code = sCode;
//保存图片数据
MemoryStream stream = new MemoryStream();
oBmp.Save(stream, ImageFormat.Jpeg);
//输出图片流
return stream.ToArray();
}
finally
{
oGraphics.Dispose();
}
}