C#_GDI+編程教程.doc_第1頁
C#_GDI+編程教程.doc_第2頁
C#_GDI+編程教程.doc_第3頁
C#_GDI+編程教程.doc_第4頁
C#_GDI+編程教程.doc_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

_C#圖形圖像編程基礎本次課程主要介紹使用C#進行圖形圖像編程基礎,其中包括GDI+繪圖基礎、C#圖像處理基礎以及簡單的圖像處理技術。1 GDI+繪圖基礎編寫圖形程序時需要使用GDI(Graphics Device Interface,圖形設備接口),從程序設計的角度看,GDI包括兩部分:一部分是GDI對象,另一部分是GDI函數(shù)。GDI對象定義了GDI函數(shù)使用的工具和環(huán)境變量,而GDI函數(shù)使用GDI對象繪制各種圖形,在C#中,進行圖形程序編寫時用到的是GDI+(Graphice Device Interface Plus圖形設備接口)版本,GDI+是GDI的進一步擴展,它使我們編程更加方便。1.1 GDI+概述GDI+是微軟在Windows 2000以后操作系統(tǒng)中提供的新的圖形設備接口,其通過一套部署為托管代碼的類來展現(xiàn),這套類被稱為GDI+的“托管類接口”,GDI+主要提供了以下三類服務:(1) 二維矢量圖形:GDI+提供了存儲圖形基元自身信息的類(或結構體)、存儲圖形基元繪制方式信息的類以及實際進行繪制的類。(2) 圖像處理:大多數(shù)圖片都難以劃定為直線和曲線的集合,無法使用二維矢量圖形方式進行處理。因此,GDI+為我們提供了Bitmap、Image等類,它們可用于顯示、操作和保存BMP、JPG、GIF等圖像格式。(3) 文字顯示:GDI+支持使用各種字體、字號和樣式來顯示文本。我們要進行圖形編程,就必須先講解Graphics類,同時我們還必須掌握Pen、Brush和Rectangle這幾種類。GDI+比GDI優(yōu)越主要表現(xiàn)在兩個方面:第(一)GDI+通過提供新功能(例如:漸變畫筆和alpha混合)擴展了GDI的功能;第(二)修訂了編程模型,使圖形編程更加簡易靈活。1.2 Graphics類Graphics類封裝一個GDI+繪圖圖面,提供將對象繪制到顯示設備的方法,Graphics與特定的設備上下文關聯(lián)。畫圖方法都被包括在Graphics類中,在畫任何對象(例如:Circle,Rectangle)時,我們首先要創(chuàng)建一個Graphics類實例,這個實例相當于建立了一塊畫布,有了畫布才可以用各種畫圖方法進行繪圖。繪圖程序的設計過程一般分為兩個步驟:(一)創(chuàng)建Graphics對象;(二)使用Graphics對象的方法繪圖、顯示文本或處理圖像。通常我們使用下述三種方法來創(chuàng)建一個Graphics對象。方法一、利用控件或窗體的Paint事件中的PainEventArgs在窗體或控件的Paint事件中接收對圖形對象的引用,作為PaintEventArgs(PaintEventArgs指定繪制控件所用的Graphics)的一部分,在為控件創(chuàng)建繪制代碼時,通常會使用此方法來獲取對圖形對象的引用。例如:/窗體的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事件在重繪控件時發(fā)生。方法二、調用某控件或窗體的CreateGraphics方法調用某控件或窗體的CreateGraphics方法以獲取對Graphics對象的引用,該對象表示該控件或窗體的繪圖圖面。如果想在已存在的窗體或控件上繪圖,通常會使用此方法。例如:Graphics g = this.CreateGraphics();方法三、調用Graphics類的FromImage靜態(tài)方法由從Image繼承的任何對象創(chuàng)建Graphics對象。在需要更改已存在的圖像時,通常會使用此方法。例如:/名為“g1.jpg”的圖片位于當前路徑下Image img = Image.FromFile(g1.jpg);/建立Image對象Graphics g = Graphics.FromImage(img);/創(chuàng)建Graphics對象Graphics類的方法成員有了一個Graphics的對象引用后,就可以利用該對象的成員進行各種各樣圖形的繪制,表7.1列出了Graphics類的常用方法成員。表7.1 Graphics類常用方法名稱說明DrawArc畫弧。DrawBezier畫立體的貝爾塞曲線。DrawBeziers畫連續(xù)立體的貝爾塞曲線。DrawClosedCurve畫閉合曲線。DrawCurve畫曲線。DrawEllipse畫橢圓。DrawImage畫圖像。DrawLine畫線。DrawPath通過路徑畫線和曲線。DrawPie畫餅形。DrawPolygon畫多邊形。DrawRectangle畫矩形。DrawString繪制文字。FillEllipse填充橢圓。FillPath填充路徑。FillPie填充餅圖。FillPolygon填充多邊形。FillRectangle填充矩形。FillRectangles填充矩形組。FillRegion填充區(qū)域。在.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 常用畫圖對象在創(chuàng)建了Graphics對象后,就可以用它開始繪圖了,可以畫線、填充圖形、顯示文本等等,其中主要用到的對象還有:l Pen:用來用patterns、colors或者bitmaps進行填充。l Color:用來畫線和多邊形,包括矩形、圓和餅形。l Font:用來給文字設置字體格式。l Brush:用來描述顏色。l Rectangle:矩形結構通常用來在窗體上畫矩形。l Point:描述一對有序的x,y兩個坐標值。1Pen類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常用的屬性有以下幾個,如表7.2所示:表7.2 Pen常用屬性名稱說明Alignment獲得或者設置畫筆的對齊方式。Brush獲得或者設置畫筆的屬性。Color獲得或者設置畫筆的顏色。Width獲得或者設置畫筆的寬度。2Color結構在自然界中,顏色大都由透明度(A)和三基色(R,G,B)所組成。在GDI+中,通過Color結構封裝對顏色的定義,Color結構中,除了提供(A,R,G,B)以外,還提供許多系統(tǒng)定義的顏色,如Pink(粉顏色),另外,還提供許多靜態(tài)成員,用于對顏色進行操作。Color結構的基本屬性如表7.3所示。表7.3 顏色的基本屬性名稱說明A獲取此Color結構的alpha分量值,取值(0255)。B獲取此Color結構的藍色分量值,取值(0255)。G獲取此Color結構的綠色分量值,取值(0255)。R獲取此Color結構的紅色分量值,取值(0255)。Name獲取此Color結構的名稱,這將返回用戶定義的顏色的名稱或已知顏色的名稱(如果該顏色是從某個名稱創(chuàng)建的),對于自定義的顏色,將返回RGB值。Color結構的基本(靜態(tài))方法如表7.4所示表7.4 顏色的基本方法名稱說明FromArgb從四個8位ARGB分量(alpha、紅色、綠色和藍色)值創(chuàng)建Color結構。FromKnowColor從指定的預定義顏色創(chuàng)建一個Color結構。FromName從預定義顏色的指定名稱創(chuàng)建一個Color結構。Color結構變量可以通過已有顏色構造,也可以通過RGB建立,例如:Color clr1 = Color.FromArgb(122,25,255);Color clr2 = Color.FromKnowColor(KnowColor.Brown);/KnownColor為枚舉類型Color clr3 = Color.FromName(SlateBlue);在圖像處理中一般需要獲取或設置像素的顏色值,獲取一幅圖像的某個像素顏色值的具體步驟如下:(1)定義BitmapBitmap myBitmap = new Bitmap(c:MyImagesTestImage.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; 3Font類Font類定義特定文本格式,包括字體、字號和字形屬性。Font類的常用構造函數(shù)是public Font(string 字體名,float 字號,F(xiàn)ontStyle 字形),其中字號和字體為可選項和public Font(string 字體名,float 字號),其中“字體名”為Font的FontFamily的字符串表示形式。下面是定義一個Font對象的例子代碼:FontFamily fontFamily = new FontFamily(Arial);Font font = new Font(fontFamily,16,FontStyle.Regular,GraphicsUnit.Pixel);字體常用屬性如表7.5所示。表7.5 字體的常用屬性名稱說明Bold是否為粗體。FontFamily字體成員。Height字體高。Italic是否為斜體。Name字體名稱。Size字體尺寸。SizeInPoints獲取此 Font對象的字號,以磅為單位。Strikeout是否有刪除線。Style字體類型。Underline是否有下劃線。Unit字體尺寸單位。4Brush類Brush類是一個抽象的基類,因此它不能被實例化,我們總是用它的派生類進行實例化一個畫刷對象,當我們對圖形內部進行填充操作時就會用到畫刷,關于畫刷在7.1.5中有詳細講解。5Rectangle結構存儲一組整數(shù),共四個,表示一個矩形的位置和大小。矩形結構通常用來在窗體上畫矩形,除了利用它的構造函數(shù)構造矩形對象外,還可以使用Rectangle結構的屬性成員,其屬性成員如表7.6所示。表7.6 Rectangle結構屬性名稱說明Bottom底端坐標Height矩形高IsEmpty測試矩形寬和高是否為0Left矩形左邊坐標Location矩形的位置Right矩形右邊坐標Size矩形尺寸.Top矩形頂端坐標Width矩形寬X矩形左上角頂點X坐標Y矩形左上角頂點Y坐標Retangle結構的構造函數(shù)有以下兩個:/用指定的位置和大小初始化Rectangle類的新實例。public Retangle(Point,Size);/Size結構存儲一個有序整數(shù)對,通常為矩形的寬度和高度。和public Rectangle(int,int,int,int);6Point結構用指定坐標初始化Point類的新實例。這個結構很像C+中的Point結構,它描述了一對有序的x,y兩個坐標值,其構造函數(shù)為:public Point(int x,int y);其中x為該點的水平位置;y為該點的水垂直位置。下面是構造Point對象的例子代碼:Point pt1=new Point(30,30);Point pt2=new Point(110,100);71.4 基本圖形繪制舉例1畫一個矩形【例1】建立一個項目,在窗體上畫一個矩形,通過直接在Form1類中重載OnPaint函數(shù)的方法來實現(xiàn)。圖1 畫一個矩形protected override void OnPaint(PaintEventArgs e) Graphics g = e.Graphics ; Rectangle rect = new Rectangle(50, 30, 100, 100); LinearGradientBrush lBrush = new LinearGradientBrush(rect, Color.Red,Color.Yellow,LinearGradientMode.BackwardDiagonal); g.FillRectangle(lBrush, rect); 運行結果如圖1所示。2畫一個弧【例2】畫一個弧形?;⌒魏瘮?shù)格式如下:public void DrawArc(Pen pen,Rectangle rect,Float startArgle,Float sweepAngle);直接在Form1類中重載OnPaint函數(shù)protected override void OnPaint(PaintEventArgs e)Graphics g = e.Graphics ;Pen pn = new Pen( Color.Blue);Rectangle rect = new Rectangle(50, 50, 200,100);g.DrawArc(pn,rect,12,84);運行結果如圖2所示。圖2 畫一個弧3畫線【例3】畫一條線。protected override void OnPaint(PaintEventArgs e) Graphics g = e.Graphics ; Pen pn = new Pen(Color.Blue); Point pt1 = new Point(30,30); Point pt2 = new Point(110,100); g.DrawLine(pn,pt1,pt2); 運行結果如圖3所示。圖3畫一條線4畫橢圓【例4】畫一個橢圓。圖4畫一個橢圓protected override void OnPaint(PaintEventArgs e) Graphics g = e.Graphics ; Pen pn = new Pen( Color.Blue, 100 ); Rectangle rect = new Rectangle(50, 50, 200, 100); g.DrawEllipse( pn, rect ); 運行結果如圖4所示。5輸出文本【例5】輸出文本。protected override void OnPaint(PaintEventArgs e)Font fnt = new Font(Verdana, 16);Graphics g = e.Graphics;g.DrawString(GDI+ World, fnt, new SolidBrush(Color.Red), 14,10);運行結果如圖5所示。圖5 輸出文本6填充路徑【例6】填充路徑。protected override void OnPaint(PaintEventArgs e) Graphics g = e.Graphics; g.FillRectangle(new SolidBrush(Color.White), ClientRectangle); GraphicsPath path = new GraphicsPath(new Point new Point(40, 140), new Point(275, 200), new Point(105, 225), new Point(190, 300), new Point(50, 350), new Point(20, 180), , new byte (byte)PathPointType.Start, (byte)PathPointType.Bezier, (byte)PathPointType.Bezier, (byte)PathPointType.Bezier, (byte)PathPointType.Line, (byte)PathPointType.Line, ); PathGradientBrush pgb = new PathGradientBrush(path); pgb.SurroundColors = new Color Color.Green,Color.Yellow,Color.Red, Color.Blue,Color.Orange, Color.White, ;g.FillPath(pgb, path);運行結果如圖6所示。圖6 填充路徑注意:GraphicsPath類位于命名空間System.Drawing.Drawing2D中,表示一系列相互連接的直線和曲線。1.5 畫刷和畫刷類型Brush類型是一個抽象類,所以它不能被實例化,也就是不能直接應用,但是我們可以利用它的派生類,如:HatchBrush、SolidBrush和TextureBrush等。畫刷類型一般在System.Drawing命名空間中,如果應用HatchBrush和GradientBrush畫刷,需要在程序中引入System.Drawing.Drawing2D命名空間。1SolidBrush(單色畫刷)它是一種一般的畫刷,通常只用一種顏色去填充GDI+圖形,例如:protected override void OnPaint(PaintEventArgs e)Graphics g = e.Graphics;SolidBrush sdBrush1 = new SolidBrush(Color.Red);SolidBrush sdBrush2 = new SolidBrush(Color.Green);SolidBrush sdBrush3 = new SolidBrush(Color.Blue);g.FillEllipse(sdBrush2, 20, 40, 60, 70);Rectangle rect = new Rectangle(0, 0, 200, 100);g.FillPie(sdBrush3, 0, 0, 200, 40, 0.0f, 30.0f );PointF point1 = new PointF(50.0f, 250.0f);PointF point2 = new PointF(100.0f, 25.0f);PointF point3 = new PointF(150.0f, 40.0f);PointF point4 = new PointF(250.0f, 50.0f);PointF point5 = new PointF(300.0f, 100.0f);PointF curvePoints = point1, point2, point3, point4,point5 ;g.FillPolygon(sdBrush1, curvePoints);運行結果如圖7所示。圖7 SolidBrush應用2HatchBrush(陰影畫刷)HatchBrush類位于System.Drawing.Drawing2D命名空間中。陰影畫刷有兩種顏色:前景色和背景色,以及6種陰影。前景色定義線條的顏色,背景色定各線條之間間隙的顏色。HatchBrush類有兩個構造函數(shù):l public HatchBrush(HatchStyle,Color forecolor);l public HatchBrush(HatchStyle,Color forecolor,Color backcolor);HatchStyle枚舉值指定可用于HatchBrush對象的不同圖案。HatchStyle的主要成員如表7所示。表7 HatchStyle主要成員名稱說明BackwardDiagonal從右上到左下的對角線的線條圖案。Cross指定交叉的水平線和垂直線。DarkDownwardDiagonal指定從頂點到底點向右傾斜的對角線,其兩邊夾角比ForwardDiagonal小50%,寬度是其兩倍。此陰影圖案不是鋸齒消除的。DarkHorizontal指定水平線的兩邊夾角比Horizontal小50%并且寬度是Horizontal的兩倍。DarkUpwardDiagonal指定從頂點到底點向左傾斜的對角線,其兩邊夾角比BackwardDiagonal小50%,寬度是其兩倍,但這些直線不是鋸齒消除的。DarkVertical指定垂直線的兩邊夾角比Vertical小50%并且寬度是其兩倍。DashedDownwardDiagonal指定虛線對角線,這些對角線從頂點到底點向右傾斜。DashedHorizontal指定虛線水平線。DashedUpwardDiagonal指定虛線對角線,這些對角線從頂點到底點向左傾斜。DashedVertical指定虛線垂直線。DiagonalBrick指定具有分層磚塊外觀的陰影,它從頂點到底點向左傾斜。DiagonalCross交叉對角線的圖案。Divot指定具有草皮層外觀的陰影。ForwardDiagonal從左上到右下的對角線的線條圖案。Horizontal水平線的圖案。HorizontalBrick指定具有水平分層磚塊外觀的陰影。LargeGrid指定陰影樣式Cross。LightHorizontal指定水平線,其兩邊夾角比Horizontal小50%。LightVertical指定垂直線的兩邊夾角比Vertical小50%。Max指定陰影樣式SolidDiamond。Min指定陰影樣式Horizontal。NarrowHorizontal指定水平線的兩邊夾角比陰影樣式Horizontal小 75%(或者比LightHorizontal小25%)。NarrowVertical指定垂直線的兩邊夾角比陰影樣式Vertical小 75%(或者比LightVertica小25%)。OutlinedDiamond指定互相交叉的正向對角線和反向對角線,但這些對角線不是鋸齒消除的。Percent05指定5%陰影。前景色與背景色的比例為5:100。Percent90指定90%陰影。前景色與背景色的比例為90:100。Plaid指定具有格子花呢材料外觀的陰影。Shingle指定帶有對角分層鵝卵石外觀的陰影,它從頂點到底點向右傾斜。SmallCheckerBoard指定帶有棋盤外觀的陰影。SmallConfetti指定帶有五彩紙屑外觀的陰影。SolidDiamond指定具有對角放置的棋盤外觀的陰影。Sphere指定具有球體彼此相鄰放置的外觀的陰影。Trellis指定具有格架外觀的陰影。Vertical垂直線的圖案。Wave指定由代字號“”構成的水平線。Weave指定具有織物外觀的陰影。下面代碼顯示了HatchBrush畫刷的使用。protected override void OnPaint(PaintEventArgs e)Graphics g = e.Graphics;HatchBrush hBrush1 = new HatchBrush(HatchStyle.DiagonalCross, Color.Chocolate, Color.Red); HatchBrush hBrush2 = new HatchBrush(HatchStyle.DashedHorizontal, Color.Green, Color.Black); HatchBrush hBrush3 = new HatchBrush(HatchStyle.Weave, Color.BlueViolet, Color.Blue); g.FillEllipse(hBrush1, 20, 80, 60, 20); Rectangle rect = new Rectangle(0, 0, 200, 100); g.FillPie(hBrush3, 0, 0, 200, 40, 0.0f, 30.0f ); PointF point1 = new PointF(50.0f, 250.0f);PointF point2 = new PointF(100.0f, 25.0f); PointF point3 = new PointF(150.0f, 40.0f); PointF point4 = new PointF(250.0f, 50.0f); PointF point5 = new PointF(300.0f, 100.0f); PointF curvePoints = point1, point2, point3, point4, point5 ; g.FillPolygon(hBrush2, curvePoints); 運行結果如圖8所示。圖8 HatchBrush應用3TextureBrush(紋理畫刷)紋理畫刷擁有圖案,并且通常使用它來填充封閉的圖形。為了對它初始化,可以使用一個已經(jīng)存在的別人設計好了的圖案,或使用常用的設計程序設計的自己的圖案,同時應該使圖案存儲為常用圖形文件格式,如BMP格式文件。這里有一個設計好的位圖,被存儲為Papers.bmp文件。private void Form1_Paint(object sender, PaintEventArgs e)Graphics g = e.Graphics;/根據(jù)文件名創(chuàng)建原始大小的bitmap對象Bitmap bitmap = new Bitmap(D:mm.jpg);/將其縮放到當前窗體大小bitmap = new Bitmap(bitmap, this.ClientRectangle.Size);TextureBrush myBrush = new TextureBrush(bitmap);g.FillEllipse(myBrush, this.ClientRectangle);運行結果如圖9所示。圖9 TextTureBursh應用4LinearGradientBrush和PathGradientBrush(漸變畫刷)漸變畫刷類似與實心畫刷,因為它也是基于顏色的,與實心畫刷不同的是:漸變畫刷使用兩種顏色;它的主要特點是:在使用過程中,一種顏色在一端,而另外一種顏色在另一端,在中間,兩種顏色融合產(chǎn)生過渡或衰減的效果。漸變畫刷有兩種:線性畫刷和路徑畫刷(LinearGradientBrush和PathGradientBrush)。其中LinearGradientBrush可以顯示線性漸變效果,而PathGradientBrush是路徑漸變的可以顯示比較具有彈性的漸變效果。(1)LinearGradientBrush類LinearGradientBrush類構造函數(shù)如下:public LinearGradientBrush(Point point1,Point point2,Color color1,Color color2)參數(shù)說明:point1:表示線性漸變起始點的Point結構。 point2:表示線性漸變終結點的Point結構。 color1:表示線性漸變起始色的Color結構。 color2:表示線性漸變結束色的Color結構。 代碼如下:private void Form1_Paint(object sender, PaintEventArgs e)Graphics g = e.Graphics;LinearGradientBrush myBrush = new LinearGradientBrush(this.ClientRectangle, Color.White, Color.Blue, LinearGradientMode.Vertical);g.FillRectangle(myBrush, this.ClientRectangle);運行結果如圖10所示。圖10 LinearGradientBrush的應用(2)PathGradientBrush類PathGradientBrush類的構造函數(shù)如下:public PathGradientBrush (GraphicsPath path);參數(shù)說明:path:GraphicsPath,定義此PathGradientBrush填充的區(qū)域。例子代碼如下:private void Form1_Paint(object sender, PaintEventArgs e)Graphics g = e.Graphics;Point centerPoint = new Point(150, 100);int R = 60;GraphicsPath path = new GraphicsPath();path.AddEllipse(centerPoint.X-R,centerPoint.Y-R,2*R,2*R);PathGradientBrush brush = new PathGradientBrush(path); /指定路徑中心點 brush.CenterPoint = centerPoint; /指定路徑中心的顏色brush.CenterColor = Color.Red;/Color類型的數(shù)組指定與路徑上每個頂點的顏色brush.SurroundColors = new Color Color.Plum ;g.FillEllipse(brush,centerPoint.X-R,centerPoint.Y-R,2*R,2* R);centerPoint = new Point(350, 100);R = 20;path = new GraphicsPath();path.AddEllipse(centerPoint.X-R,centerPoint.Y-R,2*R,2*R);path.AddEllipse(centerPoint.X-2*R,centerPoint.Y-2*R,4*R,4* R);path.AddEllipse(centerPoint.X-3*R,centerPoint.Y-3*R,6*R,6* R);brush = new PathGradientBrush(path);brush.CenterPoint = centerPoint;brush.CenterColor = Color.Red;brush.SurroundColors = new Color Color.Black, Color.Blue, Color.Green ;g.FillPath(brush, path);運行結果如圖11所示。圖11 PathGradientBrush應用2 C#圖像處理基礎本次課程主要介紹C#圖像處理基礎知識以及對圖像的基本處理方法和技巧,主要包括圖像的加載、變換和保存等操作。2.1 C#圖像處理概述1圖像文件的類型GDI+支持的圖像格式有BMP、GIF、JPEG、EXIF、PNG、TIFF、ICON、WMF、EMF等,幾乎涵蓋了所有的常用圖像格式,使用GDI+可以顯示和處理多種格式的圖像文件。2圖像類GDI+提供了Image、Bitmap和Metafile等類用于圖像處理,為用戶進行圖像格式的加載、變換和保存等操作提供了方便。(1)Image類Image類是為Bitmap和Metafile的類提供功能的抽象基類。(2)Metafile類定義圖形圖元文件,圖元文件包含描述一系列圖形操作的記錄,這些操作可以被記錄(構造)和被回放(顯示)。(3)Bitmap類封裝GDI+位圖,此位圖由圖形圖像及其屬性的像素數(shù)據(jù)組成,Bitmap是用于處理由像素數(shù)據(jù)定義的圖像的對象,它屬于System.Drawing命名空間,該命名空間提供了對GDI+基本圖形功能的訪問。Bitmap類常用方法和屬性如表8所示。表8 Bitmap常用屬性和方法名稱說明公共屬性Height獲取此Image對象的高度。RawFormat獲取此Image對象的格式。Size獲取此Image對象的寬度和高度。Width獲取此Image對象的寬度。公共方法GetPixel獲取此Bitmap中指定像素的顏色。MakeTransparent使默認的透明顏色對此Bitmap透明。RotateFlip旋轉、翻轉或者同事旋轉和翻轉Image對象。Save將Image對象以指定的格式保存到指定的Stream對象。SetPixel設置Bitmap對象中指定像素的顏色。SetPropertyItem將指定的屬性項設置為指定的值。SetResolution設置此Bitmap的分辨率。Bitmap類有多種構造函數(shù),因此可以通過多種形式建立Bitmap對象,例如:從指定的現(xiàn)有圖像建立Bitmap對象Bitmap box1 =new Bitmap(pictureBox1.Image);從指定的圖像文件建立Bitmap對象,其中“C:MyImagesTestImage.bmp”已存在的圖像文件Bitmap box2 =new Bitmap(C:MyImagesTestImage.bmp);從現(xiàn)有的Bitmap對象建立新的Bitmap對象Bitmap box3 = new Bitmap(box1);2.2 圖像的輸入和保存1圖像的輸入在窗體或圖形框內輸入圖像有兩種方式:(一)在窗體設計時使用圖形框對象的Image屬性輸入;(二)在程序中通過打開文件對話框輸入。方法(一)、窗體設計時使用圖形框對象的Image屬性輸入窗體設計時使用對象的Image屬性輸入圖像的操作如下:(1)在窗體上,建立一個圖形框對象(pictureBox1),選擇圖形框對象屬性中的Image屬性,如圖12所示。(2)單擊Image屬性右側的【】,彈出一個“選擇資源”窗口,在該窗口中選擇“本地資源”,單擊【導入(M).】將彈出一個“打開”對話框,如圖13所示。圖12 Image屬性圖13“打開”對話框(3)選擇圖像文件后,單擊【打開】按鈕。方法(二)、使用“打開文件”對話框輸入圖像在窗體上添加一個命令按鈕(button1)和一個圖形框對象(pictureBox1),雙擊命令按鈕,在響應方法中輸入如下代碼:private void button1_Click(object sender, EventArgs e) OpenFileDialog ofdlg = new OpenFileDialog(); ofdlg.Filter = BMP File(*.bmp)|*.bmp; if (ofdlg.ShowDialog() = DialogResult.OK) Bitmap image = new Bitmap(ofdlg.FileName); pictureBox1.Image = image; 執(zhí)行該程序時,使用“打開文件”對話框,選擇圖像文件,該圖像將會被打開,并顯示在pictureBox1圖像框中?!纠?】圖像輸入。采用方法(二)來實現(xiàn)圖像的輸入。設計步驟如下:(1)建立如圖14所示的項目界面,在窗體上加入【打開圖像】命令按鈕和一個PictureBox控件。(2)雙擊【打開圖像】命令按鈕,編輯按鈕的單擊事件響應函數(shù),其代碼同方法(二)中所寫代碼,在此不再重復。圖14 圖像輸入(3)運行后單擊【打開圖像】按鈕,彈出一個“打開文件”對話框,選擇圖象文件名,運行結果如圖15所示。圖15 運行結果2圖像的保存保存圖像的步驟如下:(1)當使用按鈕和保存對話框保存文件時,加入保存按鈕和PictureBox控件,窗體設計如圖16所示。(2)保存命令鈕的單擊事件的響應函數(shù)代碼如下:private void button2_Click(object sender, EventArgs e) string str; Bitmap box1 = new Bitmap(pictureBox1.Image); SaveFileDialog sfdlg = new SaveFileDialog(); sfdlg.Filter = bmp文件(*.BMP)|*.BMP|All File(*.*)|*.*; sfdlg.ShowDialog(); str = sfdlg.FileName; box1.Save(str); 執(zhí)行該過程時,將打開“另存為”對話框,如圖17所示。圖16 保存圖像圖17 “另存為”對話框選擇圖像文件的保存路徑。3圖像格式的轉換使用Bitmap對象的Save方法,可以把打開的圖像保存為不同的文件格式,從而實現(xiàn)圖像格式的轉換。在上述例子中添加一個命令按鈕,雙擊該命令按鈕,編輯其相應代碼如下:private void button3_Click(object sender, EventArgs e)string str; Bitmap box1 = new Bitmap(pictureBox1.Image); SaveFileDialog sfdlg = new SaveFileDialog(); sfdlg.Filter = bmp文件(*.jpeg)|*.jpeg|All File(*.*)|*.*; sfdlg.ShowDialog(); str = sfdlg.FileName;box1.Save(str,System.Drawing.Imaging.ImageFormat.Jpeg);Bitmap對象的Save方法中的第二個參數(shù)指定了圖像保存的格式。Imaging.ImageFormat支持的格式如表9所示:表9 Imaging.ImageFormat支持的格式名稱說明 Bmp獲取位圖圖像格式(BMP)。Emf獲取增強型Windows圖元文件圖像格式(EMF)。Exif獲取可交換圖像文件(Exif)格式。 Gif獲取圖形交換格式(GIF)圖像格式。 Guid獲取表示此ImageForma 對象的Guid結構。Icon獲取Windows圖標圖像格式。Jpeg獲取聯(lián)合圖像專家組(JPEG)圖像格式。MemoryBmp獲取內存位圖圖像格式。Png獲取W3C可移植網(wǎng)絡圖形

溫馨提示

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

評論

0/150

提交評論