Visual Studio .NET 2002.NET 1.0Windows 2003.NET 1.1Windows 2000Windows XP.NET 2.0中级开发Visual StudioWindows.NETASP.NETC#
图像验证辅助类






2.10/5 (12投票s)
2005年1月11日
1分钟阅读

71964

912
为了在图像格式中生成随机字母数字,用于图像验证。
引言
这篇文章将帮助中级的 ASP.NET 开发者,他们可能有时需要实现一种类似于图像验证的功能,以获取用户的输入。基本上,这是一种新技术,可以阻止自动化程序处理输入表单。但是,我在这里不解释图像验证的整个技术。这篇文章将解释两点,我们真正需要的是
- 如何随机生成字母数字字符?
- 如何将其制作成图像?
生成随机字母数字
Microsoft .NET 框架提供了 System.Security.Cryptography
命名空间,其中包含 RandomNumberGenerator
以生成随机数。
类 CImgVerify
包含在函数 getRandomAlphaNumeric
中生成随机字母/数字的代码。
RandomNumberGenerator rm;
rm = RandomNumberGenerator.Create();
上面的代码将创建一个 RandomNumberGenerator
对象。
byte[] data = new byte[3];
rm.GetNonZeroBytes(data);
byte
类型 "data
" 将保存三个元素数组,以通过 GetNonZeroBytes
获得随机生成的数字。GetNonZeroBytes
用密码学上强大的随机的非零值序列填充字节数组。
生成的随机数将存储在 byte
变量中,作为一个数组。每个元素都将是一个整数变量。因此,创建一个合适的字母数字字符串。以下代码将使用循环来确定随机生成的数字是否落在字母范围内。
for(int nCnt=0;nCnt<=data.Length-1;nCnt++)
{
//First convert it into a integer
int nVal = Convert.ToInt32(data.GetValue(nCnt));
// Check whether the converted int falls in between alphabets,symbols
if(nVal > 32 && nVal < 127)
{
sTmp = Convert.ToChar(nVal).ToString(); //Convert to character
}
else
{
sTmp = nVal.ToString(); //Remain as integer
}
sRand += sTmp.ToString(); //Append it to a string
}
在天空中生成图像
所以,现在我们得到了要显示为图像的随机字母数字。可以使用 System.Drawing
命名空间创建图像。以下代码本身就是自解释的。
public Bitmap generateImage(string sTextToImg)
{ //
//Here, i haven't used any try..catch
PixelFormat pxImagePattern = PixelFormat.Format32bppArgb;
Bitmap bmpImage = new Bitmap(1,1,pxImagePattern);
Font fntImageFont = new Font("Trebuchets",14);
Graphics gdImageGrp = Graphics.FromImage(bmpImage);
float iWidth = gdImageGrp.MeasureString(sTextToImg,fntImageFont).Width;
float iHeight = gdImageGrp.MeasureString(sTextToImg,fntImageFont).Height;
bmpImage = new Bitmap((int)iWidth,(int)iHeight,pxImagePattern );
gdImageGrp = Graphics.FromImage(bmpImage);
gdImageGrp.Clear(Color.White);
gdImageGrp.TextRenderingHint = TextRenderingHint.AntiAlias;
gdImageGrp.DrawString(sTextToImg,fntImageFont, new SolidBrush(Color.Red),0,0);
gdImageGrp.Flush();
return bmpImage;
}
如果您有进一步的疑问/建议,请在此处发布。