65.9K
CodeProject 正在变化。 阅读更多。
Home

图像验证辅助类

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.10/5 (12投票s)

2005年1月11日

1分钟阅读

viewsIcon

71964

downloadIcon

912

为了在图像格式中生成随机字母数字,用于图像验证。

Sample image

引言

这篇文章将帮助中级的 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;
}

如果您有进一步的疑问/建议,请在此处发布。

© . All rights reserved.