C#中的GDI+图像编程详解

一、Graphics

GDI+是GDI(Windows Graphics Device Interface)的后继者,它是.NET Framework为操作图形提供的应用程序编程接口,主要用在窗体上绘制各种图形图像,可以用于绘制各种数据图像、数学仿真等。

Graphics类是GDI+的核心,它提供将对象绘制到显式设备的方法。Graphics类封装了绘制直线、曲线、圆形、图像和文本的方法,是一切GDI+操作的基础类。在绘图之前,必须在指定的窗体上创建一个Graphics对象,才能调用Graphics类的方法画图。

1、创建Graphics类对象

1、Paint事件
在窗体或控件的Paint事件中创建,将其作为PaintEventArgs的一部分。在为控件创建绘制代码时,通常会使用此方法。  

例如,在Paint事件中创建Graphics对象:

public partial class Form1 : Form
{
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        Graphics g = e.Graphics; // e.ClipRectangle;//剪切区域,即被遮挡的部分
        g.DrawLine(Pens.Wheat, 0, 0, 2, 2);
    }
}

2、 CreateGraphics方法
调用窗体或控件的CreateGraphics方法可以获取对Graphics对象的引用,该对象表示控件或窗体的绘图画面。如果在已存在的窗体或控件身上绘图,应该使用此方法

例如,在窗体的Load事件中,通过CreateGraphics方法创建Graphics对象

private void Form1_Load(object sender, EventArgs e)    //窗体的Load事件
{
    Graphics g;    //声明一个Graphics对象
    g = this.CreateGraphics();
}

3 、Graphics.FromImage方法
由从Image继承的任何对象创建Graphics对象,调用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    获取或设置 Region,它限定此 Graphics 的绘图区域。
  • ClipBounds    获取一个 RectangleF 结构,该结构限定此 Graphics 的剪辑区域。
  • VisibleClipBounds    获取此 Graphics 的可见剪辑区域的边框。
  • CompositingQuality    获取或设置绘制到此 Graphics 的合成图像的呈现质量。
  • SmoothingMode    获取或设置此 Graphics 的呈现质量。
  • DpiX    获取此 Graphics 的水平分辨率。
  • DpiY    获取此 Graphics 的垂直分辨率。
  • PageScale    获取或设置此 Graphics 的世界单位和页单位之间的比例。
  • PageUnit    获取或设置用于此 Graphics 中的页坐标的度量单位。

3、Graphics类的常用方法

  • 画线条
    DrawLine    绘制一条连接由坐标对象指定的两个点的线条
    DrawLines    绘制一列连接一组Point结构的线段
    DrawBezier    绘制由四个Point结构定义的贝塞尔样条
    DrawBeziers    从Point结构的数组绘制一系列贝塞尔样条
    DrawCurve    绘制经过一组指定的Point结构的基数样条
  • 画可填充线条
    DrawEllipse    绘制一个由一对坐标、宽度和高度指定的椭圆
    DrawPath    绘制GraphicsPath对象
    DrawPie    绘制一个扇形,该扇形由一个坐标对象,宽度和高度,以及两条射线所指定的椭圆指定
    DrawPolygon    绘制由一组Point结构定义的多边形
    DrawRectangle    绘制由坐标对。宽度和高度指定的矩形
    DrawRectangles    绘制一系列由Rectangle结构指定的矩形
    DrawArc    绘制一段弧线,它表示由一对坐标、宽高指定的椭圆部分
  • 填充区域
    FillEllipse    填充边框所定义的椭圆内部,该边框由一对坐标、一个高度和一个宽度指定
    FillPath    填充GraphicsPath对象的内部
    FillPie    填充扇形内部
    FillPolygon    填充多边形内部
    FillRectangle    填充由一对坐标、一个宽度和一个高度指定的矩形内部
    FillRectangles    填充由Rectangle结构指定的一些列矩阵的内部
    FillRegion    填充Region对象的内部
  • 画字符串、图画、图标
    DrawString    在指定位置并且用指定的Brush和Font对象绘制指定的文本字符串
    DrawIcon    在指定坐标处绘制由指定的Icon对象表示的图像
    DrawImage    在指定的位置并且按原始大小绘制指定的Image对象
  • 其他
    MeasureString(String, Font)    测量用指定的 Font 绘制的指定字符串。
    FromImage    从指定的Image对象创建行的Graphics对象
    Save    保存此Graphics对象的当前状态,并且GraphicsState对象标识保存的状态
    Clear    清除整个绘图面并以指定背景色填充
    Dispose    释放由此Graphics对象使用的所有资源

二、坐标系统

GDI+定义了三种坐标系统,并提供了三种坐标转换的方法Graphics.TransformPoints()。

  • 全局坐标系统。
  • 页面(Page)坐标系统:左上角为原点,横向x轴向右为正方向,纵向y轴向下为正方向。单位为像素。这是默认的坐标系统。
  • 设备坐标系统:可以指定特定测量单位的页面(Page)坐标系统。如果单位为像素,和页面(Page)坐标系统相同。

1、点结构:Point和PointF

点结构有两个成员:X,Y,表示点的x轴和y轴的坐标。其常用构造函数如下:

Point p1=new Point(int X,int Y);//X,Y为整数
PointF p2=new PointF(float X,floa Y);//X,Y为浮点数

2、尺寸结构Size和SizeF

Size和SizeF用来表示尺寸大小,有两个成员:Width和Height。常用构造函数如下:

public Size(int width,int height);
public SizeF(float width,float height);

3、矩形结构Rectangle和RectangleF

结构Rectangle和RectangleF用来表示一个矩形,常用属性如下:

  • Top、Left,Bottom, Right:Rectangle结构坐标
  • Width、Height:获取或设置此Rectangle结构的宽、高度。
  • Size:获取或设置此Rectangle的大小。
  • X、Y:获取或设置此Rectangle结构左上角的x,Y坐标。

其常用构造函数为:

//参数为矩形左上角坐标的点结构location和代表矩形宽和高的Size结构size
Rectangle(Point location,Size size);//参数也可为PointF和SizeF
//参数为矩形左上角x和y坐标,宽,高
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类本身没有提供显示创建路径的功能,所以需要把路径对象传给Graphics类的一个方法来显示
g.DrawPath(Pens.Black, gp);
g.FillPath(Brushes.Orange, gp);//给路径填充橘黄色,
gp.Dispose();
g.Dispose();

5、区域类Region类

Region类表示由矩形或由路径构成图形形状的内部

1、从GraphicsPath路径对象中创建区域,

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对象创建Region对象
//填充区域
g.FillRegion(Brushes.Green, reg);

2.从各类图形中创建:

Region reg = new Region(new Rectangle(10, 10, 80, 20));

3.从一个区域中创建另一个区域

Region r1 = new Region(new Rectangle(10, 10, 80, 20));
RegionData r1Data = r1.GetRegionData();//区域数据
Region r2 = new Region(r1Data);  //构造函数不接受区域对象本身,可以接受区域数据数组。

4.区域的并集和交集

示例:

Graphics g = e.Graphics;
Rectangle rect1 = new Rectangle(50, 10, 50, 130);
Rectangle rect2 = new Rectangle(10, 50, 130, 50);
//设置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结构

Color结构表示颜色,结构中包含一个无符号32位数代表颜色。任何一种颜色可以用ARGB颜色(alpha、红、绿、蓝)表示。Color结构通过表态属性公开了140个命名颜色。。常用方法如下:

  • public static Color FromArgb(int alpha,int rr,int gg,int bb);
    从四个分量(透明度、红色、绿色和蓝色)值创建Color结构。每个分量的值仅限于8位(小于256)。alpha值表示透明度,=0为完全透明,=255为完全不透明
  • public static Color FromArgb(int rr,int gg,int bb);
    从指定的8位颜色值(红色、绿色和蓝色)创建Color结构。透明度值默认为255(完全不透明)。每个分量的值仅限于8位(小于256)。红色为(255,0,0),绿色为(0,255,0),蓝色为(0,0,255)。
  • public static Color FromArgb(int alpha,Color color);
    从指定的Color结构创建新Color结构,使用新指定的透明度值alpha。alpha值仅限于8位。

