zoukankan      html  css  js  c++  java
  • C#小程序—随机产生验证码

    最近在家闲来无事,看了几天的书,头有点大。手痒写写代码。

    1.目的

    随机产生验证码。用C#GDI+绘图完成,由于我现在只会简单的winform程序,完成后在winform上显示。

                                                   

    2.思路

    随机在一定的字符中挑选几个,然后将每个字符的各个属性(字体,大小,颜色)随机生成,接着画出来就可以了。

    3.实现

    3.1定义变量

    这里的产生的字符数目和字体及颜色都可以自己添加。小建议:验证码所含的字符最好不要有歧义的,例如数字1和字母l。

    char[] data = new char[6];  //用来装产生的随机字符,大小可变
            //字符颜色、字体等变化范围
    string[] myFont = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact", "微软雅黑", "宋体" };
    Color[] myColor = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue };
    char[] myChar = { '2', '3', '4', '5', '6', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J',
                                   'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y','Z','a','b','c','d','e',
                               'f','g','h','j','k','m','n','p','r','s','t','w','x','y','z'};

    3.2定义画布和bitmap等变量

    背景为白色。从myBitmap创建画布。

    Graphics g = this.CreateGraphics();
    Bitmap myBitmap=new Bitmap(200,100);
    g = Graphics.FromImage(myBitmap);
    g.Clear(Color.White);

    接下来是定义随机变量Random。

    Random r = new Random(DateTime.Now.Second);
    下面利用r产生的随机数是否一样并不重要,验证码中的字符可以相同。

    3.3画

    验证码还含有一些其他的线和点,来混淆视线。

    	    
                //画燥线
                for (int i = 0; i < 10; i++)
                {
                    int x1 = r.Next(200);
                    int y1 = r.Next(100);
                    int x2 = r.Next(200);
                    int y2 = r.Next(100);
                    Color clr = myColor[r.Next(myColor.Length)];
                    g.DrawLine(new Pen(clr), new Point(x1, y1), new Point(x2, y2));
                }
    
                //画字符
                for (int i = 0; i < data.Length; i++)
                    data[i] = (char)myChar[r.Next(myChar.Length)];
                for (int i = 0; i < data.Length; i++)
                {
                    Font tempFont = new Font(myFont[r.Next(myFont.Length)], 18);
                    g.DrawString(data[i].ToString(), tempFont,
                        new SolidBrush(myColor[r.Next(myColor.Length)]), (float)i * 20 + 40, (float)40);
                }
     
                //画燥点
                for (int i = 0; i < 100; i++)
                {
                    int x = r.Next(myBitmap.Width);
                    int y = r.Next(myBitmap.Height);
                    Color tempColor = myColor[r.Next(myColor.Length)];
                    myBitmap.SetPixel(x, y, tempColor);
                };

    3.4显示和保存

    画完成了,但这是并没有显示出来,这时只画在myBitmap中,为了将他显示出来,定义另一个画布。

    Graphics thisGr;
    thisGr = this.CreateGraphics();
    thisGr.DrawImage(myBitmap, new Point(90, 35));

    这就完成了。

                                     

    在退出前,不要忘记释放资源。

    4.不足

    产生的验证码不美观,且验证码中的字符没有倾斜的效果。

    5.代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Drawing.Imaging;
    
    namespace Ch53_随机产生验证码
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                thisGr = this.CreateGraphics();
            }
    
            char[] data = new char[6];  //用来装产生的随机字符,大小可变
            //字符颜色、字体等变化范围
            string[] myFont = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact", "微软雅黑", "宋体" };
            Color[] myColor = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue };
            char[] myChar = { '2', '3', '4', '5', '6', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J',
                                   'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y','Z','a','b','c','d','e',
                               'f','g','h','j','k','m','n','p','r','s','t','w','x','y','z'};
            Graphics thisGr;
    
            private void btnSet_Click(object sender, EventArgs e)
            {
                Graphics g = this.CreateGraphics();
                Bitmap myBitmap=new Bitmap(200,100);
                g = Graphics.FromImage(myBitmap);
                g.Clear(Color.White);
                Random r = new Random(DateTime.Now.Second);
    
                //画燥线
                for (int i = 0; i < 10; i++)
                {
                    int x1 = r.Next(200);
                    int y1 = r.Next(100);
                    int x2 = r.Next(200);
                    int y2 = r.Next(100);
                    Color clr = myColor[r.Next(myColor.Length)];
                    g.DrawLine(new Pen(clr), new Point(x1, y1), new Point(x2, y2));
                }
    
                //画字符
                for (int i = 0; i < data.Length; i++)
                    data[i] = (char)myChar[r.Next(myChar.Length)];
                for (int i = 0; i < data.Length; i++)
                {
                    Font tempFont = new Font(myFont[r.Next(myFont.Length)], 18);
                    g.DrawString(data[i].ToString(), tempFont,
                        new SolidBrush(myColor[r.Next(myColor.Length)]), (float)i * 20 + 40, (float)40);
                }
     
                //画燥点
                for (int i = 0; i < 100; i++)
                {
                    int x = r.Next(myBitmap.Width);
                    int y = r.Next(myBitmap.Height);
                    Color tempColor = myColor[r.Next(myColor.Length)];
                    myBitmap.SetPixel(x, y, tempColor);
                }
    
                myBitmap.Save("c:\\photo.gif");
                thisGr.DrawImage(myBitmap, new Point(90, 35));
                myBitmap.Dispose();
                g.Dispose();
            }
    
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                thisGr.Dispose();
            }
        }
    }



  • 相关阅读:
    python 发邮件乱码
    膳魔师杯使用注意事项
    了解指针,分分钟的事情 C++筆記--指針
    海淘攻略
    【转】Cocos2dx.3x入门三部曲
    在Windows7上搭建Cocos2d-x 3.2alpha0开发环境
    黑苹果 MAC OS X 10.10.2 安装流程
    Linux 下如何查找木马并处理
    js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
    泰*网 Centos 一些命令
  • 原文地址:https://www.cnblogs.com/finlay/p/3234738.html
Copyright © 2011-2022 走看看