using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CheckCode1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string checkCode;
private void createCheckCode()
{
string a="";
Random random = new Random();
for(int i=0; i<4;i++)
{
int x = random.Next();
char c;
if(x%2==0)
{
c = (char)('0' + (char)(x % 10));
}
else c = (char)('A' + (char)(x % 26));
a += c.ToString();
}
checkCode = "";
checkCode = a;
}
private void paintLine(Graphics g, Bitmap bmp,int n)
{
Random r = new Random();
//画3条底线
for (int i = 0; i < n; i++)
{
int x1 = r.Next(bmp.Width);
int y1 = r.Next(bmp.Height);
int x2 = r.Next(bmp.Width);
int y2 = r.Next(bmp.Height);
g.DrawLine(new Pen(Color.Red), x1, y1, x2, y2);
}
}
private void paintPoint(Bitmap bmp,int n)
{
Random r = new Random();
for (int i = 0; i < n; i++)
{
int x1 = r.Next(bmp.Width);
int y1 = r.Next(bmp.Height);
bmp.SetPixel(x1, y1, Color.FromArgb(r.Next()));
}
}
private void paintString(Graphics g,Bitmap bmp)
{
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, bmp.Width, bmp.Height), Color.Blue, Color.GreenYellow, 1.2f, true);
g.DrawString(checkCode, new Font("宋体", 12, FontStyle.Bold), brush, 2, 2);
}
private void setPicture(Bitmap bmp)
{
pictureBox1.Width = bmp.Width;
pictureBox1.Height = bmp.Height;
pictureBox1.BackgroundImage = bmp;
}
private void createCheckCodeImage()
{
if (checkCode == string.Empty || checkCode ==null)
return;
Bitmap bmp = new Bitmap(50, 20);
Graphics g = Graphics.FromImage(bmp);
g.Clear(Color.White);
paintLine(g, bmp,3);
paintPoint(bmp, 150);
paintString(g, bmp);
g.DrawRectangle(new Pen(Color.Silver), 0, 0, bmp.Width - 1, bmp.Height - 1);
setPicture(bmp);
}
/**/
/*
此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将
四个字节数组存储在object数组中。
参数:strlength,代表需要产生的汉字个数
*/
public static object[] CreateCode(int strlength)
{
//定义一个字符串数组储存汉字编码的组成元素
string[] r = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
Random rnd = new Random();
//定义一个object数组用来
object[] bytes = new object[strlength];
/**//*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中
每个汉字有四个区位码组成
区位码第1位和区位码第2位作为字节数组第一个元素
区位码第3位和区位码第4位作为字节数组第二个元素
*/
//区位码前两位为区号,后两位为位置号
//gb2312 编码范围:A1A1-FEFE
//汉字编码范围B0A1-F7FE
//汉字从16区B0开始,并且从区位D7开始以后的汉字都是不常见的繁杂汉字,故要排除一些
for (int i = 0; i < strlength; i++)
{
//区位码第1位
int r1 = rnd.Next(11, 14);
string str_r1 = r[r1].Trim();
//区位码第2位
rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i);//更换随机数发生器的种子避免产生重复值
int r2;
//如果第一位是D,第二位区位码就不能是7以后的16进制数 因为从区位D7开始以后的汉字都是不常见的繁杂汉字,故要排除一些
if (r1 == 13)
r2 = rnd.Next(0, 8);
else
r2 = rnd.Next(0, 16);
string str_r2 = r[r2].Trim();
//区位码第3位
rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);
int r3 = rnd.Next(10, 16);
string str_r3 = r[r3].Trim();
//区位码第4位
rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i);
int r4;
//第三位是A的话,第四位范围为1-F
if (r3 == 10)
{
r4 = rnd.Next(1, 16);
}
else if (r3 == 15) //第三位是F的话,第四位范围为0-E
{
r4 = rnd.Next(0, 15);
}
else
{
r4 = rnd.Next(0, 16);
}
string str_r4 = r[r4].Trim();
//定义两个字节变量存储产生的随机汉字区位码
byte byte1 = Convert.ToByte(str_r1 + str_r2, 16);
byte byte2 = Convert.ToByte(str_r3 + str_r4, 16);
//将两个字节变量存储在字节数组中
byte[] str_r = new byte[] { byte1, byte2 };
//将产生的一个汉字的字节数组放入object数组中
bytes.SetValue(str_r, i);
}
return bytes;
}
private void createChineseCodeImage()
{
Encoding gb = Encoding.GetEncoding("gb2312");
object[] bytes = CreateCode(4);
string s1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));
string s2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));
string s3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));
string s4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));
checkCode = "";
checkCode = s1 + s2 + s3 + s4;
if (checkCode == string.Empty || checkCode == null)
return;
Bitmap bmp = new Bitmap(80,22); //合适大小就可以了
Graphics g = Graphics.FromImage(bmp);
g.Clear(Color.White);
paintLine(g, bmp, 3);
paintPoint(bmp, 150);
paintString(g, bmp);
g.DrawRectangle(new Pen(Color.Silver), 0, 0, bmp.Width - 1, bmp.Height - 1);
setPicture(bmp);
}
private void Button2_Click(object sender, EventArgs e)
{
Random r = new Random();
int x = r.Next();
if (x % 2 == 0)
{
createCheckCode();
createCheckCodeImage();
}
else
{
createChineseCodeImage();
}
}
private void Button1_Click(object sender, EventArgs e)
{
if(checkCode==textBox1.Text)
{
MessageBox.Show("登录成功!");
}
else
{
MessageBox.Show("验证码错误!");
}
}
private void Form1_Load(object sender, EventArgs e)
{
Button2_Click(sender, e);
}
}
}
C#随机生成中文验证码或英文和数字验证码
最新推荐文章于 2021-09-05 23:56:27 发布