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: est.bmp");

  Graphics g = Graphics.FromImage(mbit);

  }

  2、Graphics类的属性

  3、Graphics类的常用方法

  二、坐标系统

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

  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用来表示一个矩形,常用属性如下:

  其常用构造函数为:

  //参数为矩形左上角坐标的点结构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个命名颜色。。常用方法如下:

  创建实例

  //创建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类

  Color myColor = ColorTranslator.FromHtml("Blue");

  Color myColor = ColorTranslator.FromHtml("H00000");

  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+的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  您可能感兴趣的文章: