第一次在CSDN写博客,还希望能有前辈多多指教,谢谢;
在登陆网页或者APP时,经常会遇到一些验证码要求输入,一般是数字和字母的组合或者一组汉字,本文简单介绍如何用c#来实现。
首先介绍一种生成数字和字母组合的方法:
自定义方法creatnum生成一个长度为count的字符串,为了避免生成重复的随机数,通过变量来记录随机数结果,如果出现与上次重复的数值则调用函数本身,以保证生成不同的随机数,代码如下:
private string createrandnum(int num)
{
string allchar = "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[] allcharary = allchar.Split(',');
string randnum = "";
// int temp = -1;
Random rand = new Random();
for (int i = 0; i < num; i++)
{
if (temp != -1)
{
rand = new Random(i*temp*((int)DateTime.Now.Ticks));
}
int t = rand.Next(35);
if (temp == t)
{
return createrandnum(num);
}
int t = rand.Next(35);
// temp = t;
randnum += allcharary[t];
}
return randnum;
}
上面的方法中我们把所要添加的元素先定义为字符串,再拆分成数组,似乎过程有些麻烦,那么如何更简单的添加元素呢?数字元素的添加可以直接使用一个for循环添加即可,字母的添加可以通过转换字母所对应的ASCII码来实现,那么代码如下:
public string creatnum(int numc)
{
string str = "";
int temp = -1;
Random ra = new Random();
var arr = new List<string> { };
for (int i = 0; i < 9; i++)
{
arr.Add(i.ToString());
}
for (int i = 65; i < 91; i++)
{
arr.Add(Encoding.GetEncoding("ASCII").GetString(new byte[] { (byte)i }));
}
for (int i = 0; i < numc; i++)
{
var r = ra.Next(35);
str += arr[r];
}
return str;
}```
其中使用GetString方法将指定数组解码为字符串得到ASCII码对应的字母元素。
下面介绍如何制作中文验证码的方法:
生成中文验证码的思路是首先要获取随机生成的汉字的区位码,然后根据区位码来获取对应的汉字,这里还是用到了E你coding的GetString方法,语法如下:
```csharp
public virtual string GetString(bytr[]bytrs)
具体实现代码如下:
private void CreateImage()
{
Encoding gb = Encoding.GetEncoding("gb2312"); //获取GB2312编码页(表)
object[] bytes = CreateCode(4); //调用函数产生4个随机中文汉字编码
//根据汉字编码的字节数组解码出中文汉字
string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));
string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));
string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));
string str4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));
txt = str1 + str2 + str3 + str4; //获取随机生成的四个汉字
}
生成了数字字母组合或者是汉字的验证码字符串之后,下面将其生成图形验证码,并为了进一步确保安全性,增加一些噪声干扰,代码如下:
private void creatimage(string varnum)
{
if (varnum == null || varnum.Trim() == string.Empty)
return;
System.Drawing.Bitmap image = new System.Drawing.Bitmap(varnum.Length * 12 + 10, 22);//生成画布
Graphics g = Graphics.FromImage(image);
try
{
Random ra=new Random();
g.Clear(Color.White);
for(int i=0;i<25;i++)//绘制背景噪音线
{
int x1=ra.Next(image.Width);
int x2=ra.Next(image.Width);
int y1=ra.Next(image.Height);
int y2=ra.Next(image.Height);
g.DrawLine(new Pen(Color.Silver),x1,y1,x2,y2);
}
Font font=new System.Drawing.Font("Arial",12,(System.Drawing.FontStyle.Bold|System.Drawing.FontStyle.Italic));
System.Drawing.Drawing2D.LinearGradientBrush brush=new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0,0,image.Width,image.Height),Color.Blue,Color.DarkRed,1.2f,true);
g.DrawString(varnum,font,brush,2,2);
//绘制前景噪声点
for (int i = 0; i < 100; i++)
{
int x = ra.Next(image.Width);
int y = ra.Next(image.Height);
image.SetPixel(x, y, Color.FromArgb(ra.Next()));
}
//绘制边框线
g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
finally
{
g.Dispose();
image.Dispose();
}
}
最后将生成的图片绑定到picturebox控件或者网页显示:
代码分别如下:
pictureBox1.Image=image;//绑定到控件
System.IO.MemoryStream ms=new System.IO.MemoryStream()
image.Save(ms,System.Drawing.Imaging.ImageFormat.jpeg);//将图像保存至数据流
Response.ClearContent();
Response.ContentType="image/jpeg";
Response.BinaryWrite(ms.ToString());
``