第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();
}
}
}