创建实例

//创建Color实例的参数为 r,g,b; //参数为红,绿,蓝三种原色,透明度为默认,即完全不透明.
Color cl = Color.FromArgb(200, 200, 200);

//调用静态FromName方法
Color cl = Color.FromName("PowderBlue");  //字符串参数必须包含一个KnownColor枚举值的名称.

使用颜色:

Color red=Color.Red;
red.GetBrightness();
red.GetHue();
red.GetSaturation();

2、ColorTranslator类

  • FromHtml(String)    将 HTML 颜色表示形式翻译成 GDI+ Color 结构。
Color myColor = ColorTranslator.FromHtml("Blue");
Color myColor = ColorTranslator.FromHtml("H00000");
  • ToHtml(Color)    将指定的 Color 结构翻译成 HTML 字符串颜色表示形式。
string htmlColor = ColorTranslator.ToHtml( Color.Red);
string htmlColor = ColorTranslator.ToHtml( Color.FromArgb(255,255,255));

四、画笔Pen类

画笔,定义用于绘制直线和曲线的对象。

定义画笔:

Pen pen1 = new Pen(Color, Single); //参数为颜色Color,单精度浮点数Sigle;宽度默认为1;
Pen pen2 = Pen(Brush, Single);  // 使用指定的 Pen 和 Brush 初始化 Width 类的新实例。

使用画笔:

//画实线
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

画刷:定义用于填充图形形状(如矩形、椭圆、饼形、多边形和封闭路径)的内部的对象。只是一个抽象基类。

Rectangle rect1 = new Rectangle(20, 80, 250, 100);

// (实心实心刷)
SolidBrush sbrush = new SolidBrush(Color.DarkOrchid);

//(纹理刷)
TextureBrush textureBrush = new TextureBrush(new Bitmap(@"e:/123.jpg"));

//(梯度、线性渐进刷)
LinearGradientBrush lbrush = new LinearGradientBrush(rect1, Color.DarkOrange, Color.Aquamarine, 45);

//路径渐进画刷
PathGradientBrush pathbrush = new PathGradientBrush(graphicsPath);

//(阴影刷)
HatchBrush hbrush = new HatchBrush(HatchStyle.DiagonalCross, Color.DarkOrange, Color.Aquamarine);

e.Graphics.FillRectangle(sbrush, rect1);         // (实心刷)
e.Graphics.FillRectangle(textureBrush, rect1);       //(纹理刷)
e.Graphics.FillRectangle(lbrush, rect1);            //(梯度刷)
e.Graphics.FillRectangle(hbrush, rect1);             //(阴影刷)

六、字体 Font

Font类有两个构造函数:

第一个是new Font(字体名称,字号),例如,label1.Font=new Font("黑体",9)。

第二个是new Font(字体名称,字号,字体风格),其中第三个参数是枚举类型。

定义字体:

//例如修改标签控件字体为斜体:
label1.Font=new Font("黑体",9,label1.Font.Style|FontStyle.Italic);

//修改标签控件字体不为斜体:
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));

七、图像

图像Image类、打印Printing相关

