GDI+:Graphics Device Interface Plus也就是图形设备接口,提供了各种丰富的图形图像处理功能;在C#.NET中,使用GDI+处理二维(2D)的图形和图像,使用DirectX处理三维(3D)的图形图像。
图形图像处理用到的主要命名空间是System . Drawing:提供了对GDI+基本图形功能的访问,主要有Graphics类、Bitmap类、从Brush类继承的类、Font类、Icon类、Image类、Pen类、Color类等.
1.画板——Graphics对象
创建一个画板主要有3种方式:
A: 在窗体或控件的Paint事件中直接引用Graphics对象
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics; //创建画板,这里的画板是由Form提供的.
Pen p = new Pen(Color.Blue, 2);//定义了一个蓝色,宽度为的画笔
g.DrawLine(p, 10, 10, 100, 100);//在画板上画直线,起始坐标为(10,10),终点坐标为(100,100)
}
B: 利用窗体或某个控件的CreateGraphics方法
Graphics g = this.CreateGraphics();
C: 从继承自图像的任何对象创建Graphics对象private int letterWidth = 100; //单个字体的最大宽度和高度
private int letterHight = 30;
Bitmap image = new Bitmap(letterWidth, letterHight); //创建图片背景
Graphics g = Graphics.FromImage(image);
g.Clear(Color.AliceBlue); //用系统的颜色清除画面并填充背景
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //指定画面呈现模式——消除锯齿
2.画笔——Pen
Pen的属性主要有: Color(颜色),DashCap(短划线终点形状),DashStyle(虚线样式),EndCap(线尾形状), StartCap(线头形状),Width(粗细)等.我们可以用Pen 来画虚线,带箭头的直线等线性图形。
Pen p = new Pen(Color.Blue, 2);//颜色,宽度
p.DashStyle = DashStyle.Dot;//定义虚线的样式 using System.Drawing.Drawing2D;
p.DashPattern = new float[] { 2, 1 };//设置短划线和空白部分的数组
p.EndCap = LineCap.ArrowAnchor;//定义线尾的样式为箭头,只对不封闭曲线有用
g.DrawLine(p, 10, 10, 100, 100);//画直线
g.DrawRectangle(p, 10, 10, 100, 100);//画矩形
g.DrawEllipse(p, 10, 10, 100, 100);//画椭圆
g.Dispose();
p.Dispose();
3.画刷——Brush
作用:我们可以用画刷填充各种图形形状,如矩形、椭圆、扇形、多边形和封闭路径等,主要有几种不同类型的画刷:SolidBrush:画刷最简单的形式,用纯色进行绘制 HatchBrush:类似于 SolidBrush,但是可以利用该类从大量预设的图案中选择绘制时要使用的图案,而不是纯色TextureBrush:使用纹理(如图像)进行绘制 LinearGradientBrush:使用沿渐变混合的两种颜色进行绘制PathGradientBrush :基于编程者定义的唯一路径,使用复杂的混合色渐变进行绘制Graphics g = this.CreateGraphics();
Rectangle rect = new Rectangle(10, 10, 50, 50);//定义矩形
//单色填充
SolidBrush b1 = new SolidBrush(Color.Blue);
//用图片填充
TextureBrush b2 = new TextureBrush(Image.FromFile(@"e:picture1.jpg"));
//用渐变色填充
LinearGradientBrush b3 = new LinearGradientBrush(rect, Color.Yellow , Color.Black , LinearGradientMode.Horizontal);
g.FillRectangle(b3, rect);
g.DrawString("字符串", new Font("宋体", 10), b1, new PointF(90, 10));
4.字体——Font
using System.Drawing.Drawing2D;
string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };Font f = new Font(font[findex], 13,FontStyle.Bold);//字体样式(参数2为字体大小)
string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
Font f = new Font(font[findex], 13,FontStyle.Bold);//字体样式(参数2为字体大小)
或者
Font f = new Font(FontFamily.GenericSerif, 15, FontStyle.Bold);
其中,FontStyle 枚举量有:
Regular普通文本。
Bold 加粗文本。
Italic 倾斜文本。
Underline 带下划线的文本。
Strikeout 中间有直线通过的文本。
5.Draw方法
5.1 画直线——DrawLine
public void DrawLine(Pen pen, PointF pt1, PointF pt2);
public void DrawLine(Pen pen, float x1, float y1, float x2, float y2);
public void DrawLine(Pen pen, int x1, int y1, int x2, int y2);
public void DrawLines(Pen pen, Point[] points);
public void DrawLines(Pen pen, PointF[] points);
5.2 画矩形——DrawRectangle
public void DrawRectangle(Pen pen, Rectangle rect);
public void DrawRectangle(Pen pen, float x, float y, float width, float height);
public void DrawRectangle(Pen pen, int x, int y, int width, int height);
public void DrawRectangles(Pen pen, Rectangle[] rects);
public void DrawRectangles(Pen pen, RectangleF[] rects);
5.3 画字符串——DrawString
public void DrawString(string s, Font font, Brush brush, PointF point);
public void DrawString(string s, Font font, Brush brush, RectangleF layoutRectangle);
public void DrawString(string s, Font font, Brush brush, float x, float y);
public void DrawString(string s, Font font, Brush brush, PointF point, StringFormat format);
public void DrawString(string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format);
public void DrawString(string s, Font font, Brush brush, float x, float y, StringFormat format);
PS:关于StringFormat:定义文字的对齐格式
StringFormat format = new StringFormat(StringFormatFlags.NoClip);
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
Font f = new System.Drawing.Font("宋体", 13, System.Drawing.FontStyle.Bold);
Brush b = new System.Drawing.SolidBrush(Color.Red);
g.DrawString("hello", f, b, 1, 1, format);
6.坐标系变换
在winform中的坐标轴和我们平时接触的平面直角坐标轴不同,winform中的坐标轴方向完全相反:窗体的左上角为原点(0,0),水平向左则X增大,垂直下向则Y增大。
g.RotateTransform(30); //坐标轴绕原点顺时针旋转30度
g.TranslateTransform(100, 100); //坐标轴以(100,100)为原点
g.ResetTransform();//恢复坐标轴坐标,即以窗体的(0,0)点为原点