C# 《WinForm程序設計與實踐》 第9章 GDI+

9 GDI+

 

9.1 GDI+概述

GDI(Graphic Device Interface,圖像設備接口)是早期Windows操作系統的一個可執行,位於C:\\Windows\System32文件夾中,文件名爲GDI.exe。GDI+ 是GDI的升級版本,提供了各種豐富的圖形圖像處理功能,統一在.Net Framework中封裝和定義。

 

在.Net Framework中,GDI+ 被封裝在如下幾個命名空間中。

(1)System.Drawing: 提供了對GDI+基本圖形功能的訪問,其中Graphics類是整個GDI+的核心,能夠繪製線條、曲線、圖形、圖像文本的畫面。其他類需要和Graphics類配合使用。在System.Drawing中,常見的類與結構如下表所示:

表9-1 GDI+常用的類與結構說明

類或結構

說明

Graphics

封裝一個GDI+繪圖圖面

Bitmap

封裝GDI+位圖,用於處理由像素數據定義的圖像的功能

Brush

用於創建畫筆對象,以填充圖形的內部

Font

定義特定的文本格式,包括字體、字號和字形屬性

Pen

定義用於繪製直線曲線的鋼筆對象

Region

指示由矩形和由路徑構成的圖形形狀的內部

SolidBrush

定義單色畫筆

StringFormat

封裝文本佈局信息、顯示操作和OpenType功能

Color

表示一種ARGB顏色(alpha、紅色、綠色、藍色)

Point

表示在二維平面中定義點的整數x和y座標的有序對

PointF

表示在二維平面中定義點的浮點x和y座標的有序對

Rectangle

存儲一組整數,共4個,表示一個矩形的位置和大小

Size

存儲一個有序整數對,通常爲矩形的寬度和高度

SizeF

存儲有序浮點數對,通常爲矩陣的寬度和高度

ARGB與RGB、RGBA的區別

https://blog.csdn.net/caption_deng/article/details/52366907 

(2) System.Drawing.Drawing2D: 提供了高級的二維和矢量圖形功能,主要有梯度型畫刷、Matirx類和GraphicsPath類等。

(3) System.Drawing.Image: 提供了高級GDI+圖形處理功能。

(4) System.Drawing.Text: 提供了高級GDI+字體和文本排版功能。

 

 

Windows操作系統的GDI+服務分爲以下3個主要部分

(1) 二維矢量圖形

矢量圖形由圖元(如線條、曲線和圖形)組成,它們由一系列座標系統的點集組成。GDI+提供了用於存儲這些圖元本身信息的類或結構體,也提供了繪製圖元的類。例如,Rectangle結構體存儲了一個矩形的尺寸位置;Pen類存儲線條顏色、線條寬度,以及線條樣式等信息;Graphics類提供繪製線條、矩形、路徑和其它圖形的方法;而Brush類存儲了在閉合圖形內部填充顏色和圖案的信息。

(2) 圖形處理

有些圖片很難用矢量圖形表示,這種類型的圖像採用位圖進行存儲,即由表示屏幕上獨立點顏色的數字型數組所組成。GDI+中提供了若干種類,可實現快速存取和顯示。例如,CachedBitmap類可用於存儲一張緩存在內存中的圖片。

(3) 圖文混排

圖文混排是文字處理或繪圖軟件的基礎功能,關係到文字以何種字體、尺寸和樣式在繪圖區域中的具體顯示和控制,GDI+爲這種複雜的任務提供廣泛的支持。

 

9.2 繪圖對

在圖像處理中,繪圖位置控制對象Point、Size、Rectangle和顏色控制對象Color等是必須要使用的。

1.Point結構

代表着座標系統中的一個點,由座標值x和y共同組成。

2.Size結構

代表一個矩形區域的尺寸。

3.Recently結構

代表一個矩形。

4.Color結構

顏色是進行圖形操作的基本要素,任何一種顏色都可以由4個分量決定,每個分量佔據一個字節。

A: Alpha值,即透明度,取值範圍爲0~255,0爲完全透明,255爲完全不透明。

R: 紅色,取值範圍爲0~255,255爲飽和紅色。

G: 綠色,取值範圍爲0~255,255爲飽和綠色。

B: 藍色,取值範圍爲0~255,255爲飽和藍色。

5.Font

Font類用於指示繪製過程中所使用的字體。

6.Graphics

要進行圖形處理,必須首先創建Graphics對象然後才能利用它進行各種畫圖操作

 

9.3 基本繪圖工具

繪圖的基本工具包括Pen和Brush,在GDI+中,可以使用Pen對象和Brush對象程序圖形、文本和圖像。Pen類的實例用於繪製線條和空心形狀Brush類派生的任何類的實例用於填充形狀或繪製文本

 

9.3.1 Pen

Pen可用於繪製具有指定寬度和樣式的線條、曲線以及勾勒形狀輪廓。

表 Pen類常用屬性說明

屬性

說明

Color

獲取或設置通過Pen類的對象繪製的直線的顏色

DashStyle

獲取或設置通過Pen類的對象繪製的虛線的樣式

DashPattern

獲取或設置對自定義虛線的空白區域和長度進行定義的浮點值數組

PenType

只讀屬性,檢索通過Pen類對象繪製的直線的樣式

StartCap

獲取或設置LineCap枚舉值,該值指定了通過Pen對象繪製的直線起點樣式

EndCap

獲取或設置LineCap枚舉值,該值指定了通過Pen對象繪製的直線終點樣式

 

9.3.2 Brush

Brush類是一個抽象的類,在GDI+中提供的5個類,擴展了Brush類並提供了具體的實現方式,如表所示:

表 Brush類的擴展類

說明

SolidBrush

使用純顏色填充圖形

TextureBrush

使用基於光柵的圖像填充圖形

LinearGradientBrush

使用顏色漸變填充圖形

PathGradientBrush

使用漸變色填充圖形,漸變方向是從有路徑定義的圖形邊界指向圖形的中心

HatchBrush

使用各種圖案填充圖形

 

運行結果:

代碼:

1 VS2015 新建一個WindowsFormsApplication工程,

2 在Form1.cs中,添加如下控件:

表 窗體及控件屬性設置

窗體和控件

屬性

屬性值

Form1

Text

驗證碼

pictureBox1

Name

pictureBoxCode

textBox1

Name

txtCode

button1

Name

btnCheck

Text

驗證

3 鼠標右擊Form1.cs 找到對應的代碼工程,代碼部分參考如下代碼:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

 

//功能 : 驗證碼的生成與匹配

namespace WinFormsVerificationCode

{

    public partial class Form1 : Form

    {

        //在主窗體中定全局

        string randomCode = string.Empty;

 

        //方法:生成隨機字符串

        private string CreateRandomCode(int codeCount)

        {

            string randomCode = "";

            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,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[] allCharArray = allchar.Split(',');//分割 生成子串

            Random rand = new Random();

            for (int i = 0; i < codeCount; i++)

            {

                //生成隨機數 且 隨機數<=allCharArray.Length

                randomCode += allCharArray[rand.Next(allCharArray.Length)].ToString();

            }

            return randomCode;

        }

 

        //方法:生成驗證碼圖

        private Bitmap CreateImage(string code, int fontSize, string font, Color foreColor, Color bgColor)

        {

            int imageWidth = (code.Length * fontSize) + 40;//

            int imageHeight = fontSize * 2 + 10;//片高度

            Bitmap image = new Bitmap(imageWidth, imageHeight);//生成片框

 

            Graphics g = Graphics.FromImage(image);

            g.Clear(bgColor);

 

            Font f = new Font(font, fontSize, FontStyle.Bold);

            //使用指定的畫筆和字體象在指定位置制指定的文本字符串。

            g.DrawString(code, f, new SolidBrush(ForeColor), 1, 1);//驗證碼

 

            Random rnd = new Random();

            //背景添加隨機生成的燥點

            for (int i = 0; i < 100; i++)

            {

                int x = rnd.Next(imageWidth);

                int y = rnd.Next(imageHeight);

                g.FillRectangle(new SolidBrush(Color.FromArgb(rnd.Next())), x, y, 2, 2);

            }

            //背景添加隨機生成的幹擾線

            for (int i = 0; i < 50; i++)

            {

                int x1 = rnd.Next(imageWidth);

                int x2 = rnd.Next(imageWidth);

                int y1 = rnd.Next(imageHeight);

                int y2 = rnd.Next(imageHeight);

                g.DrawLine(new Pen(Color.FromArgb(rnd.Next()), 2), x1, y1, x2, y2);

            }

            return image;

        }

 

        //方法:刷新驗證碼

        private void freshCode()

        {

            randomCode = CreateRandomCode(5);

            pictureBoxCode.Image = CreateImage(randomCode, 35, "宋體", Color.Blue, Color.White);

        }

 

        public Form1()

        {

            InitializeComponent();

        }

 

        //事件理程序

        private void btnCheck_Click(object sender, EventArgs e)

        {

            if (randomCode.ToUpper() != txtCode.Text.ToUpper())

            {

                MessageBox.Show("驗證碼輸錯誤重新出!");

                txtCode.Text = "";

                freshCode();

            }

            else

            {

                MessageBox.Show("恭喜,驗證碼輸入正確!");

            }

        }

 

        //窗體加事件理程序

        private void Form1_Load(object sender, EventArgs e)

        {

            freshCode();

        }

    }

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章