Home [C# 筆記]使用 GDI+ 繪製驗証碼 3
Post
Cancel

[C# 筆記]使用 GDI+ 繪製驗証碼 3

點擊更換驗証碼

  • 畫圖片 Picture Box
  • 隨機數字 Random

Steps:

  1. 產生隨機數
  2. 畫隨機碼數字
    • 通過循環,將隨機數一個一個畫在圖片上(將隨機數字放到圖片上)
    • 畫的時候,每個數字要有水平間隔
    • 在畫字串時,字體、顏色都要隨機的給
  3. 畫線條掩飾
    • 畫線的時候,要符合圖片的大小,不能超過
  4. 給圖片畫顆粒
    • 畫顆粒的時候,要符合圖片的大小,不能超過
  5. 將圖片嵌入到PictureBox裡

繪製驗証碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
namespace 使用GDI繪製驗証碼
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 點擊更換驗証碼
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pictureBox1_Click(object sender, EventArgs e)
        {
            //創建產生隨機數的物件
            Random r = new Random();

            //產生4個隨機字串
            string? str = null;
            for (int i = 0; i < 5; i++)
            {
                str += r.Next(0, 10);//0-9
            }

            //畫圖片(要畫圖就要產生GDI物件)
            //創建GDI物件
            Bitmap bmp = new Bitmap(150, 50); //所有圖片在默認情況下,都是bitmap點陣圖
            Graphics g = Graphics.FromImage(bmp);

            //畫數字-把產生的字串放到bmp圖片上
            for (int i = 0; i < 5; i++)
            {
                //定義隨機的字體和顏色
                string[] fonts = { "微軟雅體", "宋體", "黑體", "仿宋", "細明" };
                Color[] colors = { Color.Red, Color.Black, Color.Blue, Color.Green, Color.Gray };

                //畫文本
                Point point = new Point(i * 20, 0);//x=i*10要給每個數有間距,y=0代表在同一個水平上
                g.DrawString(str[i].ToString(), new Font(fonts[r.Next(0, 5)], 15, FontStyle.Bold), new SolidBrush(colors[r.Next(0, 5)]), point);
            }

            //畫線畫點
            for (int i = 0; i < 20; i++)
            {
                //點不能超過Bitmap範圍
                Point p1 = new Point(r.Next(0, bmp.Width), r.Next(0, bmp.Height));
                Point p2 = new Point(r.Next(0, bmp.Width), r.Next(0, bmp.Height));
                g.DrawLine(new Pen(Brushes.Green), p1, p2);
            }

            //畫顆粒-圖片給點像素(給點)
            for (int i = 0; i < 500; i++)
            {
                Point p = new Point(r.Next(0, bmp.Width), r.Next(0, bmp.Height));
                bmp.SetPixel(p.X, p.Y, Color.Black);
            }

            //圖片嵌入PictureBox中
            pictureBox1.Image = bmp;
        }
    }
}
This post is licensed under CC BY 4.0 by the author.