0

0

C# GDI+编程(二)

高洛峰

高洛峰

发布时间:2016-12-17 10:17:48

|

1569人浏览过

|

来源于php中文网

原创

常用的绘图函数

DrawArc绘制一个弧形

示例:graphics.DrawArc(pen,0,0,200,200,90,120)

倒数第二个参数,表示起始度数,最后一个参数是弧形的跨越度数。比如起始度数是90,跨越度数是120的弧形

红色的是弧形。类似的方法还有DrawPie绘制一个扇形和FillPie填充一个扇形。都有起始度数,跨越度数。

DrawPolygon绘制多边形

示例: Point []pt=new Point[]{new Point(0,50),new Point(0,100),new Point(100,100)};
            graphics.DrawPolygon(pen, pt);

Point数组指定每个点的位置,和点的数量。DrawPolygon绘制的多边形是闭合的,DrawPolygon会自动把第一点和最后一个点连接起来。

DrawCurve绘制基数样条

示例:Point[] pt = new Point[] { new Point(0, 0), new Point(100, 50),new Point(200,0)};
            graphics.DrawCurve(pen, pt, 1.5f);

最后一个参数表示张力值,对这个绘制函数,具体我不是很了解,只能大概知道是怎么一回事。算是不能运用自如吧。

至少要有三个点,才能构成一个曲线。可以看一个图,我从GDI+参考资料上复制过来的。

DrawBezier绘制贝赛尔样条

示例:graphics.DrawBezier(pen, 100, 0, 200, 20, 0, 80, 100, 100)

贝塞尔样条是由四个点构成的。第一个点,和最后一个点充当直线的两点,而另外两个点充当磁铁的作用,虽然线条不经过这两个磁铁点,

但这两个磁铁点会把线条往它那边吸。从而构成了贝赛尔样条。

路径GraphicsPath

GraphicsPath类属性System.Drawing.Drawing2D命名空间

路径是各种各样线条组成的,那么,矩形也可以看做是由四条直线组成的,圆形也可以看做是由几个弧形组成的。

所以GraphicsPath类里就有了添加各种形状的路径函数,如AddLine直线路径,AddEllipse椭圆路径,AddRectangle矩形路径,

AddBezier贝塞尔路径,AddString字符串路径等。

这些路径添加进去了,当然是看不着的,我们可以用Graphics类里的DrawPath函数把路径的轨迹描述出来,用画笔。

看示例:

     private void formPaint(Object sender, PaintEventArgs e)
        {
            Graphics graphics = e.Graphics;
            Pen pen = new Pen(Color.FromArgb(0, 255, 0), 2);
            Rectangle rect = new Rectangle(10, 10, 100, 100);
            GraphicsPath grcPath = new GraphicsPath();
            grcPath.AddRectangle(rect);
            grcPath.AddEllipse(rect);
            //添加字符串路径
            FontFamily famFont = new FontFamily("黑体");
            grcPath.AddString("A", famFont, (int)FontStyle.Underline, 80f, rect, null);
            //绘制路径
            graphics.DrawPath(pen, grcPath);
        }

路径画刷 PathGradientBrush

使用示例:

        private void formPaint(Object sender, PaintEventArgs e)
        {
            //创建路径
            GraphicsPath path = new GraphicsPath();
            Rectangle rect = new Rectangle(0, 0, 100, 100);
            path.AddRectangle(rect);
            //创建路径画刷
            PathGradientBrush brush = new PathGradientBrush(path);
            //中心点颜色是白色
            brush.CenterColor = Color.White;
            //路径(点)上的颜色是黑色
            brush.SurroundColors = new Color[] { Color.Black };
            //用路径画刷填充一个矩形
            e.Graphics.FillRectangle(brush, rect);
        }

上面的中心点颜色是白色,路径(点)上的颜色是黑色,也就是说,从中心点到每一个路径上的点,都是白到黑渐变的。

