C#中的GDI+圖像編程詳解
一、Graphics
GDI+是GDI(Windows Graphics Device Interface)的后繼者,它是.NET Framework為操作圖形提供的應(yīng)用程序編程接口,主要用在窗體上繪制各種圖形圖像,可以用于繪制各種數(shù)據(jù)圖像、數(shù)學(xué)仿真等。
Graphics類是GDI+的核心,它提供將對象繪制到顯式設(shè)備的方法。Graphics類封裝了繪制直線、曲線、圓形、圖像和文本的方法,是一切GDI+操作的基礎(chǔ)類。在繪圖之前,必須在指定的窗體上創(chuàng)建一個Graphics對象,才能調(diào)用Graphics類的方法畫圖。
1、創(chuàng)建Graphics類對象
1、Paint事件
在窗體或控件的Paint事件中創(chuàng)建,將其作為PaintEventArgs的一部分。在為控件創(chuàng)建繪制代碼時,通常會使用此方法?! ?/p>
例如,在Paint事件中創(chuàng)建Graphics對象:
public partial class Form1 : Form { protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Graphics g = e.Graphics; // e.ClipRectangle;//剪切區(qū)域,即被遮擋的部分 g.DrawLine(Pens.Wheat, 0, 0, 2, 2); } }
2、 CreateGraphics方法
調(diào)用窗體或控件的CreateGraphics方法可以獲取對Graphics對象的引用,該對象表示控件或窗體的繪圖畫面。如果在已存在的窗體或控件身上繪圖,應(yīng)該使用此方法
例如,在窗體的Load事件中,通過CreateGraphics方法創(chuàng)建Graphics對象
private void Form1_Load(object sender, EventArgs e) //窗體的Load事件 { Graphics g; //聲明一個Graphics對象 g = this.CreateGraphics(); }
3 、Graphics.FromImage方法
由從Image繼承的任何對象創(chuàng)建Graphics對象,調(diào)用Graphics.FromImage方法即可,該方法在需要更改已存在的圖像時十分有用,例:
private void Form1_Load(object sender, EventArgs e) { Bitmap mbit = new Bitmap(@"C:\test.bmp"); Graphics g = Graphics.FromImage(mbit); }
2、Graphics類的屬性
- Clip 獲取或設(shè)置 Region,它限定此 Graphics 的繪圖區(qū)域。
- ClipBounds 獲取一個 RectangleF 結(jié)構(gòu),該結(jié)構(gòu)限定此 Graphics 的剪輯區(qū)域。
- VisibleClipBounds 獲取此 Graphics 的可見剪輯區(qū)域的邊框。
- CompositingQuality 獲取或設(shè)置繪制到此 Graphics 的合成圖像的呈現(xiàn)質(zhì)量。
- SmoothingMode 獲取或設(shè)置此 Graphics 的呈現(xiàn)質(zhì)量。
- DpiX 獲取此 Graphics 的水平分辨率。
- DpiY 獲取此 Graphics 的垂直分辨率。
- PageScale 獲取或設(shè)置此 Graphics 的世界單位和頁單位之間的比例。
- PageUnit 獲取或設(shè)置用于此 Graphics 中的頁坐標(biāo)的度量單位。
3、Graphics類的常用方法
- 畫線條
DrawLine 繪制一條連接由坐標(biāo)對象指定的兩個點(diǎn)的線條
DrawLines 繪制一列連接一組Point結(jié)構(gòu)的線段
DrawBezier 繪制由四個Point結(jié)構(gòu)定義的貝塞爾樣條
DrawBeziers 從Point結(jié)構(gòu)的數(shù)組繪制一系列貝塞爾樣條
DrawCurve 繪制經(jīng)過一組指定的Point結(jié)構(gòu)的基數(shù)樣條 - 畫可填充線條
DrawEllipse 繪制一個由一對坐標(biāo)、寬度和高度指定的橢圓
DrawPath 繪制GraphicsPath對象
DrawPie 繪制一個扇形,該扇形由一個坐標(biāo)對象,寬度和高度,以及兩條射線所指定的橢圓指定
DrawPolygon 繪制由一組Point結(jié)構(gòu)定義的多邊形
DrawRectangle 繪制由坐標(biāo)對。寬度和高度指定的矩形
DrawRectangles 繪制一系列由Rectangle結(jié)構(gòu)指定的矩形
DrawArc 繪制一段弧線,它表示由一對坐標(biāo)、寬高指定的橢圓部分 - 填充區(qū)域
FillEllipse 填充邊框所定義的橢圓內(nèi)部,該邊框由一對坐標(biāo)、一個高度和一個寬度指定
FillPath 填充GraphicsPath對象的內(nèi)部
FillPie 填充扇形內(nèi)部
FillPolygon 填充多邊形內(nèi)部
FillRectangle 填充由一對坐標(biāo)、一個寬度和一個高度指定的矩形內(nèi)部
FillRectangles 填充由Rectangle結(jié)構(gòu)指定的一些列矩陣的內(nèi)部
FillRegion 填充Region對象的內(nèi)部 - 畫字符串、圖畫、圖標(biāo)
DrawString 在指定位置并且用指定的Brush和Font對象繪制指定的文本字符串
DrawIcon 在指定坐標(biāo)處繪制由指定的Icon對象表示的圖像
DrawImage 在指定的位置并且按原始大小繪制指定的Image對象 - 其他
MeasureString(String, Font) 測量用指定的 Font 繪制的指定字符串。
FromImage 從指定的Image對象創(chuàng)建行的Graphics對象
Save 保存此Graphics對象的當(dāng)前狀態(tài),并且GraphicsState對象標(biāo)識保存的狀態(tài)
Clear 清除整個繪圖面并以指定背景色填充
Dispose 釋放由此Graphics對象使用的所有資源
二、坐標(biāo)系統(tǒng)
GDI+定義了三種坐標(biāo)系統(tǒng),并提供了三種坐標(biāo)轉(zhuǎn)換的方法Graphics.TransformPoints()。
- 全局坐標(biāo)系統(tǒng)。
- 頁面(Page)坐標(biāo)系統(tǒng):左上角為原點(diǎn),橫向x軸向右為正方向,縱向y軸向下為正方向。單位為像素。這是默認(rèn)的坐標(biāo)系統(tǒng)。
- 設(shè)備坐標(biāo)系統(tǒng):可以指定特定測量單位的頁面(Page)坐標(biāo)系統(tǒng)。如果單位為像素,和頁面(Page)坐標(biāo)系統(tǒng)相同。
1、點(diǎn)結(jié)構(gòu):Point和PointF
點(diǎn)結(jié)構(gòu)有兩個成員:X,Y,表示點(diǎn)的x軸和y軸的坐標(biāo)。其常用構(gòu)造函數(shù)如下:
Point p1=new Point(int X,int Y);//X,Y為整數(shù) PointF p2=new PointF(float X,floa Y);//X,Y為浮點(diǎn)數(shù)
2、尺寸結(jié)構(gòu)Size和SizeF
Size和SizeF用來表示尺寸大小,有兩個成員:Width和Height。常用構(gòu)造函數(shù)如下:
public Size(int width,int height); public SizeF(float width,float height);
3、矩形結(jié)構(gòu)Rectangle和RectangleF
結(jié)構(gòu)Rectangle和RectangleF用來表示一個矩形,常用屬性如下:
- Top、Left,Bottom, Right:Rectangle結(jié)構(gòu)坐標(biāo)
- Width、Height:獲取或設(shè)置此Rectangle結(jié)構(gòu)的寬、高度。
- Size:獲取或設(shè)置此Rectangle的大小。
- X、Y:獲取或設(shè)置此Rectangle結(jié)構(gòu)左上角的x,Y坐標(biāo)。
其常用構(gòu)造函數(shù)為:
//參數(shù)為矩形左上角坐標(biāo)的點(diǎn)結(jié)構(gòu)location和代表矩形寬和高的Size結(jié)構(gòu)size Rectangle(Point location,Size size);//參數(shù)也可為PointF和SizeF //參數(shù)為矩形左上角x和y坐標(biāo),寬,高 Rectangle(int X,int Y,int width,int height);//X和Y也可為float
4、路徑類GraphicsPath
GraphicsPath 類表示一系列相互連接的直線和曲線。 此類不能被繼承。
Graphics g = e.Graphics; g.FillRectangle(Brushes.White, this.ClientRectangle); GraphicsPath gp = new GraphicsPath(); gp.AddLine(10, 10, 10, 50); gp.AddBezier(10, 50, 10, 55, 25, 70, 30, 70); gp.AddLine(30, 70, 60, 70); //閉合圖形 gp.CloseFigure(); //GraphicsPath類本身沒有提供顯示創(chuàng)建路徑的功能,所以需要把路徑對象傳給Graphics類的一個方法來顯示 g.DrawPath(Pens.Black, gp); g.FillPath(Brushes.Orange, gp);//給路徑填充橘黃色, gp.Dispose(); g.Dispose();
5、區(qū)域類Region類
Region類表示由矩形或由路徑構(gòu)成圖形形狀的內(nèi)部
1、從GraphicsPath路徑對象中創(chuàng)建區(qū)域,
GraphicsPath gp = new GraphicsPath(); gp.AddLine(10, 10, 10, 50); gp.AddBezier(10, 50, 10, 55, 25, 70, 30, 70); gp.AddLine(30, 70, 60, 70); //閉合圖形 gp.CloseFigure(); Region reg = new Region(gp); //從GraphicsPath對象創(chuàng)建Region對象 //填充區(qū)域 g.FillRegion(Brushes.Green, reg);
2.從各類圖形中創(chuàng)建:
Region reg = new Region(new Rectangle(10, 10, 80, 20));
3.從一個區(qū)域中創(chuàng)建另一個區(qū)域
Region r1 = new Region(new Rectangle(10, 10, 80, 20)); RegionData r1Data = r1.GetRegionData();//區(qū)域數(shù)據(jù) Region r2 = new Region(r1Data);? //構(gòu)造函數(shù)不接受區(qū)域?qū)ο蟊旧恚梢越邮軈^(qū)域數(shù)據(jù)數(shù)組。
4.區(qū)域的并集和交集
示例:
Graphics g = e.Graphics; Rectangle rect1 = new Rectangle(50, 10, 50, 130); Rectangle rect2 = new Rectangle(10, 50, 130, 50); //設(shè)置Region為第一個矩形 Region reg = new Region(rect1); //用Rect2提取Region中的交集 reg.Intersect(rect2); g.FillRegion(Brushes.Orange, reg); g.DrawRectangle(Pens.Black, rect1); g.DrawRectangle(Pens.Black, rect2);
三、顏色
1、Color結(jié)構(gòu)
Color結(jié)構(gòu)表示顏色,結(jié)構(gòu)中包含一個無符號32位數(shù)代表顏色。任何一種顏色可以用ARGB顏色(alpha、紅、綠、藍(lán))表示。Color結(jié)構(gòu)通過表態(tài)屬性公開了140個命名顏色。。常用方法如下:
- public static Color FromArgb(int alpha,int rr,int gg,int bb);
從四個分量(透明度、紅色、綠色和藍(lán)色)值創(chuàng)建Color結(jié)構(gòu)。每個分量的值僅限于8位(小于256)。alpha值表示透明度,=0為完全透明,=255為完全不透明 - public static Color FromArgb(int rr,int gg,int bb);
從指定的8位顏色值(紅色、綠色和藍(lán)色)創(chuàng)建Color結(jié)構(gòu)。透明度值默認(rèn)為255(完全不透明)。每個分量的值僅限于8位(小于256)。紅色為(255,0,0),綠色為(0,255,0),藍(lán)色為(0,0,255)。 - public static Color FromArgb(int alpha,Color color);
從指定的Color結(jié)構(gòu)創(chuàng)建新Color結(jié)構(gòu),使用新指定的透明度值alpha。alpha值僅限于8位。
創(chuàng)建實(shí)例
//創(chuàng)建Color實(shí)例的參數(shù)為 r,g,b; //參數(shù)為紅,綠,藍(lán)三種原色,透明度為默認(rèn),即完全不透明. Color cl = Color.FromArgb(200, 200, 200); //調(diào)用靜態(tài)FromName方法 Color cl = Color.FromName("PowderBlue"); //字符串參數(shù)必須包含一個KnownColor枚舉值的名稱.
使用顏色:
Color red=Color.Red; red.GetBrightness(); red.GetHue(); red.GetSaturation();
2、ColorTranslator類
- FromHtml(String) 將 HTML 顏色表示形式翻譯成 GDI+ Color 結(jié)構(gòu)。
Color myColor = ColorTranslator.FromHtml("Blue"); Color myColor = ColorTranslator.FromHtml("H00000");
- ToHtml(Color) 將指定的 Color 結(jié)構(gòu)翻譯成 HTML 字符串顏色表示形式。
string htmlColor = ColorTranslator.ToHtml( Color.Red); string htmlColor = ColorTranslator.ToHtml( Color.FromArgb(255,255,255));
四、畫筆Pen類
畫筆,定義用于繪制直線和曲線的對象。
定義畫筆:
Pen pen1 = new Pen(Color, Single); //參數(shù)為顏色Color,單精度浮點(diǎn)數(shù)Sigle;寬度默認(rèn)為1; Pen pen2 = Pen(Brush, Single); // 使用指定的 Pen 和 Brush 初始化 Width 類的新實(shí)例。
使用畫筆:
//畫實(shí)線 Pen pen = new Pen(Color.Red, 3); //確定線的首位位置 Point point1 = new Point(10, 50); Point point2 = new Point(250, 50); Graphics g = this.CreateGraphics(); g.DrawLine(pen, point1, point2);
五、畫刷Brush
畫刷:定義用于填充圖形形狀(如矩形、橢圓、餅形、多邊形和封閉路徑)的內(nèi)部的對象。只是一個抽象基類。
Rectangle rect1 = new Rectangle(20, 80, 250, 100); // (實(shí)心實(shí)心刷) SolidBrush sbrush = new SolidBrush(Color.DarkOrchid); //(紋理刷) TextureBrush textureBrush = new TextureBrush(new Bitmap(@"e:/123.jpg")); //(梯度、線性漸進(jìn)刷) LinearGradientBrush lbrush = new LinearGradientBrush(rect1, Color.DarkOrange, Color.Aquamarine, 45); //路徑漸進(jìn)畫刷 PathGradientBrush pathbrush = new PathGradientBrush(graphicsPath); //(陰影刷) HatchBrush hbrush = new HatchBrush(HatchStyle.DiagonalCross, Color.DarkOrange, Color.Aquamarine); e.Graphics.FillRectangle(sbrush, rect1); // (實(shí)心刷) e.Graphics.FillRectangle(textureBrush, rect1); //(紋理刷) e.Graphics.FillRectangle(lbrush, rect1); //(梯度刷) e.Graphics.FillRectangle(hbrush, rect1); //(陰影刷)
六、字體 Font
Font類有兩個構(gòu)造函數(shù):
第一個是new Font(字體名稱,字號),例如,label1.Font=new Font("黑體",9)。
第二個是new Font(字體名稱,字號,字體風(fēng)格),其中第三個參數(shù)是枚舉類型。
定義字體:
//例如修改標(biāo)簽控件字體為斜體: label1.Font=new Font("黑體",9,label1.Font.Style|FontStyle.Italic); //修改標(biāo)簽控件字體不為斜體: label1.Font=new Font("黑體",9,label1.Font.Style&~FontStyle.Italic);
字體用法
// Create font and brush. Font drawFont = new Font("Arial", 16); SolidBrush drawBrush = new SolidBrush(Color.Black); // Draw string to screen. e.Graphics.DrawString("Sample Text", drawFont, drawBrush, new PointF(150.0F, 150.0F));
七、圖像
見
到此這篇關(guān)于C#圖像編程GDI+的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#實(shí)現(xiàn)winform用子窗體刷新父窗體及子窗體改變父窗體控件值的方法
這篇文章主要介紹了C#實(shí)現(xiàn)winform用子窗體刷新父窗體及子窗體改變父窗體控件值的方法,涉及C#窗體交互的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07C#實(shí)現(xiàn)通過程序自動抓取遠(yuǎn)程Web網(wǎng)頁信息的代碼
C#實(shí)現(xiàn)通過程序自動抓取遠(yuǎn)程Web網(wǎng)頁信息的代碼...2007-04-04

C# 中的GroupBy的動態(tài)拼接問題及GroupBy<>用法介紹

C# DataTable中查詢指定字段名稱的數(shù)據(jù)

解決C#獲取鼠標(biāo)相對當(dāng)前窗口坐標(biāo)的實(shí)現(xiàn)方法