到此这篇关于C#图像编程GDI+的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#使用GDI+创建缩略图实例

    本文实例讲述了C#使用GDI+创建缩略图的方法,分享给大家供大家参考.具体方法分析如下: C#的Gdi+还是相当好用的.创建缩略图步骤如下: 1. Image保存图像,需要一个CLSID的参数,它可以这样获得: 复制代码 代码如下: int   GetEncoderClsid(const   WCHAR*   format,   CLSID*   pClsid)   {       UINT     num   =   0;                     //   number   o

  • C#利用GDI+给图片添加文字(文字自适应矩形区域)

    前言 这篇文章是 GDI+ 总结系列的第二篇,如果对 GDI+ 的基础使用不熟悉的朋友可以先看第一篇文章<C# 使用 GDI+ 画图>. 需求 需求是要做一个编辑文字的页面.用户在网页端写文字,文字区域是个矩形框,用户可以通过下方的拖动条调节文字大小. 如下图: 提交数据的时候前端传文字区域的左上角和右下角定位给后台.因为前端的字体大小单位与后端没什么关系,所以不能直接传字体大小,也就是后端要根据矩形区域以及文字内容来自己推算用什么样的字体大小合适. 简单说就是知道文字的矩形区域,以及文字内容

  • BarCode条形码基于C# GDI+ 的实现方法详解

    条形码在生活中的应用非常广泛,具体的条形码知识大家自行百度,了解条形码知识对理解下面的代码是必要的.如果只是应用的话,直接拿去就可以用了.废话不多说,上代码 复制代码 代码如下: public Bitmap GetCode39(string sourceCode)         {             int leftMargin = 5;             int topMargin = 0;             int thickLength = 2;            

  • C#利用GDI+画图的基础实例教程

    前言 最近做一个微信公众号服务,有一些简单的图片处理功能.主要就是用户在页面操作,前端做一些立刻显示的效果,然后提交保存时后端真正修改原图. 从程序设计的角度看,GDI包括两部分:一部分是GDI对象,另一部分是GDI函数.GDI对象定义了GDI函数使用的工具和环境变量,而GDI函数使用GDI对象绘制各种图形,在C#中,进行图形程序编写时用到的是GDI+(Graphics Device Interface Plus图形设备接口)版本,GDI+是GDI的进一步扩展,它使我们编程更加方便. C#中的G

  • C#常用GDI+文字操作汇总

    本文实例汇总了C#常用GDI+文字操作,包含了文字的投影.倒影.旋转等常见的效果,在进行C#应用程序开发中有不错的实用价值.分享给大家供大家参考之用.具体如下: 一.投影文字 private void Form1_Paint(object sender, PaintEventArgs e) { //投影文字 Graphics g = this.CreateGraphics(); //设置文本输出质量 g.TextRenderingHint = TextRenderingHint.ClearTyp

  • C#利用GDI+绘制旋转文字等效果实例

    本文实例讲述了C#利用GDI+绘制旋转文字等效果的方法,是非常实用的技巧.分享给大家供大家参考之用.具体如下: C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经过不少的计算过程.利用下面的类可以实现该功能. 具体实现代码如下: using System; using System.Collections.Generic; using System

  • C#图形编程GDI+基础介绍

    编写图形程序时需要使用GDI(Graphics Device Interface,图形设备接口),从程序设计的角度看,GDI包括两部分:一部分是GDI对象,另一部分是GDI函数.GDI对象定义了GDI函数使用的工具和环境变量,而GDI函数使用GDI对象绘制各种图形,在C#中,进行图形程序编写时用到的是GDI+(Graphice Device Interface Plus图形设备接口)版本,GDI+是GDI的进一步扩展,它使我们编程更加方便. GDI+概述 GDI+是微软在Windows 2000

  • C# 使用 GDI+ 实现添加中心旋转(任意角度)的文字

    前言 这篇文章是 GDI+ 总结系列的第三篇,如果对 GDI+ 的基础使用不熟悉的朋友可以先看第一篇文章<C# 使用 GDI+ 画图>. 需求 需求是要实现给图片添加任意角度旋转的文字,文字的旋转中心要是在文字区域中央,就像 CSS 的 rotate 函数一样的效果.如下: 分析&思路 Graphics 类有个 RotateTransform 方法,可以传入任意角度的值来旋转画板.但是这个方法的旋转中心是画板的左上角,所以直接单单用这个方法不能满足我们的需求.此外, Graphics

  • C#中的GDI+图像编程详解

    一.Graphics GDI+是GDI(Windows Graphics Device Interface)的后继者,它是.NET Framework为操作图形提供的应用程序编程接口,主要用在窗体上绘制各种图形图像,可以用于绘制各种数据图像.数学仿真等. Graphics类是GDI+的核心,它提供将对象绘制到显式设备的方法.Graphics类封装了绘制直线.曲线.圆形.图像和文本的方法,是一切GDI+操作的基础类.在绘图之前,必须在指定的窗体上创建一个Graphics对象,才能调用Graphic

  • Java编程中的HashSet和BitSet详解

    Java编程中的HashSet和BitSet详解 我在Apache的开发邮件列表中发现一件很有趣的事,Apache Commons包的ArrayUtils类的removeElements方法,原先使用的HashSet现在换成了BitSet. HashSet<Integer> toRemove = new HashSet<Integer>(); for (Map.Entry<Character, MutableInt> e : occurrences.entrySet()

  • JavaScript中的函数式编程详解

    函数式编程 函数式编程是一种编程范式,是一种构建计算机程序结构和元素的风格,它把计算看作是对数学函数的评估,避免了状态的变化和数据的可变,与函数式编程相对的是命令式编程.我们有这样一个需求,给数组的每个数字加一: // 数组每个数字加一, 命令式编程 let arr = [1, 2, 3, 4]; let newArr = []; for(let i = 0; i < arr.length; i++){ newArr.push(arr[i] + 1); } console.log(newArr)

  • C#中的Socket编程详解

    目录 一,网络基础 二,Socket 对象 SocketType ProtocolType AddressFamily 三,Bind() 绑定与 Connect() 连接 Bind() Connect() 四,Listen() 监听请求连接 和 Accept() 接收连接请求 Listen() Accept() 五,Receive() 与 Send() Receive() 参数 返回 Send() 六,释放资源 close() 七,IPAddress 和IPEndPoint IPAddress

  • python中模块的__all__属性详解

    python模块中的__all__属性,可用于模块导入时限制,如: from module import * 此时被导入模块若定义了__all__属性,则只有__all__内指定的属性.方法.类可被导入. 若没定义,则导入模块内的所有公有属性,方法和类 # kk.py class A(): def __init__(self,name,age): self.name=name self.age=age class B(): def __init__(self,name,id): self.nam

  • PHP 中魔术常量的实例详解

    PHP 中魔术常量的实例详解 本文介绍下,php编程中的魔术常量,掌握并灵活应用这些方法与常量,对于提高php的编程水平,有很大的帮助.有需要的朋友参考学习下. 魔术常量: namespace ns1; class Test { function __construct() { var_dump(__LINE__); var_dump(__FILE__); var_dump(__DIR__); var_dump(__FUNCTION__); var_dump(__CLASS__); var_du

  • Python网络编程详解

    1.服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的"服务".它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多请求. 2.客户端/服务器架构既可以应用于计算机硬件,也可以应用于计算机软件. 3.在服务器响应客户端之前,首先会创建一个通信节点,它能够使服务器监听请求. 一.套接字:通信端点 1.套接字 套接字是计算机网络数据结构,它体现了上节中所描述的"通信端点"的概念.在任何类型的通信开始之前,网络应用程序必须创建套接字

  • Android通过json向MySQL中读写数据的方法详解【读取篇】

    本文实例讲述了Android通过json向MySQL中读取数据的方法.分享给大家供大家参考,具体如下: 首先 要定义几个解析json的方法parseJsonMulti,代码如下: private void parseJsonMulti(String strResult) { try { Log.v("strResult11","strResult11="+strResult); int index=strResult.indexOf("[");

  • Java中CountDownLatch进行多线程同步详解及实例代码

    Java中CountDownLatch进行多线程同步详解 CountDownLatch介绍 在前面的Java学习笔记中,总结了Java中进行多线程同步的几个方法: 1.synchronized关键字进行同步. 2.Lock锁接口及其实现类ReentrantLock.ReadWriteLock锁实现同步. 3.信号量Semaphore实现同步. 其中,synchronized关键字和Lock锁解决的是多个线程对同一资源的并发访问问题.信号量Semaphore解决的是多副本资源的共享访问问题. 今天

  • Android通过json向MySQL中读写数据的方法详解【写入篇】

    本文实例讲述了Android通过json向MySQL中写入数据的方法.分享给大家供大家参考,具体如下: 先说一下如何通过json将Android程序中的数据上传到MySQL中: 首先定义一个类JSONParser.Java类,将json上传数据的方法封装好,可以直接在主程序中调用该类,代码如下 public class JSONParser { static InputStream is = null; static JSONObject jObj = null; static String j

随机推荐