另外也可以自己指定中心点,如果不想用PathGradientBrush计算的中心点,就指定CenterPoint,如brush.CenterPoint = new Point(20, 50);

路径画刷多种颜色渐变

多种颜色渐变在之前的线性渐变画里已经介绍过了,那么路径多种颜色渐变也是大同小异的,直接看示例吧:

 

        private void formPaint(Object sender, PaintEventArgs e)
        {
            //创建路径
            GraphicsPath path = new GraphicsPath();
            Rectangle rect = new Rectangle(0, 0, 100, 100);
            path.AddRectangle(rect);
            //创建路径画刷
            PathGradientBrush brush = new PathGradientBrush(path);

            //创建ColorBlend对象,指定多种颜色渐变信息
            ColorBlend color_blend=new ColorBlend();
            //指定几种颜色
            color_blend.Colors=new Color[]{Color.Red,Color.Green,Color.White};
            //指定颜色的范围
            color_blend.Positions=new float[]{0/3f,2/3f,3/3f};

            brush.InterpolationColors = color_blend;
            //用路径画刷填充一个矩形
            e.Graphics.FillRectangle(brush, rect);
        }

中心点的颜色是color_blend.Colors数组的最后一个,像多种颜色渐变,你可以把中心点,到路径上的每一个点,看做一条条直线,然后这条线的3分之2是什么颜色到什么颜色渐变,3分之一又是哪种颜色到哪种颜色渐变。

上面的是红到绿渐变范围是:0~2/3,绿到白(中心点颜色):2/3~1; 假设整条直线的长度用1来代替。另外这个也可以自定义中心点位置。

小麦企业网站展示系统1.1
小麦企业网站展示系统1.1

小麦企业网站展示系统介绍:一、安装使用将xiaomai.sql导入数据库二、后台登录后台帐号,密码默认都是admin,config.php 配置文件可根据自行需要修改,IP地址,数据库用户名,密码,及表名后台目录默认admin,支持自行任意修改目录名三、注意事项1 本源码完全免费,采用伪静态,减少不必要的源码重复,速度更快,支持二次开发。2、注明本程序编码为UTF8,如发生乱码,请注意修改编码3、

下载

用点构成的路径画刷

示例:

   private void formPaint(Object sender, PaintEventArgs e)
        {
            Rectangle rect = new Rectangle(0, 0, 100, 100);
            Point []pts=new Point[]{new Point(50,0),new Point(0,100),new Point(100,100)};
            PathGradientBrush brush=new PathGradientBrush(pts);
            //中心点颜色
            brush.CenterColor=Color.White;
            //路径点上的颜色
            brush.SurroundColors=new Color[]{Color.Black};
            e.Graphics.FillRectangle(brush, rect);
        }

这种用点构成的图形,是路径画刷直接创建的,没有通过GraphicsPath,也可以指定三个以上的点,路径画刷会自动把这些点连接起来(按顺序),构成一个图形的,然后再填充,但填充的范围只限于这些点构成的图形内。就像上面,是用这个画刷填充一个矩形,

但超出这个三角图形的部分没有被填充。这个跟图形路径是一回事,只限于填充路径里面的。这个图形创建也可以通过GraphicsPath方式来完成,比如里面的添加AddPolygon多边形路径函数。然后再用Graphics类里的FillPolygon函数填充。

另外也可以用AddLines添加路径函数来完成,这个函数是用直来组成的图形,但究其根底还是用点来组成的,两点构成一条直线嘛!

不过组成的图形必须是闭合的,不然无法达到想要的结果。然后调用FillPath填充路径。

AddLines示例:

        private void formPaint(Object sender, PaintEventArgs e)
        {
            //创建路径
            GraphicsPath path = new GraphicsPath();
            Rectangle rect = new Rectangle(0, 0, 100, 100);
            Point[] pts = new Point[] { new Point(50, 0), new Point(0, 100), new Point(100, 100)};
            path.AddLines(pts);
            PathGradientBrush brush = new PathGradientBrush(path);
            //中心点颜色
            brush.CenterColor=Color.White;
            //路径点上的颜色
            brush.SurroundColors=new Color[]{Color.Black};

            e.Graphics.FillPath(brush, path);

        }

FillPath函数就像DrawPath一样,不过DrawPath是用画笔来描述路径的,而FillPath是用“填充”来描述路径的。

注意FillPath填充的路径有一定的限制,闭合。不要起冲突。

PathGradientBrush类里的SurroundColors属性成员,路径点上的多种颜色

在之前,我只指定了一种颜色,SurroundColors是个Color数组,那么它就可以指定多种颜色。指定的是一个图形上角点的颜色,

比如三角形,它有三个角,就可以给这三个角点指定不同的三种颜色,但不能是四种颜色,因为三角形只有三个角,超出范围了就会出错。

矩形也一样的,可以指定四种颜色,但如果指定的颜色数量少于角点数,比如矩形,我只指定一个角点的颜色。

那么剩下的角点都使用的都是SurroundColors数组最后一个颜色值。

拿路径画刷的第一个例子来说,我们把它修改一下,指定四个角点的颜色。如下:

       private void formPaint(Object sender, PaintEventArgs e)
        {
            //创建路径
            GraphicsPath path = new GraphicsPath();
            Rectangle rect = new Rectangle(0, 0, 100, 100);
            path.AddRectangle(rect);
            //创建路径画刷
            PathGradientBrush brush = new PathGradientBrush(path);
            //中心点颜色是白色
            brush.CenterColor = Color.White;
            //指定不同角点的颜色
            brush.SurroundColors = new Color[] { Color.Black,Color.Red,Color.Green,Color.Blue };
            //用路径画刷填充一个矩形
            e.Graphics.FillRectangle(brush, rect);
        }

四个角点处颜色,用眼睛可以看得出大概的区别,分别是黑,红,蓝,绿。对应着左上(0,0),右上(100,0),右下(100,100),

左下(0,100)四个角点。

再来说一下这个渐变画刷是怎么看的,或者说是依据什么来的。首先在SurroundColos指定了角点(0,0)为Color.Black,

角点(100,0)为Color.Red,而这两个点可以连成一条直线。这条直线还是渐变的,从黑色到红色。并且这条直线是在路径上的。

那么这条路径(直线)上的各个点就有不同的颜色了。

比如(0,0)是黑色,(1,0)是淡一点的黑色,。。。。。(99,0)是暗红色(100,0)是红色。

而中心点颜色是白色,这样中心点到0,0这条直线就是从白色到黑色渐变,而到(1,0)是从白色到淡一点的黑色渐变。

其它角点上的渐变也是如此。

按着这样规则就组成了上面的渐变。

再来个三角形的例子:

        private void formPaint(Object sender, PaintEventArgs e)
        {
            //创建路径
            GraphicsPath path = new GraphicsPath();
            Point []pts = new Point[] { new Point(50, 0), new Point(0, 100), new Point(100, 100) };
            path.AddLines(pts);

            PathGradientBrush brush=new PathGradientBrush(path);
            //中心点颜色白色
            brush.CenterColor=Color.White;
            //角点颜色:红,绿,蓝。按pts数组顺序依次
            brush.SurroundColors = new Color[] { Color.Red, Color.Green, Color.Blue };
            //用路径画刷填充路径
            e.Graphics.FillPath(brush, path);
        }

了解上面的知识点后,可以试着做一个五角星图形的例子(用路径渐变画刷,并使用不同的角点颜色)。

更多C# GDI+编程(二)相关文章请关注PHP中文网!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

178

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

35

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

79

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

2

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

4

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

8

2026.01.28

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

24

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

122

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

72

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.8万人学习

C 教程
C 教程

共75课时 | 4.3万人学习

C++教程
C++教程

共115课时 | 14.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号