C#程序設(shè)計及應(yīng)用教程第8章+圖形圖像處理+.ppt_第1頁
C#程序設(shè)計及應(yīng)用教程第8章+圖形圖像處理+.ppt_第2頁
C#程序設(shè)計及應(yīng)用教程第8章+圖形圖像處理+.ppt_第3頁
C#程序設(shè)計及應(yīng)用教程第8章+圖形圖像處理+.ppt_第4頁
C#程序設(shè)計及應(yīng)用教程第8章+圖形圖像處理+.ppt_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第8章 圖形圖像處理,8.1 圖形圖像基礎(chǔ)知識 8.2 繪制基本圖形 8.3 填充圖形 8.4 圖像處理 8.5 圖形與圖像的平移、旋轉(zhuǎn)與縮放 8.6 文字處理,8.1圖形圖像繪制基礎(chǔ)知識,8.1.1 GDI+概述 GDI+:Graphics Device Interface (圖形設(shè)備接口),它提供了高級圖形圖像處理功能。 在C#中,通過一套部署為托管代碼的類來展現(xiàn)提供的圖形圖像處理功能,這套類被稱為GDI+的托管類。利用GDI+的托管類可以輕松實現(xiàn)顏色漸變、透明處理、紋理處理、拉伸和縮放等多種高級功能。 GDI+主要提供了三類服務(wù): 1.二維矢量圖形處理 2.二維圖像處理 3.文字顯示,8

2、.1.1 GDI+概述(續(xù)),在C#中,所有圖形圖像處理功能都包含在以下名稱空間下: 1.System.Drawing名稱空間提供了對GDI+基本圖形功能的訪問,主要有Graphics類Bitmap類、從Brush類繼承的類、Font類、Icon類、Image類、Pen類、Color類等。 2.System.Drawing.Drawing2D名稱空間提供了高級的二維和矢量圖形處理功能。主要有:梯度型畫刷、Matrix類(用于定義幾何變換)和GraphicsPath類等。 3.System.Drawing.Imaging名稱空間 提供了高級圖像處理功能。 4.System.Drawing.Tex

3、t名稱空間 提供了高級字體和文本排版功能,8.1 .1 GDI+使用的坐標系,1. GDI+坐標系中的基本結(jié)構(gòu) Point表示某個特定位置相對于原點的水平和垂直距離。例如: Point p = new Point (1,1); Size也有兩個整型屬性來表示水平和垂直距離Width和Height。例如:Size s = new Size (5,5); Rectangle用來指定矩形的坐標,它由一個Point和一個Size組成,其中Point表示矩形左上角,Size表示矩形大小。,8.1 .1 GDI+使用的坐標系(續(xù)),例如: 1) 在構(gòu)造函數(shù)中分別指定x坐標、y坐標、寬度和高度。 Recta

4、ngle r1 = new Rectangle (1,2,5,6); 2) 在構(gòu)造函數(shù)中指定Point位置和Size結(jié)構(gòu)。 Point p = new Point (1,2); Size s = new Size (5,6); Rectangle r2 = new Rectangle (p, s);,8.1 .1 GDI+使用的坐標系(續(xù)),2.GDI+中坐標系的分類 世界坐標系(World coordinates)是一種通用的坐標系,適用于任何計算機設(shè)備。 設(shè)備坐標系(Device coordinates)是指顯示設(shè)備或打印設(shè)備使用的坐標系,它的特點是以設(shè)備上的像素點為單位。 頁面坐標系(P

5、age coordinates)是指某種映射模式下的一種坐標系。 默認情況下,世界坐標系、設(shè)備坐標系和頁面坐標系是 一致的。,8.1 .1 GDI+使用的坐標系(續(xù)),3. 不同坐標系的轉(zhuǎn)換 調(diào)用GDI+里的Graphics對象進行操作時,輸入的坐標為世界坐標系中的坐標,而在屏幕或者打印機上顯示的是設(shè)備坐標系中的坐標。因此,每次輸出時,系統(tǒng)都會自動進行兩次坐標變換第一次是從世界坐標向頁面坐標的世界變換(world transformation),第二次是從頁面坐標向設(shè)備坐標的頁面變換(page transformation)。 在程序中,可以通過調(diào)用Graphics對象的TranslateTr

6、ansform方法改變世界變換的原點,通過設(shè)置 Graphics對象的PageUnit屬性改變頁面變換的度量單位。,8.1 .1 GDI+使用的坐標系(續(xù)),【例9-1 】不同坐標系之間的轉(zhuǎn)換示例 private void Form1_Paint(object sender, PaintEventArgs e) Graphics myGraphics = e.Graphics; myGraphics.TranslateTransform(0.5F, 0.5F); myGraphics.PageUnit = GraphicsUnit.Inch; Pen myPen = new Pen(Color

7、.Black, 1 / myGraphics.DpiX); myGraphics.DrawLine(myPen, 0, 0, 2, 2); ,上面的代碼分別調(diào)用了Graphics對象的 世界變換和頁面變換,使用英寸作為度量單 位,并讓坐標系的原點距工作區(qū)左邊緣0.5 英寸、距工作區(qū)頂部0.5英寸,然后從(0,0) 到(2,2)繪制一條直線。右圖為運行效圖。,8.1.2 Graphics類,繪制圖形圖像前,首先必須創(chuàng)建Graphics對象,然后利用這個對象繪制直線、曲線、橢圓等圖形圖像。 有三種常見的創(chuàng)建Graphics對象的方法。 1.在窗體或控件的Paint事件中獲取Graphics對象。例

8、如: private void Form1_Paint() Graphics g = e.Graphics; ,8.1.2 Graphics類(續(xù)),2.通過當(dāng)前窗體的CreateGraphics方法,把當(dāng)前窗體的畫筆、字體、顏色作為默認值,獲取對Graphics對象的引用。例如: Graphics g = this.CreateGraphics(); 3. 從繼承自圖像的任何對象創(chuàng)建Graphics對象,例如: Bitmap myBitmap = new Bitmap(C:mytest1PicsmyPic.bmp); Graphics g = Graphics.FromImage(myBit

9、map);,8.1.3 顏色,顏色封裝在System.Drawing.Color結(jié)構(gòu)中。人眼可以分辨的任何顏色都是由一定的紅、綠、藍三色光組成。任何一種顏色都可以有四個分量: R:紅色,取值范圍0255,0表示沒有紅色成分,255為飽和紅色; G:綠色,取值范圍0255,0表示沒有綠色成分,255為飽和綠色; B:藍色,取值范圍0255,0表示沒有藍色成分,255為飽和藍色; A:Alpha值,即透明度,取值范圍0255,0表示完全透明,255表示完全不透明。,8.1.3 顏色(續(xù)),在代碼中聲明顏色的方式常用有兩種: 1.調(diào)用靜態(tài)方法Color.FromArgb()指定任意顏色,這種方法有兩

10、種常用形式。 第一種形式為直接指定三種顏色,方法原型為: Public static Color FromArgb (int red,int green,int blue); 三個參數(shù)分別表示R、G、B三色,Alpha值使用默認值255,即完全不透明。例如: Color red = Color.FromArgb(255, 0, 0); 第二種形式為四個參數(shù),方法原型為: Public static Color FromArgb (int alpha,int red,int green, int blue); 四個參數(shù)分別表示透明度、R、G、B三色值。,8.1.3 顏色(續(xù)),2.系統(tǒng)預(yù)定義顏色

11、 System.Drawing.Color結(jié)構(gòu)中提供了許多靜態(tài)性,每個屬性返回一個命名顏色,在Color結(jié)構(gòu)中已經(jīng)預(yù)定義了141種顏色,可以直接使用。例如: this.BackColor = Color.White;,8.1.4 Paint事件,在C#程序中,最簡單的方式就是在Paint事件中繪制圖形圖像,任何一個控件,包括窗體本身,系統(tǒng)都提供了對應(yīng)的Paint事件。 如果在控件的Paint事件中利用傳遞的參數(shù)獲取Graphics對象,則繪制的圖形圖像僅在該控件內(nèi)顯示。如果在窗體的Paint事件中繪制,則繪制的圖形圖像在該窗體內(nèi)顯示。,8.2 繪制基本圖形,8.2.1 創(chuàng)建畫筆 畫筆(Pen)

12、 畫筆可用于繪制繪制具有指定寬度和樣式的直線、曲線或輪廓形狀。 下面的示例說明如何創(chuàng)建一支基本的藍色畫筆: Pen myPen = new Pen(Color.Blue); Pen myPen = new Pen(Color.Blue, 10.5f); 也可以從畫刷對象創(chuàng)建畫筆對象,例如: SolidBrush myBrush = new SolidBrush(Color.Red); Pen myPen = new Pen(myBrush); Pen myPen = new Pen(myBrush, 5);,8.2.2 繪制直線,所有繪制圖形的方法都位于Graphics中。 DrawLine方

13、法:繪制一條直線,常用形式: 1) 繪制一條連接指定兩個Point結(jié)構(gòu)的線。 public void DrawLine (Pen pen,Point pt1, Point pt2) 其中,Pen對象確定線條的顏色、寬度和樣式; Point結(jié)構(gòu)確定起點和終點。 2) 繪制一條由坐標對指定的兩個點的線。 public void DrawLine (Pen pen,int x1, int y1,int x2,int y2) 其中,Pen對象確定線條的顏色、寬度和樣式; x1,y1為起點坐標,x2,y2為終點坐標。,8.2.2 繪制直線,在.NET框架中,有一個LineCap枚舉,該枚舉用于指定系統(tǒng)預(yù)

14、定義的線帽,例如圓形、方形、三角形、菱形、箭頭等。 在System.Drawing.Drawing2D命名空間下,有一個AdjustableArrowCap類,利用該類可以自定義箭頭線帽的形狀。 AdjustableArrowCap arrow = new AdjustableArrowCap(8, 10, false); Pen myPen = new Pen(Color.Blue, 2); myPen.CustomEndCap = arrow; Graphics類提供的TranslateTransform方法可以幫助我們實現(xiàn)平移坐標系的功能。,8.2.2 繪制直線,【例8-1】用毫米作為度

15、量單位,繪制一條數(shù)學(xué)上使用的坐標軸,即讓坐標系的原點位于窗體中心,橫向從左到右為x正方向,縱向從下到上為y軸正方向,然后在此坐標系統(tǒng)下繪制一條從(0,0)點到(20,20)的直線。 運行效果如下:,8.2.2 繪制直線,【例8-2】利用DrawLines方法和將根據(jù)正弦函數(shù)計算出來的多個點之間用直線依次相連,構(gòu)成正弦曲線顯示出來。 設(shè)計界面和運行界面如下:,8.2.3 矩形,繪制矩形的方法: public void DrawRectangle (Pen pen, Rectangle rect) 該方法根據(jù)指定的矩形結(jié)構(gòu)rect來繪制矩形。 public void DrawRectangle (

16、Pen pen, int x, int y, int width, int height) 該方法通過矩形的左上角坐標(x,y)和寬(width)、高(height)來繪制矩形。,8.2.3 矩形,【例8-3】演示矩形的繪制方法。 運行效果如下:,8.2.4 多邊形,多邊形是由3條或3條以上的邊組成的閉合圖形,例如三角形、矩形、五邊形和六邊形等都屬于多邊形。 DrawPolygon方法:繪制多邊形的輪廓 DrawPolygon方法一般用于繪制多邊形的輪廓,該方法常用形式如下: public void DrawPolygon (Pen pen, Point points),8.2.4 多邊形,【

17、例8-4】演示多邊形的繪制方法。 設(shè)計界面和運行效果如下:,8.2.5 曲線,1. DrawCurve方法用光滑的曲線把給定的點連接起來,常用形式有: 1) public void DrawCurve (Pen pen ,Point points ) 其中,Point結(jié)構(gòu)類型的數(shù)組中指明各節(jié)點,默認彎曲強度為0.5。注意,數(shù)組中至少要有3個元素。 2) public void DrawCurve (Pen pen ,Point points,float tension ) 其中,tension指定彎曲強度,該值范圍為0.0f-1.0f,超出此范圍會產(chǎn)生異常。當(dāng)彎曲強度為零時,就是直線。,8.2

18、.5 曲線(續(xù)),2. DrawClosedCurve方法 通過連接數(shù)組中節(jié)點畫一個平滑的曲線,此方法會自動把首尾節(jié)點連接起來構(gòu)成封閉曲線。注意數(shù)組中的節(jié)點至少要有3個點組成,默認彎曲強度為0.5。 1) public void DrawClosedCurve (Pen pen ,Point points ) 其中,Point結(jié)構(gòu)類型的數(shù)組中指明各節(jié)點。 2) public void DrawClosedCurve (Pen pen ,Point points,float tension FillMode fillmode) 其中,fillmode指明曲線封閉區(qū)域內(nèi)以何種方式填充。,8.2.5

19、 曲線(續(xù)),3. 貝塞爾曲線 每段貝塞爾曲線由4個點組成,兩個端點(p1為起點,p2為終點)和兩個控制點(c1和c2)。曲線不經(jīng)過控制點,但是控制點如同一個磁體吸引曲線,影響并引導(dǎo)曲線向某個方向拉伸。,8.2.5 曲線(續(xù)),1) DrawBezier方法:繪制一段貝塞爾曲線的,常用形式: public void DrawBezier (Pen pen ,Point pt1,Point pt2,Point pt3,Point pt4 ) 其中pt1、pt2、pt3和pt4分別指定四個點。 2) DrawBeziers方法:繪制多段貝塞爾曲線,常用形式: public void DrawBez

20、ier (Pen pen ,Point points) 其中points是Point結(jié)構(gòu)的數(shù)組,第一段貝塞爾曲線由點數(shù)組中的第1-4個點繪制而成。以后每段曲線只需要3個點:2個控制點和一個結(jié)束點。前一段曲線的結(jié)束點會自動被用作后一段曲線的起始點。,8.2.5 曲線(續(xù)),【例8-5 】繪制曲線示例。,8.2.6 繪制橢圓和扇形,1. 繪制橢圓(DrawEllipse方法) 1)給定橢圓左上角坐標和橢圓的外接矩形的寬度和高度 public void DrawEllipse(Pen pen, int x, int y, int width, int height); 其中, pen為Pen對象,

21、x, y為橢圓左上角的坐標, width定義橢圓外接矩形的寬度, height定義橢圓外接矩形的高度。 2)給定橢圓外接矩形的結(jié)構(gòu) public void DrawEllipse(Pen pen, Rectangle rect); 其中,rect為Rectangle結(jié)構(gòu),用于確定橢圓的邊界。,8.2.6 繪制橢圓和扇形,2. 繪制扇形(DrawPie方法) 1) public void Drawpie(Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle); 其中, pen為Pen對象, x,

22、y為橢圓左上角的坐標, width定義扇形外接矩形的寬度, height定義扇形外接矩形的高度, startAngle為起始角度(以度為單位), sweepAngle為延伸角度。 2) public void DrawPie(Pen pen, Rectangle rect, float startAngle, float sweepAngle); 其中,rect為Rectangle結(jié)構(gòu),用于確定扇形的外接矩形。,8.2.6 繪制橢圓和扇形,【例8-6】演示橢圓和扇形的繪制方法。 運行效果如下:,8.3 填充圖形,對于封閉的圖形來說,除了用與其對應(yīng)的Draw方法繪制以外,每個封閉圖形都有其對應(yīng)的

23、以“Fill”為前綴的方法,例如與橢圓對應(yīng)的填充方法為FillEllipse方法,與多邊形對應(yīng)的填充方法為FillPolygon方法等。,8.3.1 畫刷(續(xù)),畫刷(Brush)畫刷是可以與Graphics對象一起使用來創(chuàng)建實心形狀和呈現(xiàn)文本的對象??梢杂脕硖畛涓鞣N圖形形狀,如矩形、橢圓、餅型圖和多邊形等。下表列出了幾種不同類型的畫刷。,8.3.2 單色畫刷,1)使用SolidBrush類定義單色畫刷 SolidBrush類用于定義單色畫刷。該類可以填充圖形,比如矩形、橢圓、多邊形和路徑。 例如: SolidBrush solidBrush = new SolidBrush(Color.Re

24、d); Rectangle r = new Rectangle(5, 10, 100, 100); g.FillEllipse(solidBrush, r);,8.3.2 單色畫刷,【例8-7】單色畫刷演示示例。,運行結(jié)果如右圖所示:,8.3.3 創(chuàng)建漸變畫刷(續(xù)),2)使用LinearGradientBrush類定義線性漸變 LinearGradientBrush對象用顏色線性漸變填充圖形。提供了以下三種構(gòu)造函數(shù): (1) 提供兩個點和兩種顏色。 Public LinearGradientBrush ( Point point1, Point point2, Color color1, Co

25、lor color2) (2) 提供一個矩形和一個角度。 Public LinearGradientBrush (Rectangle rect ,Color color1,Color color2,float angle) (3) 指定漸變的模式。 Public LinearGradientBrush (Rectangle rect ,Color color1,Color color2,LinearGradientMode linearGradientMode),8.3.3 漸變畫刷(續(xù)),【例8-8 】顏色漸變效果。 運行效果:,8.3.4 填充陰影,3)使用HatchBrush類填充簡單圖

26、案 HatchBrush類提供的畫刷可以用各種圖案填充圖形。通過 Hatch類型可以設(shè)置影線樣式。在創(chuàng)建影線的畫刷時,能設(shè)定前 景色、背景色和影線樣式。有56種不同的影線樣式枚舉,該枚舉 可以參看System.Drawing.Drawing2D.HatchStyle枚舉。 例如: HatchStyle.Horizontal水平線的圖案 HatchStyle.ForwardDiagonal從左上到右下的對角線的線條圖案 HatchStyle.DiagonalBrick 具有分層磚塊外觀的陰影 HatchStyle.Shingle 帶有對角分層鵝卵石外觀的陰影 HatchStyle.Sphere具

27、有球體彼此相鄰放置的外觀的陰影,8.3.4 填充陰影,【例8-9】陰影效果示例。 效果如下:,8.3.5 填充紋理,4)使用TextureBrush類填充復(fù)雜圖像TextureBrush類使用圖像作為填充的樣式,它可以使用例如.bmp、.jpg、.png等格式的圖像。初始化一個新的TextureBrush對象需要指定填充的圖像。 TextureBrush類有多個重載的構(gòu)造函數(shù),常用有: public TextureBrush (Image image, Rectangle rect) public TextureBrush (Image image,WrapMode wrapMode, Rec

28、tangle rect) 其中,image指定要填充的圖像;rect指定圖像的矩形塊;wrapMode指定如何填充圖像,這是一個枚舉類型,其值如表8-2所示。,8.3.5 填充紋理,【例8-10】創(chuàng)建TextureBrush示例。 運行效果如下:,8.3.6 填充路徑,5)使用PathGradientBrush類實現(xiàn)彩色漸變 1GraphicsPath類 GraphicsPath類用于創(chuàng)建路徑。利用GraphicsPath類,可以繪制形狀的輪廓、填充形狀內(nèi)部和創(chuàng)建剪輯區(qū)域。下面的代碼創(chuàng)建一個路徑并在路徑中添加一個橢圓。 GraphicsPath path = new GraphicsPath(

29、); path.AddEllipse(this.ClientRectangle); 2PathGradientBrush類 PathGradientBrush稱為路徑漸變畫刷,路徑漸變畫刷用于從中心向四周通過顏色漸變來填充路徑的內(nèi)部區(qū)域。,8.3.6 填充路徑,【例8-11】路徑和路徑畫刷的使用示例。 運行效果:,8.4 圖像處理,對圖像的處理主要有:從文件或其他地方加載圖像或創(chuàng)建一個新的圖像、顯示圖像、修改圖像、把內(nèi)存中的圖像保存到文件或其他存儲器中。,8.4 .1 圖像的繪制,1. 圖像的顯示 GDI+提供了兩個類用來表示圖像:Bitmap類和Metafile類。 從文件中讀取一個位圖并在

30、屏幕中顯示出此圖像需要三個步驟: 創(chuàng)建一個Bitmap對象指明要顯示的圖像文件; 創(chuàng)建一個Graphics對象表明要使用繪圖平面; 通過調(diào)用Graphics對象的DrawImage方法顯示圖像。,8.4 .1 圖像的繪制,1) 創(chuàng)建Bitmap對象 Bitmap類有很多重載的構(gòu)造函數(shù),其中常用的有: Public Bitmap(string filename) 其中filename是圖像文件的名字。可以利用該構(gòu)造函數(shù)創(chuàng)建Bitmap對象。例如: Bitmap bitmap = new Bitmap(filename.jpg); 2) DrawImage方法 Graphics類的DrawImag

31、e方法用于在指定位置顯示原始圖像或 者縮放后的圖像。該方法的重載形式也非常多,其中常用的一種 為: Public void DrawImage(Image image,int x,int y,int width, int height) 該方法在(x,y)位置點按指定的大小顯示圖像。利用此方法可以 直接顯示縮放后的圖像。,8.4 .1 圖像的繪制,【例8-12 】圖像繪制功能。 運行效果:,8.4.2 圖像的保存,1.在窗體上繪制出圖形或圖像后,利用Image對象的Save方法可以將繪制的內(nèi)容保存到文件中。 2.Save方法有多種重載形式,常用形式為 public void Save(string filename, ImageFormat format ) 其中,fileName為所要保存的文件名。format為保存的圖像類型,圖像類型由I

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論