C#GDI+绘图技术分享

C#GDI+绘图技术分享

GDI+是GDI的后继者,它是.NET Framework为操作图形提供的应用程序编程接口,主要用在窗体上绘制各种图形图像和创建自定义图像。

GDI+主要提供了以下命名空间类型(来源于: 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 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)