/// <summary>
/// 自定义图片验证码函数
/// 该函数将生成一个图片验证码,并将生成的code存放于Session["VerifyCode"]变量内。
/// </summary>
/// <param name="codeLength">验证码长度</param>
/// <param name="codeFontsize">字体大小</param>
/// <value>该函数将生成一个图片验证码,并把生成的code存放于Session["VerifyCode"]变量内</value>
public static void VerifyCode(
int codeLength,
int codeFontsize)
{
double PI =
6.283185307179586476925286766559;
int m_ImgWidth = (
int)(codeLength * (codeFontsize +
2.5)) +
8;
//图像宽度
int m_ImgHeight = codeFontsize *
2 +
2;
//图像高度
string[] m_Fonts = {
"Arial",
"Georgia" };
//随机字体
string[] m_StrarraySource ={
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"J",
"K",
"M",
"N",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z",
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"j",
"k",
"m",
"n",
"p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
"x",
"y",
"z"};
//随机字符所包含范围
Color[] m_ColorarraySource =
{Color.Maroon,Color.Red,Color.IndianRed,Color.Tomato,Color.OrangeRed,
Color.SaddleBrown,Color.Goldenrod,Color.Olive,Color.OliveDrab,Color.ForestGreen,
Color.Green,Color.SeaGreen,Color.LightSeaGreen,Color.Teal,Color.CadetBlue,
Color.SteelBlue,Color.DodgerBlue,Color.CornflowerBlue,Color.Blue,
Color.MediumSlateBlue,Color.BlueViolet,Color.DarkViolet,Color.Fuchsia,
Color.DeepPink,Color.Crimson};//随机字符颜色所包含范围
string m_StrCode =
"";
//用于存放生成的随机数
Random m_StrRandom =
new Random();
for (
int i =
0; i < codeLength; i++
)
{
m_StrCode += m_StrarraySource[m_StrRandom.Next(
0, m_StrarraySource.Length)];
//生成随机字符串
}
Bitmap m_BitmapImg =
new Bitmap(m_ImgWidth, m_ImgHeight);
//定义一个画板
Graphics m_GraphicsSl = Graphics.FromImage(m_BitmapImg);
//在画板上定义绘图的实例
Rectangle m_RectangleJx =
new Rectangle(
0,
0, m_ImgWidth, m_ImgHeight);
//定义一个矩形
m_GraphicsSl.FillRectangle(new SolidBrush(Color.White), m_RectangleJx);
//填充矩形
//bPsl.DrawString(code, new Font("新宋体", 12), new SolidBrush(Color.Black), bPjx);//在矩形内画出字符串
for (
int i =
0; i < m_StrCode.Length; i++
)
{
m_GraphicsSl.DrawString(m_StrCode.Substring(i, 1),
new Font(m_Fonts[m_StrRandom.Next(
0, m_Fonts.Length)].ToString(), codeFontsize, FontStyle.Bold),
new SolidBrush(Color.FromKnownColor(m_ColorarraySource[m_StrRandom.Next(
0, m_ColorarraySource.Length)].ToKnownColor())), i * (codeFontsize +
2) +
2, Convert.ToBoolean(i %
2) ? (m_ImgHeight - codeFontsize -
4) /
2 : (m_ImgHeight - codeFontsize -
4) /
4);
}
//生成干扰
Random m_RandomR =
new Random();
//生成干扰线条
Pen pen =
new Pen(
new SolidBrush(Color.FromKnownColor(m_ColorarraySource[m_StrRandom.Next(
0, m_ColorarraySource.Length)].ToKnownColor())),
1);
for (
int i =
0; i < m_ImgHeight /
10; i++
)
{
m_GraphicsSl.DrawLine(pen, new Point(m_RandomR.Next(
0, m_ImgWidth), m_RandomR.Next(
0, m_ImgHeight)),
new Point(m_RandomR.Next(
0, m_ImgWidth), m_RandomR.Next(
0, m_ImgHeight)));
}
//生成干扰点
//SolidBrush m_SolidbrushP2 = new SolidBrush(ColorTranslator.FromHtml("#f0f0f0"));//干扰点颜色
SolidBrush m_SolidbrushP2 =
new SolidBrush(Color.FromKnownColor(m_ColorarraySource[m_StrRandom.Next(
0, m_ColorarraySource.Length)].ToKnownColor()));
//干扰点颜色
for (
int i =
0; i < m_ImgWidth /
10; i++
)
{
for (
int j =
0; j < m_ImgHeight /
5; j++
)
{
m_GraphicsSl.FillEllipse(m_SolidbrushP2, m_RandomR.Next(m_ImgWidth), j, m_RandomR.Next(2),
2);
//在矩形内画干扰点
}
}
m_GraphicsSl.Dispose();
//正弦曲线Wave扭曲图片
Bitmap m_TempBmp =
new Bitmap(m_ImgWidth, m_ImgHeight);
// 将位图背景填充为白色
Graphics m_Graph =
Graphics.FromImage(m_TempBmp);
m_Graph.FillRectangle(new SolidBrush(Color.White),
0,
0, m_ImgWidth, m_ImgHeight);
m_Graph.Dispose();
for (
int i =
0; i < m_ImgWidth; i++
)
{
for (
int j =
0; j < m_ImgHeight; j++
)
{
double m_dx = (PI * (
double)j) / (
double)m_ImgHeight +
3;
double m_dy =
Math.Sin(m_dx);
// 取得当前点的颜色
int m_nOldX =
0, m_nOldY =
0;
m_nOldX = i + (
int)(m_dy *
2);
m_nOldY =
j;
Color m_color =
m_BitmapImg.GetPixel(i, j);
if (m_nOldX >=
0 && m_nOldX < m_ImgWidth && m_nOldY >=
0 && m_nOldY <
m_ImgHeight)
{
m_TempBmp.SetPixel(m_nOldX, m_nOldY, m_color);
}
}
}
m_BitmapImg =
m_TempBmp;
//生成边框
Graphics m_GraphicsSl2 = Graphics.FromImage(m_BitmapImg);
//在画板上定义绘图的实例
m_GraphicsSl2.DrawRectangle(
new Pen(Color.FromKnownColor(m_ColorarraySource[m_StrRandom.Next(
0, m_ColorarraySource.Length)].ToKnownColor()),
0),
0,
0, m_ImgWidth -
1, m_ImgHeight -
1);
//bPimg.Save(fullfilename, System.Drawing.Imaging.ImageFormat.Gif);//保存为文件
m_BitmapImg.Save(System.Web.HttpContext.Current.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);//将图片显示出来
//释放资源
m_GraphicsSl.Dispose();
m_BitmapImg.Dispose();
//返回值 //将字符串保存到Session中,以便需要时进行验证
System.Web.HttpContext.Current.Session[
"VerifyCode"] =
m_StrCode;
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
namespace FeiBoLaiTe.Admin
{
public partial class Yanzhengma : System.Web.UI.Page
{
protected void Page_Load(
object sender, EventArgs e)
{
if (!
Page.IsPostBack)
{
GenImg(GenCode(4));
}
}
private string GenCode(
int num)
{
string[] source ={
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z"};
string code =
"";
Random rd =
new Random();
for (
int i =
0; i < num; i++
)
{
code += source[rd.Next(
0, source.Length)];
}
return code;
}
//生成图片
private void GenImg(
string code)
{
Bitmap myPalette =
new Bitmap(
45,
16);
//定义一个画板
Graphics gh = Graphics.FromImage(myPalette);
//在画板上定义绘图的实例
Rectangle rc =
new Rectangle(
0,
0,
45,
16);
//定义一个矩形
gh.FillRectangle(new SolidBrush(Color.CornflowerBlue), rc);
//填充矩形
gh.DrawString(code,
new Font(
"宋体",
13),
new SolidBrush(Color.White), rc);
//在矩形内画出字符串
myPalette.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);//将图片显示出来
Session["code"] = code;
//将字符串保存到Session中,以便需要时进行验证
gh.Dispose();
myPalette.Dispose();
}
}
}
private string GenerateCheckCode()
{
int number;
string strCode =
string.Empty;
//随机种子
//Random random = new Random();
//for (int i = 0; i < 4; i++) //验证码长度为4
//{
// //随机整数
// number = random.Next();
// //字符从0-9,A-Z中产生,对应的ASCII码为48-57,65-90
// number = number % 36;
// if (number < 10)
// {
// number += 48;
// }
// else
// {
// number += 55;
// }
// strCode += ((char)number).ToString();
//}
//产生随机字符串
strCode = GenCode(
4);
//将字符串保存在Cookies
Response.Cookies.Add(
new HttpCookie(
"gst_checkCode", strCode));
return strCode;
}
private string GenCode(
int num)
{
string[] source ={
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"i",
"J",
"K",
"L",
"M",
"N",
"o",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z"};
string code =
"";
Random rd =
new Random();
for (
int i =
0; i < num; i++
)
{
code += source[rd.Next(
0, source.Length)];
}
return code;
}
//生成图片
private void CreateCheckCodeImage(
string checkCode)
{
//若检验码为空,则直接返回
if (checkCode ==
null || checkCode.Trim() ==
string.Empty)
return;
//根据验证码长度确定输出图片的长度
System.Drawing.Bitmap image =
new Bitmap((
int)Math.Ceiling(
float.Parse((checkCode.Length *
15).ToString())),
20);
//创建Graphics对象
System.Drawing.Graphics g =
Graphics.FromImage(image);
//生成随机数种子
Random random =
new Random();
//清除图片背景颜色
g.Clear(Color.White);
//画背景图片的噪音线10条
for (
int i =
0; i <
6; i++
)
{
//噪音线起点坐标(x1,y1),终点坐标(x2,y2)
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);
}
//输出图片中校验码的字体:12号Arial,粗斜体
Font font =
new Font(
"Arial",
12, FontStyle.Bold);
//线性渐变画刷
System.Drawing.Drawing2D.LinearGradientBrush brush =
new System.Drawing.Drawing2D.LinearGradientBrush(
new Rectangle(
0,
0, image.Width, image.Width), Color.Blue, Color.Purple,
1.2f,
true);
g.DrawString(checkCode, font, brush, 2,
2);
//画图片的前景噪点50个
for (
int i =
0; i <
50; 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.SaddleBrown),
0,
0, image.Width -
1, image.Height -
1);
//创建内存流用于输出图片
System.IO.MemoryStream ms =
new System.IO.MemoryStream();
//图片格式指定为png
image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
//清除缓冲区流中的所有输出
Response.ClearContent();
//输出流的Http Mime类型设置为"image/Png"
Response.ContentType =
"image/Png";
//输出图片的二进制流
Response.BinaryWrite(ms.ToArray());
//释放Bitmap和Graphics对象
g.Dispose();
image.Dispose();
}
转载于:https://www.cnblogs.com/wodegui/p/4201727.html