GDI+图形图像处理技术中Pen和Brush的简单使用和简单图形的绘制(C#)
1.Graphics
Graphics对象是GDI+绘图表面,因此在Windows窗体应用程序中要使用GDI+创建绘图,必须要先创建Graphics.在给窗体注册一个Paint事件后,Graphics的创建方式有以下三种。
1)直接获取Paint事件的PaintEvenlArgs中Graphics对象(最常用)。
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g1 = e.Graphics;
}
2)从Image中创建Graphics对象。
private void Form1_Paint(object sender, PaintEventArgs e)
{
//创建一个Image对象
Bitmap imgTemp = new Bitmap(, );
Graphics g2 = Graphics.FromImage(imgTemp);
}
3)用CreateGraphics方法创建Graphics对象。
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g3 = this.CreateGraphics();
}
2.Pen
在Graphics这张图纸准备好了以后,我们就可以使用Pen(钢笔)进行绘图了。Pen类位于System.Drawing名称空间中(在Windows窗体应用程序当中不需要单独引用)。最简单的创建方式为:
Pen p = new Pen(Color.White,); //创建颜色为白色,像素为1的钢笔
下面为Pen的一个应用实例
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g1 = e.Graphics; Pen p = new Pen(Color.Blue, ); //定义笔颜色蓝色,大小2个像素
g1.DrawEllipse(p, , , , ); //绘制一个椭圆,椭圆的外切矩形左上坐标为(0,80),矩形长(x)宽(y)为(60,30)
p.Dispose(); //释放Pen所占用的资源
g1.Dispose(); //释放由Graphics使用的资源
}
绘图结果如下

3.Brush
Brush(笔刷)和Pen类似,不过Brush类本身是一个抽象类不能直接实例化。GDI+的API提供五个类,扩展并提供了Brush类的具体实现。这5个类分别是:
1)SolidBrush 使用纯颜色填充图形
应用实例
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics; //SolidBrush的使用: 使用纯颜色填充图形
Brush bh = new SolidBrush(Color.Black);
g.FillEllipse(bh, , , , ); //绘制一个椭圆
bh.Dispose(); //释放资源
g.Dispose();
}
绘图结果:

2)TextureBrush 使用基于光栅的图像(位图,JPG等图像)填充图形
应用实例:
首先找一种要填充的图片,最好在项目中创建一个img文件夹,将其添加到文件夹中
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics; //TextureBrush的使用:使用基于光栅的图像(位图,JPG等图像)填充图形
string path = @"E:\软件\Microsoft Visual Studio 10.0\project\CSharp\22GDI+图形图像处理技术\22_3创建Brush对象\22_3创建Brush对象\imgs\1.png";
Bitmap img;
if (File.Exists(path))
{
img = new Bitmap(path);
Brush br = new TextureBrush(img);
g.FillEllipse(br, , , , );
br.Dispose();
}
else
MessageBox.Show("要填充的图片不存在!");
g.Dispose();
}
绘图结果

3)LinearGradientBrush 使用颜色渐变填充图形
应用实例
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics; //LinearGradientBrush:使用颜色线性渐变填充图形(需要单独引用System.Drawing.Drawing2D)
//设置渐变的起点坐标(0,110),终点坐标(60,110),颜色分别为白色和黑色
LinearGradientBrush lgb = new LinearGradientBrush(new Point(, ), new Point(, ), Color.White, Color.FromArgb(, , , ));
g.FillEllipse(lgb, , , , );
lgb.Dispose();
g.Dispose();
}
绘图结果

4)PathGradientBrush 使用渐变色填充图形,渐变方向是从有路径定义的图形边界指向图形中心
应用实例
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics; //PathGradientBrush:以自定义路径的方式渐变填充图形(需要单独引用System.Drawing.Drawing2D)
//给命名空间改名未避免错误,应该再命名空间上右键->重构->重命名(F2)
GraphicsPath gp = new GraphicsPath(); //创建路径
gp.AddEllipse(, , , ); //添加路径
PathGradientBrush pgb = new PathGradientBrush(gp); //根据路径创建笔刷
pgb.CenterColor = Color.FromArgb(, , , ); //设定中间颜色
Color[] colors = { Color.FromArgb(, , , ) };
pgb.SurroundColors = colors; //设定环绕颜色
e.Graphics.FillEllipse(pgb, , , , ); //使用笔刷绘图
pgb.Dispose();
g.Dispose();
}
绘图结果

5)HatchBrush 使用各类图案填充图形
应用实例
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics; //HatchBrush:使用各类图案填充图形(需要单独引用System.Drawing.Drawing2D)
HatchBrush hb = new HatchBrush(HatchStyle.HorizontalBrick, Color.Red, Color.Yellow); //第一个参数枚举值可以按需求更改
g.FillEllipse(hb, , , , );
hb.Dispose();
g.Dispose();
}
绘图结果

4.综合示例:绘制各种形状
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics; //获取Graphice画板
Pen p = new Pen(Color.Red, ); //建立Pen对象
g.DrawRectangle(p, , , ,); //绘制左上角坐标(10,10),长宽为(40,60)的矩形 p.Color = Color.Green; //更改画笔颜色为绿色
Point[] triangleP = {new Point(,),
new Point(,),
new Point(,)};
g.DrawPolygon(p, triangleP); //根据给定坐标绘制多边形(三角形) Point[] pentacleP = {new Point(,),
new Point(,),
new Point(,),
new Point(,),
new Point(,),
new Point(,),
new Point(,),
new Point(,),
new Point(,),
new Point(,)
};
g.DrawPolygon(p, pentacleP); //绘制正五边形 p.Color = Color.Cyan; //改变画笔颜色
g.DrawArc(p, , , , , , ); //绘制圆弧,
//(150,0)决定椭圆外切圆左上坐标.(50,50)决定矩形的长宽.(0,90)决定起始角度和扫过的角度 g.DrawPie(p, , , , , , ); //绘制扇形,参数列表和绘制圆弧一样 p.Dispose(); //释放Pen资源
g.Dispose(); //释放Graphics资源
}
绘图结果

Ps:学习过程中应用的小技巧。
1.给命名空间改名未避免错误,应该再命名空间上右键->重构->重命名(F2)
2.需要打特殊符号时,如版权符号。可以用win+R调出命令窗口,输入charmap回车,然后再里面选择。
3.使用DrawPolygon方法绘制多边形时,可以先使用其他绘图工具(如CAD)得到多边形的顶点坐标。
GDI+图形图像处理技术中Pen和Brush的简单使用和简单图形的绘制(C#)的更多相关文章
- HTML5图形图像处理技术研究
摘要:图形图像处理平台大部分是传统的C/S架构的桌面应用程序,维护困难,共享性差,而B/S架构的Web程序具有易维护.易共享的优点.本文研究了基于HTML5的Web图形图像处理技术,用HTML5实现了 ...
- php图形图像处理技术
图形图像处理技术,gd库的强大支持,PHP的图像可以是PHP的强项,PHP图形化类库,jpgraph是一款非常好用的强大的图形处理工具. 在PHP中加载GD库 gd官方网址下载: http://www ...
- GDI+图形图像处理技术——GDIPlus绘图基础
GDI+概述 GDI在windows中定义为Graphis Device interface,及图形设备接口,是Windows API(application Programming Interfac ...
- 3D图形图像处理软件HOOPS介绍及下载
HOOPS 3D Application Framework(以下简称HOOPS)是建立在OpenGL.Direct3D等图形编程接口之上的更高级别的应用程序框架.不仅为您提供强大的图形功能,还内嵌了 ...
- 【转 | 侵删】2D 绘图技术中的坐标系统与坐标变换
本文介绍在 2D 绘图技术中的坐标系统和坐标变换的相关知识.同时介绍 Kity 在这方面提供的 API .希望这些知识对于需要进行图形应用开发的同学会有所帮助. 锤子的故事 很久以前,有一个画家,他很 ...
- HTML5技术实现Web图形图像处理——WebPhotoshop精简版
WebPhotoshop精简版是利用HTML5技术在Web上实现对图形图像的处理,构建易维护.易共享.易于拓展.实时性的Web图形图像处理平台. 精简版功能包括:图形绘制.图像处理.图像操作.完整版包 ...
- [转]C#中基于GDI+(Graphics)图像处理系列之前言
直接给出原文链接吧: C#中基于GDI+(Graphics)图像处理系列之前言 链接:https://pan.baidu.com/s/1zm5TCOHqkqEfiLZuqO0UMA 提取码:qz0h
- 数字图像处理技术在TWaver可视化中的应用
数字图像处理(Digital Image Processing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程.常用的图像处理方法有图像增强.复原.编码.压缩等,数 ...
- C# GDI+双缓冲技术
我想有很多搞图形方面的朋友都会用到双缓冲技术的时候,而且有的时候她的确是个头疼的问题.最近我也要用双缓冲技术,程序怎么调试都不合适,当要对图形进行移动时,总是会出现闪烁抖动.在网上找了些资料,说得都不 ...
随机推荐
- c#查找string数组的某一个值的索引
string[] array = { "A","B","C","D","H"}; var ind ...
- leetcode 172
172. Factorial Trailing Zeroes Given an integer n, return the number of trailing zeroes in n!. Note: ...
- 监听JVM的几个命令(可用于linux 本机)
1. jstat 这个命令对于查看Jvm的堆栈信息很有用.能够查看eden,survivor,old,perm等heap的capacity,utility信息 对于查看系统是不是有能存泄漏以及参数设置 ...
- public, protected and private inheritance in C++
Get from Stackoverflow. The details can easily understand from the below example. class A { public: ...
- hashMap的get()方法,错用并发造成cpu和负载高
一次线上问题的解决 线上发现服务cpu使用达到98%,负载高达200多,64核心cpu,下面介绍解决过程: 1.top命令查出占用cpu高的进程pid 2.使用jstack -l pid >du ...
- java中值传递和引用传递
最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...
- 【java基础学习二】 数组相互转换,转成用逗号隔开的字符串等
/** * int[],Integer[],List,List<Integer>,HashSet<Integer>相互转换,转成用逗号隔开的字符串 */ public stat ...
- Linux下安装php环境并且配置Nginx支持php-fpm模块
因为php安装需要编译,所以服务器应该保证gcc和g++环境的安装 首先释放安装包: tar -xvzf php-5.6.27.tar.gz cd php-5.6.27 接下来进行参数配置,配置前如果 ...
- WinForm程序中的类TextBox的自定义控件, 添加失去焦点的功能
原理: 一.在控件的后台代码中, 添加布尔类型的属性CanFocus 二.在控件的构造函数中, 注册Enter事件的处理方法. 并在处理方法中,根据CanFocus属性的值来决定是否可以丢失焦点, 如 ...
- 关于js调用外部部署的web api
没想到多年之后我还得继续写这些东西.... 瀑布汗~ 最近不得不开始研究用web api MVC的项目中,在js文件里,实现点击一个按钮调用外部发布好的api,再从api把值回传给js页面,跳转. 经 ...