什麼是GDI+編程
GDI (Graphics Device Interface), 是屬於繪圖方面的 API (Application Programming Interface)。數組
由於應用程序不能直接控制硬件, 因此當咱們要進行繪圖的動做時, 必須透過 GDI 才能完成。dom
GDI+ (Graphics Device Interface) 是一種繪圖裝置接口, 可將應用程序和繪圖硬件分隔, 讓咱們可以編寫與裝置無關的應用程序。它可讓咱們不需注意特定顯示裝置的詳細數ide
據,即可在屏幕或打印機顯示信息。咱們能夠呼叫 GDI+ 類別所提供的方法, 而後這些方法會適當地呼叫特定的裝置驅動程序, 而完成繪圖。並且與.NET進行了更好的融合。函數
座標系統字體
在「GDI+」中所採用的座標系統,與平時人們較經常使用的座標系統不一樣,主要差異在於,通常的二維座標系,x軸與y軸分別是往右往上遞增(左圖),this
而「GDI+」所採用的座標系,x軸與y軸則分別是往右往下遞增(右圖)spa
圖形類所在的命名空間:code
各個命名空間的主要功能以下:orm
System.Drawing:提供了對 GDI+ 基本圖形功能的訪問的類;
System.Drawing.Imaging:提供高級 GDI+ 圖像處理功能的類;
System.Drawing.Text:提供高級 GDI+ 排版功能,該命名空間中的類容許用戶建立和使用多種字體的類。
Point 結構體
Point主要有x與y兩個屬性(表示在二維平面中定義點的整數x和y座標的有序對)。而且能夠對它進行「==」、「!=」等比較操做。
Point表示在二維平面中定義點的、x 和 y 座標的有序對
構造方法:
Point pt = new Point(10,10);
Point pt = new Point(new Size(10,10));
圖形編程中常見的類
Pen 畫筆類
它主要指定線寬和線的模式。Pen對象繪製具備指定寬度和樣式的直線和曲線。由 Pen 對象繪製的直線可用各類填充模式(包括純色和紋理)填充。
填充模式取決於Brush畫刷或用做填充對象的紋理。
建立方法:
分別能夠採用Brush、Color、及Brush、width和Color、width等參數來建立一個畫筆。
Pen myPen=new Pen(Color.Black, 3); //建立一個3個像素寬的黑色畫筆
畫筆的做用:
一般一個圖形輪廓(運用DrawXXX()方法)是用畫筆對象來實現的,
Graphics對象
它採用面向對象的封裝機制,提供將對象(圖形或文本)繪製到設備(如屏幕或打印機)的方法。
這些對象是獨立於Graphics對象的,它們爲Graphics類中的圖形方法的參數。從而簡化了圖形編程。
處理圖形包括兩個步驟
1:建立 Graphics 對象。
2:使用 Graphics 對象繪製線條和形狀、呈現文本或顯示與操做圖像。
建立 Graphics 對象的各類方法
1:經過窗體或控件的 Paint 事件中 PaintEventArgs參數來獲取對Graphics 對象的引用。
2:調用某控件或窗體的 CreateGraphics 方法來獲取對 Graphics 對象的引用,該對象表示該控件或窗體的繪圖表面。若是想在已存在的窗體或控件上繪圖,則可以使用此方法。
Paint 事件處理程序中的 PaintEventArgs
在爲控件編制 Paint 事件處理程序時,圖形對象做爲一個 PaintEventArgs 提供。所以能夠獲取對 Paint 事件的 PaintEventArgs 中 Graphics 對象的引用來實現繪圖,步驟:
1:聲明 Graphics 對象。
2:分配變量來引用做爲 PaintEventArgs 的一部分傳遞的 Graphics 對象。
3:插入代碼來繪製窗體或控件。
注:理解繪製過程當中的座標問題
CreateGraphics 方法
也可使用某控件或窗體的 CreateGraphics 方法來獲取對 Graphics 對象的引用,該對象表示該控件或窗體的繪圖表面。
1:用 CreateGraphics 方法建立 Graphics 對象
2:調用要在其上呈現圖形的窗體或控件的 CreateGraphics 方法。
例如:
Graphics g;
g = this.CreateGraphics(); //建立出控件中的Graphics對象
Graphics類經常使用的畫圖方法
畫點
DrawLine()畫線,參數爲兩個Point對象而且爲同一個點時。
注:理解在窗體或控件中 的座標系問題
畫線
DrawLine()畫線---兩個Point對象
DrawLines()畫線段(Point的數組)
畫文本
DrawString()畫文本
畫矩形(填充矩形)
DrawRectangle()畫矩形
FillRectangle()填充矩形
圖形編程中經常使用的幾個結構
Rectangle和RectangleF結構體
主要有左上角的x與y及width、height等四個屬性(存儲矩形區域的位置和大小)。而且能夠對它進行「==」、「!=」等比較操做。而RectangleF結構體表明浮點數類型。
主要的屬性以下:
Bottom:矩形底部的縱座標
Top:矩形頂部的縱座標
Left:矩形坐部的橫座標
Right:矩形右部的橫座
Height:矩形的高度
Width:矩形的寬度
Size:矩形的尺寸
IsEmpty:矩形是否爲空(高度和寬度是否都是0)
X:矩形左上角的橫座標
Y:矩形左上角的縱座標
Size和SizeF結構體:
主要有width、height兩個屬性(用寬度和高度的有序對錶示矩形區域的大小)。SizeF結構體表明浮點數類型。而且能夠實現Size到Point、Size到SizeF的轉換。
構造函數:
Size sz1 = new Size(10,10)
屬性:
Width: 表示寬度值
Height:表示高度值
Brush畫刷類
做用:它主要指定填充區域的顏色和樣式, Brush對象是一個抽象類。閉合的圖形(例如,矩形或橢圓)由輪廓和內部組成,輪廓用畫筆繪製,內部用畫刷填充。
畫刷的風格:
實心畫刷(SolidBrush,用單一顏色填充)
畫刷的建立實例:
建立一個實心畫刷SolidBrush畫刷
如:建立一個黑色的畫刷
SolidBrush drawBrush=newSolidBrush(Color.Black);
下面的示例用純紅色填充橢圓:
SolidBrush mySolidBrush = new SolidBrush(Color.Red);
myGraphics.FillEllipse(mySolidBrush, 0, 0, 60, 40);
Demo:生產簡單驗證碼
1:經過Random生成隨機數或字符及驗證碼
2:經過驗證碼內容長度生成指定大小的圖片
3:獲取生成圖片的Graphics對象
4:定義驗證碼字體格式
5:經過指定字體將驗證碼繪製到圖片
6:向圖片上添加背景噪音線
7:添加前景噪音點
1 Random r = new Random(); 2 string str = null; 3 for (int i = 0; i < 5; i++) 4 { 5 int rNumber = r.Next(0, 10); 6 str += rNumber; 7 } 8 // MessageBox.Show(str); 9 //建立GDI對象 10 Bitmap bmp = new Bitmap(150, 40); 11 Graphics g = Graphics.FromImage(bmp); 12 13 for (int i = 0; i < 5; i++) 14 { 15 Point p = new Point(i * 20, 0); 16 string[] fonts = { "微軟雅黑", "宋體", "黑體", "隸書", "仿宋" }; 17 Color[] colors = { Color.Yellow, Color.Blue, Color.Black, Color.Red, Color.Green }; 18 g.DrawString(str[i].ToString(), new Font(fonts[r.Next(0, 5)], 20, FontStyle.Bold), new SolidBrush(colors[r.Next(0, 5)]), p); 19 } 20 21 for (int i = 0; i < 20; i++) 22 { 23 Point p1 = new Point(r.Next(0, bmp.Width), r.Next(0, bmp.Height)); 24 Point p2 = new Point(r.Next(0, bmp.Width), r.Next(0, bmp.Height)); 25 g.DrawLine(new Pen(Brushes.Green), p1, p2); 26 } 27 28 for (int i = 0; i < 500; i++) 29 { 30 Point p = new Point(r.Next(0, bmp.Width), r.Next(0, bmp.Height)); 31 bmp.SetPixel(p.X, p.Y, Color.Black); 32 } 33 34 35 //將圖片鑲嵌到PictureBox中 36 pictureBox1.Image = bmp;
開發環境:Visual Studio 2010
源代碼: 連接:http://pan.baidu.com/s/1jGgzXJo 密碼:5d6a