.NET Windows编程系列(8):.NET图形和图像编程
摘要:
在本节介绍我们如何在Windows界面上绘制各种图形、如何利用.NET FrameWork对图像进行各种处理。
注:本系列节选自MSDN Webcasts上邵志东老师的《 .NET Windows编程系列课程》PPT内容,在我的Blog中整理发表,方便大家一同参考!此系列相关资料请到这里下载。
本节主要内容:
.NET图形编程概述
画笔和画刷
图形的绘制
文本和字体
双缓冲
一、.NET图形编程概述
GDI+技术简介
GDI:Graphics Device Interface.
GDI+是一种构成Microsoft Windows XP 操作系统的子系统的应用程序编程接口(API)。GDI+ 负责在屏幕和打印机上显示信息。它是GDI的改进,同时也是.NET框架结构的重要组成部分。和GDI一样它提供料对二维图形图像和文字排版处理的支持.通过GDI+能够创建与设备无关的应用程序。
GDI+提供的新特性:
Alpha混合技术、反锯齿处理技术、渐变色和纹理填充、宽线条、基本几何曲线样式、可缩放区域、浮点数坐标、嵌入画笔、高质量过滤和缩放、多种线条样式和端点选项
.NET框架结构中对GDI的封装

坐标系统
GDI+在坐标系中绘制直线、矩形和其他形状。我们可以从各种各样的坐标系统中选择,但默认坐标系统的原点是在左上角,并且x 轴指向右边,y 轴指向下边。默认坐标系统的度量单位是像素。
System.Drawing中常用的结构
1.Color
Color封装了对颜色的定义。该结构中封装了 数百个分别对应与标准调色板色彩的静态成员。如Color.Red代表红色,Color.Purple代表紫色
有用的静态方法:
FromArgb:通过三原色构建Color对象
FromKnownColor:通过已知颜色构建Color对象
FromName:通过颜色名称来构建Color对象
例如:
Color temp1 = Color.Black;
Color temp2 = Color.FromArgb(0,0,0)
Color temp3 = Color.FromName(“Black”);
2.Size和SizeF
表示绘制平面上的一个尺寸,一个为整数,一个为浮点数
构造函数
Size sz1 = new Size(10,10)
属性:
Width:表示宽度值
Height:表示高度值
重载了加、减、比较、赋值操作
Size sz2 = sz1;
Size sz3 = sz1 -sz2;
Size sz4 = sz1+sz2;
3.Point和PointF
表示绘制平面上点的坐标,一个为整数,另外一个为浮点数
构造方法:
Point pt = new Point(20,20);
Point pt = new Point(new Size(10,10))
重载了加、减、比较、赋值操作
4.Rectangle和RectangleF
表示绘制平面上的一个矩形区域
属性
Bottom:矩形底部的纵座标
Top:矩形顶部的纵座标
Left:矩形坐部的横座标
Right:矩形右部的横座标
Height:矩形的高度
Width:矩形的宽度
Size:矩形的尺寸
IsEmpty:矩形是否为空(高度和宽度是否都是0)
X:矩形左上角的横座标
Y:矩形左上角的纵座标
Graphics类
使用GDI+绘图,首先要创建Graphics类
1.Graphics使用的两种方法(模板)
在OnPaint事件中使用
Protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
}
在其他情况使用
Graphics g = this.CreateGraphics();
Try
{
//作图
}
Finally
{
if(g!=null)
((IDisposable)g).Dispose();
}
2.Graphics对象绘图方法
DrawArc—绘制圆弧、DrawBezier—绘制贝塞尔曲线、DrawBeziers—绘制贝塞尔曲线组、DrawClosedCurve—绘制封闭曲线、DrawCurve—绘制曲线、DrawEllipse—绘制椭圆、DrawIcon—绘制图标、DrawIconUnstretched—无缩放绘制图标、DrawImage—绘制图像、DrawImageUnscaled—无缩放绘制图像、DrawLine—绘制直线、DrawLines—绘制直线组、DrawPath—绘制GraphicsPath对象、DrawPie—绘制圆饼、DrawPolygon—绘制多边形、DrawRectangle—绘制矩形、DrawRectangles—绘制矩形组、DrawString—绘制文本
3.Graphics对象绘制实心图形方法
FillClosedCurve—绘制实心封闭曲线、FillEllipe—封闭实心椭圆、FillPath—GraphicsPath对象、FillPie—绘制实心圆饼、FillPolygon—绘制实心多边形、FillRectangle—绘制实心矩形、FillRectangles—绘制实心矩形组、FillRegion—绘制实心Region对象
DEMO1:图形编程示例
二、画笔和画刷
Pen
在System.Drawing名称空间中,用来指定图形的轮廓,如颜色和宽度等。
1.画笔创建
Pen pen = new Pen(Color.Blue,5)
2.画笔的属性
|
属性
|
描述
|
取值
|
|
Alignment
|
指定相对于理论上、零宽度的线条的Pen对象的对齐方式
|
PenAlignment.Center:位于所绘制线条的中央
PenAlignment:Insert:位于所绘制线条的嵌入内部
PenAlignment.Left:位于所绘制线条的左侧
PenAlignment.OutSet:位于所绘制线条的嵌入外部
PenAlignment.Right:位于所绘制线条的右侧
|
|
DashStyle
|
绘制线条的虚线类型
|
DashStyle.Custom:用户自定义
DashStyle.Dash:线条由线段组成
DashStyle.DashDot:线条由线段和点组成
DashStyle.DashDotDot:线条由线段、点和点组成
DashStyle.Dot:线条由点组成
DashStyle.Solid:线条由实线组成
|
|
StartCap
EndCap
|
绘制线条的起点和终点类型
|
AnchorMask指定用于检查线帽是否为锚头帽的掩码。ArrowAnchor指定箭头状锚头帽。Custom指定自定义线帽。DiamondAnchor指定菱形锚头帽。Flat指定平线帽。
NoAnchor指定没有锚。Round指定圆线帽。
RoundAnchor指定圆锚头帽。Square指定方线帽。
SquareAnchor指定方锚头帽。Triangle指定三角线帽。
|
DEMO2:Pen使用示例
Brush
Brush对象是一个抽象类,不能被直接使用。它有5个派生类,分别实行不同类型的画刷。
画刷类型:SolidBrush:实心画刷(最简单)、HatchBrush:带阴影线的画刷、LinearGradientBrush:填充颜色线性渐变的画刷、PathGradientBrush:填充颜色沿路径渐变的画刷、TextureBrush:使用图像进行填充的画刷。
DEMO3:Brush使用示例
三、绘制的图形
直线的绘制
DrawLine、DrawLines
DEMO4:线条绘制
圆弧、矩形和椭圆
1.圆弧
确定矩形边框,指定起始角度和跨越角度。角度以度数为单位,即360表示一周
2.椭圆:确定外接矩形
绘制曲线
DrawCurve、DrawClosedCurve、DrawBezier
练习
把直线练习修改为DrawCurve
把直线练习修改为DrawClosedCurve
绘制路径(GraphicsPath)
路径是一系列图形的组合
GraphicsPath的方法
| 描述 |
方法 |
|
路径形成
|
• AddArc
• AddBezier
• AddBeziers
• AddClosedCurve
• AddEl ipse
• AddLine
• AddLines
• AddPath
• AddPie
• AddPolygon
• AddRectangle
• AddRectangles
• AddString
|
|
路径绘制
|
• DrawPath
|
|
路径填充
|
• FillPath
|
DEMO5:路径绘制
四、文本和字体
Font类
FontFamiliy:字体家族,如Times New Roman、宋体等
字体大小:float类型
字体风格
Bold:粗体
Italic:斜体
Regular:正规
Strikeout:加删除线
Underline:加下划线
例如:
Font myFont = new Font(“宋体”,16,FontStyle.Bold|FontStyle.Italic);
以上代码创建了宋体家族的字体对象,字体大小为16,样式为粗斜体。
DrawString的使用方法
DrawString(string,Font,Brush,PointF);
DrawString(string,Font,Brush,RectangleF);
DrawString(string,Font,Brush,PointF,StringFormat);
DrawString(string,Font,Brush,RectangleF,StringFormat);
DrawString(string,Font,Brush,float,float);
DrawString(string,Font,Brush,float,float,StringFormat);
DEMO6:文字绘制
反锯齿
消除锯齿:指对绘制的图形和文本的粗糙边缘进行平滑处理以改进它们的外观或可读性。
修改Graphics对象的TextRenderingHint属性,取值为:TextRenderingHint.AntiAlias、TextRenderingHint.AntiAliasGridFit、TextRenderingHint.ClearTypeCridFit、TextRenderingHint.SingleBitPerPixel、TextRenderingHint.SingleBitPerPixelGridFit、TextRenderingHint.SystemDefault
位于System.Drawing.Text名称空间中
TextRenderingHint属性
| 属性 |
描述 |
|
AntiAlias
|
在无提示的情况下使用每个字符的消除锯齿效果标志符号位图来绘制字符。由于采用了AntiAlias,质量会得到改善。由于关闭了提示,主干宽度差可能会比较明显。
|
|
AntiAliasGridFit
|
在有提示的情况下使用每个字符的消除锯齿效果标志符号位图来绘制字符。由于采用了AntiAlias,质量会得到大大改善,但同时会增加性能成本。
|
|
ClearTypeGridFit
|
在有提示的情况下使用每个字符的标志符号ClearType位图来绘制字符。这是质量最高的设置。用于利用ClearType字体功能。
|
|
SingleBitPerPixel
|
使用每个字符的标志符号位图来绘制字符。不使用提示。
|
|
SingleBitPerPixelGridFit
|
使用每个字符的标志符号位图来绘制字符。提示用于改善字符在主干和弯曲部分的外观。
|
|
SystemDefault
|
有系统默认呈现提示的情况下使用每个字符的标志符号位图来绘制字符。将采用用户为系统选择的任何字体修匀设置来绘制文本。
|
DEMO7:反锯齿示例
五、双缓冲
闪烁是图形编程的一个常见问题。需要多重复杂绘制操作的图形操作会导致呈现的图像闪烁或具有其他不可接受的外观。为解决这些问题,.NET Framework2.0 提供了对双缓冲的使用。
双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。因为在屏幕上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁。
使用双缓冲
默认情况下,标准Windows 窗体控件是双缓冲的。
可以通过两种方法对窗体和所创作的控件启用默认双缓冲。
一种方法是将DoubleBuffered属性设置为true,另一种方法是通过调用SetStyle方法将OptimizedDoubleBuffer标志设置为true。两种方法都将为窗体或控件启用默认双缓冲并提供无闪烁的图形呈现。建议仅对已为其编写所有呈现代码的自定义控件调用SetStyle方法。
双缓冲相关类
BufferedGraphicsContext:负责单独分配和管理图形缓冲区。Allocate 方法可以创建BufferedGraphics。
BufferedGraphics:为双缓冲提供图形缓冲区。可以用Render()方法写入图形缓冲区的内容。
手动管理缓冲图形
BufferedGraphicsContext currentContext= BufferedGraphicsManager.Current;
BufferedGraphics myBuffer = currentContext.Allocate(Form1.CreateGraphics(), Form1.DisplayRectangle);
myBuffer.Graphics.DrawEllipse(Pens.Blue, Form1.DisplayRectangle);
myBuffer.Render();
myBuffer.Dispose();
DEMO8:双缓冲
本系列文章快速导航: