最近,在做一个登录界面,界面上想有一个生成随机验证码的功能,就自己实现了一个,主要是使用了GDI+。思路如下:
1、在内存中生成一张Bitmap图片;
2、生成随机数字;
3、Graphics.FromImage()方法获取DC(设备上下文);
4、Graphics.DrawString();
5、将图片写入内存流,将内存流通过http传输给网页;
代码如下:
一、生成图片的网页
/// <summary>
/// 生成随机字符串
/// </summary>
/// <param name="codeLength">需要生成随机字符串的长度</param>
/// <returns>生成的字符串</returns>
private string GenerateCode(int codeLength)
{
//存放生成随机数据的字符数组共62个
char[] charArray = {
'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',
'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'
};
int arrayLength = charArray.Length;
/// 生成随机字符串
/// </summary>
/// <param name="codeLength">需要生成随机字符串的长度</param>
/// <returns>生成的字符串</returns>
private string GenerateCode(int codeLength)
{
//存放生成随机数据的字符数组共62个
char[] charArray = {
'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',
'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'
};
int arrayLength = charArray.Length;
string returnValue = "";
int flag = 0;
Random rand = new Random();
//生成制定数字的字符串
for (int i = 0; i < codeLength; i++)
{
while (flag != -1)
{
int pos = rand.Next(0, arrayLength);
flag = returnValue.IndexOf(charArray[pos]);
if (flag == -1)
{
returnValue += charArray[pos];
flag = 0;
break;
}
}
}
return returnValue;
}
int flag = 0;
Random rand = new Random();
//生成制定数字的字符串
for (int i = 0; i < codeLength; i++)
{
while (flag != -1)
{
int pos = rand.Next(0, arrayLength);
flag = returnValue.IndexOf(charArray[pos]);
if (flag == -1)
{
returnValue += charArray[pos];
flag = 0;
break;
}
}
}
return returnValue;
}
/// <summary>
/// 生成验证码图片
/// </summary>
/// <param name="ImageWidth">图片宽度</param>
/// <param name="ImageHeight">图片高度</param>
/// <param name="font">内容字体</param>
/// <param name="brush">画刷</param>
/// <param name="backgroundColor">图片背景色</param>
/// <param name="codeLength">生成验证码的长度</param>
/// <returns></returns>
private MemoryStream GenerateMemoryImage(int ImageWidth, int ImageHeight, Font font, Brush brush, Color backgroundColor, int codeLength)
{
MemoryStream ms = new MemoryStream();
Bitmap image = new Bitmap(ImageWidth, ImageHeight);
Graphics g = Graphics.FromImage(image);
g.Clear(backgroundColor);
string code = GenerateCode(codeLength);
SizeF size = g.MeasureString(code, font);
g.DrawString(code, font, brush, (ImageWidth - (int)size.Width) / 2, (ImageHeight - (int)size.Height) / 2);
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms;
}
/// 生成验证码图片
/// </summary>
/// <param name="ImageWidth">图片宽度</param>
/// <param name="ImageHeight">图片高度</param>
/// <param name="font">内容字体</param>
/// <param name="brush">画刷</param>
/// <param name="backgroundColor">图片背景色</param>
/// <param name="codeLength">生成验证码的长度</param>
/// <returns></returns>
private MemoryStream GenerateMemoryImage(int ImageWidth, int ImageHeight, Font font, Brush brush, Color backgroundColor, int codeLength)
{
MemoryStream ms = new MemoryStream();
Bitmap image = new Bitmap(ImageWidth, ImageHeight);
Graphics g = Graphics.FromImage(image);
g.Clear(backgroundColor);
string code = GenerateCode(codeLength);
SizeF size = g.MeasureString(code, font);
g.DrawString(code, font, brush, (ImageWidth - (int)size.Width) / 2, (ImageHeight - (int)size.Height) / 2);
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms;
}
//网页调用生成图片方法,并将内存流转换为byte[]通过http传输
protected void Page_Load(object sender, EventArgs e)
{
Font font = new Font("Arial", 20f);
MemoryStream ms = GenerateMemoryImage(150, 30, font, new SolidBrush(Color.Black), Color.WhiteSmoke, 4);
Response.ClearContent();
Response.ContentType = "image/jpeg";
Response.BinaryWrite(ms.ToArray());
Response.End();
}
{
Font font = new Font("Arial", 20f);
MemoryStream ms = GenerateMemoryImage(150, 30, font, new SolidBrush(Color.Black), Color.WhiteSmoke, 4);
Response.ClearContent();
Response.ContentType = "image/jpeg";
Response.BinaryWrite(ms.ToArray());
Response.End();
}
二、调用图片的网页
<img id="code" alt="" οnclick="this.src='Default.aspx?'+Math.random();" src="Default.aspx" style="padding-left: 10px;
vertical-align: middle; cursor: pointer" />
vertical-align: middle; cursor: pointer" />
只要在需要使用图片的网页上调用该标记即可,之所以="this.src='Default.aspx?'+Math.random();" 要加上Math.random()是因为防止缓存。
生成图片时可以对图片写入的文字,对每个字符/汉字随机使用字体、字号、颜色等等。
下一讲,更深入说明如何对验证码进行图片的效果处理。