C#GDI+绘图技术分享
GDI+是GDI的后继者,它是.NET Framework为操作图形提供的应用程序编程接口,主要用在窗体上绘制各种图形图像和创建自定义图像。
GDI+主要提供了以下命名空间类型(来源于: https://www. microsoft.com/zh-cn/ 官方文档说明):
一、System.Drawing 提供对 GDI + 基本图形功能的访问权限。
类
ColorConverter | 将颜色从一种数据类型转换为另一种数据类型。 通过 TypeDescriptor 访问此类。 |
ColorTranslator | 将颜色翻译成 GDI+ Color 结构并从该结构翻译颜色。 此类不能被继承。 |
PointConverter | 将 Point 对象从一种数据类型转换为另一种数据类型。 |
RectangleConverter | 将矩形从一种数据类型转换为另一种数据类型。 通过 TypeDescriptor 访问此类。 |
SizeConverter | SizeConverter 类用于从一种数据类型转换为另一种类型。 通过 TypeDescriptor 对象访问此类。 |
SizeFConverter | 将 SizeF 对象从一种类型转换成另一种类型。 |
SystemColors | SystemColors 类的每个属性都是 Color 结构,这种结构是 Windows 显示元素的颜色 |
二、System.Drawing.Drawing2D 提供高级二维和矢量图形功能。
类:
AdjustableArrowCap | 表示可调整的箭头形状的线的末端。 此类不能被继承。 |
Blend | 定义 LinearGradientBrush 对象的混合图案。 此类不能被继承。 |
ColorBlend | 定义用于在多色渐变中以内插值取代颜色混合的颜色和位置的数组。 此类不能被继承。 |
CustomLineCap | 封装自定义的用户定义的线帽。 |
GraphicsContainer | 表示图形容器的内部数据。 当使用 Graphics 和 BeginContainer() 方法保存 EndContainer(GraphicsContainer) 对象的状态时使用此类。 此类不能被继承。 |
GraphicsPath | 表示一系列相互连接的直线和曲线。 此类不能被继承。 |
GraphicsPathIterator | 提供循环访问 GraphicsPath 中的子路径并测试每一子路径中包含的形状类型的能力。 此类不能被继承。 |
GraphicsState | 表示 Graphics 对象的状态。 该对象通过调用 Save() 方法返回。 此类不能被继承。 |
HatchBrush | 用阴影样式、前景色和背景色定义矩形画笔。 此类不能被继承。 |
LinearGradientBrush | 使用线性渐变封装 Brush。 此类不能被继承。 |
Matrix | 封装表示几何变换的 3x3 仿射矩阵。 此类不能被继承。 |
PathData | 包含构成 GraphicsPath 对象的图形数据。 此类不能被继承。 |
PathGradientBrush | 封装 Brush 对象,它通过渐变填充 GraphicsPath 对象的内部。 此类不能被继承。 |
RegionData | 封装构成 Region 对象的数据。 此类不能被继承。 |
三、System.Drawing.Imaging 提供高级 GDI+ 图像处理功能。 基本图形功能由 System.Drawing 命名空间提供。
BitmapData | 指定位图图像的特性。 BitmapData 类由 LockBits 类的 UnlockBits(BitmapData) 和 Bitmap 方法使用。 不可继承。 |
ColorMap | 定义转换颜色的映射。 ImageAttributes 类的几种方法可使用颜色重新映射表来调整图像颜色,该表是 ColorMap 结构的数组。 不可继承。 |
ColorMatrix | 定义包含 RGBAW 空间坐标的 5 x 5 矩阵。 ImageAttributes 类的若干方法通过使用颜色矩阵调整图像颜色。 此类不能被继承。 |
ColorPalette | 定义组成调色板的颜色的数组。 这些颜色是 32 位 ARGB 颜色。 不可继承。 |
Encoder | Encoder 对象封装一个全局唯一标识符 (GUID),它标识图像编码器参数的类别。 |
EncoderParameter | 用于向图像编码器传递值或值数组。 |
EncoderParameters | 封装 EncoderParameter 对象的数组。 |
FrameDimension | 提供获取图像的框架维度的属性。 不可继承。 |
ImageAttributes | 包含有关在呈现时如何操作位图和图元文件颜色的信息。 |
ImageCodecInfo | ImageCodecInfo 类可提供必要的存储成员和方法,以检索与已安装的图像编码器和解码器(统称编码解码器)相关的所有信息。 不可继承。 |
ImageFormat | 指定图像的文件格式。 不可继承。 |
Metafile | 定义图形图元文件。 图元文件包含描述一系列图形操作的记录,这些操作可被记录(构造)和回放(显示)。 此类不能继承。 |
MetafileHeader | 包含关联的 Metafile 的特性。 不可继承。 |
MetaHeader | 包含有关 Windows 格式 (WMF) 图元文件的信息。 |
PropertyItem | 封装要包括到图像文件中的元数据属性。 不可继承。 |
WmfPlaceableFileHeader | 定义可放置的图元文件。 不可继承。 |
四、System.Drawing.Printing 把打印机或打印预览窗体作为输出设备时使用的类。
InvalidPrinterException | 表示当尝试用无效的打印机设置来访问打印机时所引发的异常。 |
Margins | 指定打印页的边距尺寸。 |
MarginsConverter | 为 MarginsConverter 提供一个 Margins。 |
PageSettings | 指定应用于单页打印的设置。 |
PaperSize | 指定纸张大小。 |
PaperSource | 指定给打印机送纸的纸盒。 |
PreviewPageInfo | 为单页指定打印预览信息。 此类不能被继承。 |
PreviewPrintController | 指定一个打印控制器,它在屏幕上将文档显示为一系列图像。 |
PrintController | 控制在从 Windows 窗体应用程序打印时如何打印文档。 |
PrintDocument | 从 Windows 窗体应用程序打印时,定义一种可重用的可发送到打印机上的对象。 |
PrinterResolution | 表示打印机支持的分辨率。 |
PrinterSettings | 指定有关在从 Windows 窗体应用程序打印时如何打印文档的信息,包括打印文档的打印机。 |
PrinterSettings.PaperSizeCollection | 包含 PaperSize 对象的集合。 |
PrinterSettings.PaperSourceCollection | 包含 PaperSource 对象的集合。 |
PrinterSettings.PrinterResolutionCollection | 包含 PrinterResolution 对象的集合。 |
PrinterSettings.StringCollection | 包含 String 对象的集合。 |
PrinterUnitConvert | 指定在与 Win32 打印 API 互操作时使用的一系列转换方法。 此类不能被继承。 |
PrintEventArgs | 提供有关 BeginPrint 和 EndPrint 事件的数据。 |
PrintingPermission | 控制对打印机的访问。 此类不能被继承。 |
PrintingPermissionAttribute | 允许进行声明打印权限检查。 |
PrintPageEventArgs | 为 PrintPage 事件提供数据。 |
QueryPageSettingsEventArgs | 为 QueryPageSettings 事件提供数据。 |
StandardPrintController | 指定一个打印控制器,它向打印机发送信息。 |
五、 System.Drawing.Design 一些提前定义的对话框、属性表和其它用户界面元素,与在设计期间扩展用户界面相关。
类:
CategoryNameCollection | 表示类别名称字符串的集合。 |
命名空间中的 System.Drawing.Design 类不支持在服务或Windows http:// ASP.NET 使用。 尝试从这些应用程序类型之一内使用这些类可能会产生意外问题,例如服务性能降低和运行时异常 。
六、System.Drawing.Text 对字体和字体系列运行更高级操作的类。
FontaCollection
FontCollection | 为已安装的字体集合和私有字体集合提供基类。 |
InstalledFontCollection | 表示安装在系统上的字体。 此类不能被继承。 |
PrivateFontCollection | 提供一个字体系列集合,该集合是基于客户端应用程序提供的字体文件生成的。 |
以上内容介绍了GDI+中所包含的主要API功能,下面将实际演示在C#代码中实际的GDI+功能的部分应用
Graphics 类
该类位于System.Drawing.Common.dll程序集下面的 System.Drawing 命名空间中封装了一个GDI+绘图画面是GDI+的核心,它提供将对象绘制到显式设备的方法。Graphics类封装了绘制直线、曲线、圆形、图像和文本的方法,是一切GDI+操作的基础类。在绘图之前,必须在指定的窗体上创建一个Graphics对象,才能调用Graphics类的方法画图。
创建Graphics类的几种常用方法:
方法一(通过该类提供的静态方法创建):
public static Graphics FromHdc(IntPtr hdc);//设备上下文的指定句柄创建新的 Graphics 。
private void FromHdcHdc(PaintEventArgs e)
// 获取设备上下文句柄
IntPtr hdc = e.Graphics.GetHdc();
Graphics newGraphics = Graphics.FromHdc(hdc);
newGraphics.DrawRectangle(new Pen(Color.Red, 3), 0, 0, 200, 100);
e.Graphics.ReleaseHdc(hdc);
newGraphics.Dispose();
public static Graphics FromHdcInternal(IntPtr hdc);//返回指定设备上下文的 Graphics 。
public static Graphics FromHwnd(IntPtr hwnd);//从窗口的指定句柄创建新的 Graphics 。
public static Graphics FromHwndInternal(IntPtr hwnd);//为指定 Windows 控制代码建立新的 Graphics 。
public static Graphics FromImage(Image image);//为指定的图片创建Graphics。
Graphics绘制方法:
DrawString(string,font,brush,Ponitf) //用指定的brush和font对像在指定的矩形或点绘制指定的字符串;
DrawLine(Pen,ponit,ponit) //用指定的笔(pen)对像绘制指定两点之间直线;
DrawPolygon(Pen,ponit[]) //用指定的笔(pen)对像绘制指定多边形,比如三角形,四边形等等;
FillPolygon(Brush,ponit[]) //用指定的刷子(brush)对像填充指定的多边形;
DrawEllipse(Pen,x,y,width,height) //用指定的笔绘制一个边框定义的椭圆;
FillEllipse(Brush,x,y,width,height) //用指定的刷子填充一个边框定义的椭圆;
DrawRectangle(Pen,x,y,width,height) //用指定的笔绘制一个指定坐标点、宽度、高度的矩形;
DrawPie(Pen,x,y,width,height,startangle,sweepangle) //用指定的笔绘制一个指定坐标点、宽度、高度以及两条射线组成的扇形;
使用Graphics在屏幕上绘制文字:
[DllImport("User32.dll")]
public extern static System.IntPtr GetDC(System.IntPtr hWnd);
Thread th = null;
public Form1()
InitializeComponent();
System.IntPtr DesktopHandle = GetDC(System.IntPtr.Zero);
Graphics g = Graphics.FromHdc(DesktopHandle);
g.DrawString("测试文字", new Font("宋体",18),new SolidBrush(Color.Red),new PointF(10,10));
}
使用Graphics在图片上绘制
Image img = Image.FromFile("test.jpg");//建立Image对象
Graphics g = Graphics.FromImage(img);//创建Graphics对象
在Winform窗体上绘制
private void Form_Paint(object sender, PaintEventArgs e)