GDI+(一):GDI+ 繪圖基礎


一、GDI+繪圖基礎

編寫圖形程序時需要使用GDI(Graphics Device Interface,圖形設備接口),從程序設計的角度看,GDI包括兩部分:一部分是GDI對象,另一部分是GDI函數。GDI對象定義了GDI函數使用的工具和環境變量,而GDI函數使用GDI對象繪制各種圖形,在C#中,進行圖形程序編寫時用到的是GDI+(Graphice Device Interface Plus圖形設備接口)版本,GDI+是GDI的進一步擴展,它使我們編程更加方便。

1.1 GDI+概述

GDI+是微軟在Windows 2000以后操作系統中提供的新的圖形設備接口,其通過一套部署為托管代碼的類來展現,這套類被稱為GDI+的“托管類接口”,GDI+主要提供了以下三類服務: 
(1)二維矢量圖形:GDI+提供了存儲圖形基元自身信息的類(或結構體)、存儲圖形基元繪制方式信息的類以及實際進行繪制的類。
(2)圖像處理:大多數圖片都難以划定為直線和曲線的集合,無法使用二維矢量圖形方式進行處理。因此,GDI+為我們提供了Bitmap、Image等類,它們可用於顯示、操作和保存BMP、JPG、GIF等圖像格式。
(3)文字顯示:GDI+支持使用各種字體、字號和樣式來顯示文本。
我們要進行圖形編程,就必須先講解Graphics類,同時我們還必須掌握Pen、Brush和Rectangle這幾種類。GDI+比GDI優越主要表現在兩個方面:第(一)GDI+通過提供新功能(例如:漸變畫筆和alpha混合)擴展了GDI的功能;第(二)修訂了編程模型,使圖形編程更加簡易靈活。

1.2 Graphics類
  
   Graphics類封裝一個GDI+繪圖圖面,提供將對象繪制到顯示設備的方法,Graphics與特定的設備上下文關聯。畫圖方法都被包括在Graphics類中,在畫任何對象(例如:Circle,Rectangle)時,我們首先要創建一個Graphics類實例,這個實例相當於建立了一塊畫布,有了畫布才可以用各種畫圖方法進行繪圖。
  繪圖程序的設計過程一般分為兩個步驟:
  (一)創建Graphics對象;
  (二)使用Graphics對象的方法繪圖、顯示文本或處理圖像。
  通常我們使用下述三種方法來創建一個Graphics對象。
  方法一、利用控件或窗體的Paint事件中的PainEventArgs在窗體或控件的Paint事件中接收對圖形對象的引用,作為PaintEventArgs (PaintEventArgs指定繪制控件所用的Graphics)的一部分,在為控件創建繪制代碼時,通常會使用此方法來獲取對圖形對象的引用。
例如:
//窗體的Paint事件的響應方法
private void form1_Paint(object sender, PaintEventArgs e) 

    Graphics g = e.Graphics; 

也可以直接重載控件或窗體的OnPaint方法,具體代碼如下所示:
protected override void OnPaint(PaintEventArgs e)  

    Graphics g = e.Graphics; 
}
Paint事件在重繪控件時發生。 
方法二、調用某控件或窗體的CreateGraphics方法
調用某控件或窗體的CreateGraphics方法以獲取對Graphics對象的引用,該對象表示該控件或窗體的繪圖圖面。如果想在已存在的窗體或控件上繪圖,通常會使用此方法。
例如:
Graphics g = this.CreateGraphics(); 
方法三、調用Graphics類的FromImage靜態方法
由從Image繼承的任何對象創建Graphics對象。在需要更改已存在的圖像時,通常會使用此方法。
例如:
//名為“g1.jpg”的圖片位於當前路徑下
Image img = Image.FromFile("g1.jpg");//建立Image對象
Graphics g = Graphics.FromImage(img);//創建Graphics對象

1.Graphics類的方法成員
有了一個Graphics的對象引用后,就可以利用該對象的成員進行各種各樣圖形的繪制,表1列出了Graphics類的常用方法成員。

名稱 說明
  DrawArc 
畫弧。
DrawBezier 畫立體的貝爾塞曲線。
DrawBeziers 畫連續立體的貝爾塞曲線。
DrawClosedCurve 畫閉合曲線。
DrawCurve 畫曲線。
DrawEllipse 畫橢圓。
DrawImage 畫圖像。
DrawLine 畫線。
DrawPath 通過路徑畫線和曲線。
DrawPie 畫餅形。
DrawPolygon 畫多邊形。
DrawRectangle 畫矩形。
DrawString  繪制文字。
FillEllipse 填充橢圓。
FillPath 填充路徑。
FillPie 填充餅圖。
FillPolygon 填充多邊形。
FillRectangle 填充矩形。
FillRectangles 填充矩形組。
FillRegion 填充區域。

在.NET中,GDI+的所有繪圖功能都包括在System、System.Drawing、System.Drawing.Imaging、System.Drawing.Darwing2D和System.Drawing.Text等命名空間中,因此在開始用GDI+類之前,需要先引用相應的命名空間。
2.引用命名空間
在C#應用程序中使用using命令已用給定的命名空間或類,下面是一個C#應用程序引用命名空間的例子:
using System; 
using System.Collections.Generic; 
using System.Data; 
using System.ComponentModel; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
using System.Drawing.Imaging;

1.3 常用畫圖對象

在創建了Graphics對象后,就可以用它開始繪圖了,可以畫線、填充圖形、顯示 
文本等等,其中主要用到的對象還有: Color:用來用patterns、colors或者bitmaps進行填充。
Pen:用來畫線和多邊形,包括矩形、圓和餅形。
Font:用來給文字設置字體格式。
Brush:用來描述顏色。
Rectangle:矩形結構通常用來在窗體上畫矩形。
Point:描述一對有序的x,y兩個坐標值。

1.Pen類
Pen用來繪制指定寬度和樣式的直線。使用DashStyle屬性繪制幾種虛線,可以使用各種填充樣式(包括純色和紋理)來填充Pen繪制的直線,填充模式取決於畫筆或用作填充對象的紋理。
使用畫筆時,需要先實例化一個畫筆對象,主要有以下幾種方法。
用指定的顏色實例化一只畫筆的方法如下:
public Pen(Color);
用指定的畫刷實例化一只畫筆的方法如下:
  public Pen(Brush);
用指定的畫刷和寬度實例化一只畫筆的方法如下:
public Pen(Brush, float); 
用指定的顏色和寬度實例化一只畫筆的方法如下:
public Pen(Color, float); 
實例化畫筆的語句格式如下:
Pen pn=new Pen(Color.Blue);
或者
Pen pn=new Pen(Color.Blue,100);

Pen常用的屬性有以下幾個,如下表所示:

名稱 說明
Alignment 獲得或者設置畫筆的對齊方式。
Brush 獲得或者設置畫筆的屬性。
Color 獲得或者設置畫筆的顏色。
Width 獲得或者設置畫筆的寬度。

2.Color類

在自然界中,顏色大都由透明度(A)和三基色(R,G,B)所組成。在GDI+中,通過Color結構封裝對顏色的定義,Color結構中,除了提供(A,R,G,B)以外,還提供許多系統定義的顏色,如Pink(粉顏色),另外,還提供許多靜態成員,用於對顏色進行操作。Color結構的基本屬性如下表所示:

名稱 說明
A

獲取此Color結構的alpha分量值,取值(0~255)。

R 獲取此Color結構的紅色分量值,取值(0~255)。
G 獲取此Color結構的綠色分量值,取值(0~255)。
B 獲取此Color結構的藍色分量值,取值(0~255)。
Name 獲取此Color結構的名稱,這將返回用戶定義的顏色的名稱或已知顏色的名稱(如果該顏色是從某個名稱創建的),對於自定義的顏色,將返回RGB值。

Color類的基本(靜態)方法如下表所示:

名稱 說明
FromArgb 從四個8位ARGB分量(alpha、紅色、綠色和藍色)值創建Color對象。
FromKnowColor 從指定的預定義顏色創建一個Color對象。
FromName 從預定義顏色的指定名稱創建一個Color對象。

Color類的對象可以通過已有顏色構造,也可以通過RGB建立,例如:
Color clr1 = Color.FromArgb(122,25,255);
Color clr2 = Color.FromKnowColor(KnowColor.Brown);//KnownColor為枚舉類型
Color clr3 = Color.FromName("SlateBlue");

在圖像處理中一般需要獲取或設置像素的顏色值,獲取一幅圖像的某個像素顏色值的具體步驟如下:
(1)定義Bitmap
Bitmap myBitmap = new Bitmap("c:\\MyImages\\TestImage.bmp");
(2)定義一個顏色變量把在指定位置所取得的像素值存入顏色變量中
Color c = new Color();
c = myBitmap.GetPixel(10,10);//獲取此Bitmap中指定像素的顏色。
(3)將顏色值分解出單色分量值
int r,g,b; 
r= c.R; 
g=c.G; 
b=c.B;

3.Font類

Font類定義特定文本格式,包括字體、字號和字形屬性。Font類的常用構造函數是public Font(string字體名,float字號,FontStyle字形),其中字號和字體為可選項和public Font(string字體名,float 字號),其中“字體名”為Font的FontFamily的字符串表示形式。下面是定義一個Font對象的例子代碼:
FontFamily fontFamily = new FontFamily("Arial"); 
Font font = new Font(fontFamily,16,FontStyle.Regular,GraphicsUnit.Pixel);

字體常用屬性如下表所示:

名稱 說明
Bold  是否為粗體。
FontFamily 字體成員。
Height  字體高。
Italic 是否為斜體。
Name 字體名稱。
Size  字體尺寸。
SizeInPoints 

獲取此Font對象的字號,以磅為單位。

Strikeout 是否有刪除線。
Style  字體類型。
Underline 是否有下划線。
Unit 字體尺寸單位。

4.Brush類

Brush類是一個抽象的基類,因此它不能被實例化,我們總是用它的派生類進行實例化一個畫刷對象,當我們對圖形內部進行填充操作時就會用到畫刷。

5.Rectangle類

存儲一組整數,共四個,表示一個矩形的位置和大小。矩形結構通常用來在窗體上畫矩形,除了利用它的構造函數構造矩形對象外,還可以使用Rectangle結構的屬性成員,其屬性成員如下表所示:

名稱 說明
Bottom  底端坐標
Height  矩形高
IsEmpty

測試矩形寬和高是否為0 

Left  矩形左邊坐標
Location

矩形的位置

Right 

矩形右邊坐標

Size 

矩形尺寸

Top  矩形頂端坐標
Width 矩形寬

矩形左上角頂點X坐標

Y

矩形左上角頂點Y坐標

Retangle結構的構造函數有以下兩個:
1、用指定的位置和大小初始化Rectangle類的新實例。
public Retangle(Point,Size);//Size結構存儲一個有序整數對,通常為矩形的寬度和高度。
2、使用矩形4個點的坐標初始化Rectangle類的新實例。
public Rectangle(int,int,int,int);

6.Point類

用指定坐標初始化Point類的新實例。這個結構很像C++中的Point結構,它描述了一對有序的x,y兩個坐標值,其構造函數為:public Point(int x,int y);其中x為該點的水平位置;y為該點的水垂直位置。
下面是構造Point對象的例子代碼: 
Point pt1=new Point(30,30); 
Point pt2=new Point(110,100);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM