C#中的各种画刷, PathGradientBrush、线性渐变(LinearGradientBrush)和径向渐变的区别
在C#中,画刷(Brush)是用来填充图形(如形状或文本)内部区域的对象。在.NET框架中,画刷是System.Drawing命名空间的一部分,通常用于GDI+绘图操作。以下是一些常用的画刷类型:
SolidBrush:用于创建单色填充的画刷。HatchBrush:用于创建具有图案填充的画刷。TextureBrush:用于创建具有图像纹理填充的画刷。LinearGradientBrush:用于创建线性渐变填充的画刷。PathGradientBrush:用于创建路径(或形状)渐变填充的画刷。
以下是如何在C#中使用SolidBrush的一个简单示例:
using System.Drawing;public void DrawRectangleWithBrush(Graphics g)
{// 创建一个SolidBrush对象,颜色为蓝色SolidBrush blueBrush = new SolidBrush(Color.Blue);// 使用画刷填充矩形g.FillRectangle(blueBrush, 0, 0, 100, 100);// 释放画刷资源blueBrush.Dispose();
}
在这个例子中,我们创建了一个蓝色的SolidBrush对象,并使用它来填充一个矩形。记得在不再需要画刷时调用Dispose方法来释放资源。
如果你需要使用其他类型的画刷,可以创建相应类型的画刷对象,并使用它们来填充图形。
例如,创建一个线性渐变画刷:
using System.Drawing;
using System.Drawing.Drawing2D;public void DrawRectangleWithLinearGradientBrush(Graphics g)
{// 创建一个线性渐变画刷LinearGradientBrush gradientBrush = new LinearGradientBrush(new Point(0, 0), // 渐变开始的坐标new Point(100, 100), // 渐变结束的坐标Color.Blue, // 渐变开始的颜色Color.White // 渐变结束的颜色);// 使用画刷填充矩形g.FillRectangle(gradientBrush, 0, 0, 100, 100);// 释放画刷资源gradientBrush.Dispose();
}
在这个例子中,我们创建了一个从蓝色到白色的线性渐变画刷,并使用它来填充一个矩形。
PathGradientBrush类
PathGradientBrush 是 .NET Framework 中 System.Drawing.Drawing2D 命名空间下的一个类,它用于创建一个可以填充路径或形状的渐变画刷。这种画刷可以用于创建复杂的渐变效果,比如可以围绕一个形状的轮廓进行渐变,而不是简单的线性或径向渐变。
以下是如何创建和使用 PathGradientBrush 的一个示例:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;public class PathGradientExample
{public void Draw(Graphics g){// 创建一个图形路径GraphicsPath path = new GraphicsPath();path.AddEllipse(0, 0, 100, 100); // 添加一个椭圆路径// 创建一个PathGradientBrush,使用图形路径PathGradientBrush pthGrBrush = new PathGradientBrush(path);// 设置渐变的中心颜色和外围颜色pthGrBrush.CenterColor = Color.Blue;pthGrBrush.SurroundColors = new Color[] { Color.White };// 使用画刷填充路径g.FillPath(pthGrBrush, path);// 释放资源pthGrBrush.Dispose();path.Dispose();}
}
PathGradientBrush 还提供了一些属性来控制渐变的外观如:
CenterColor:设置渐变的中心颜色。SurroundColors:设置渐变的外围颜色,可以是一个颜色数组。FocusScales:设置渐变的焦点缩放,可以用来调整渐变的形状。Rectangle:获取或设置定义渐变的矩形区域。
PathGradientBrush、线性渐变(LinearGradientBrush)和径向渐变的区别
-
线性渐变(
LinearGradientBrush):- 线性渐变是沿着一条直线(渐变线)从一个颜色平滑过渡到另一个颜色。
- 渐变的方向可以是水平、垂直或对角线,也可以自定义渐变线的角度。
- 线性渐变通常用于创建简单的背景或渐变效果,比如从左到右的颜色变化。
-
径向渐变(
PathGradientBrush实现):- 径向渐变是从一个中心点向外辐射,颜色从中心向外逐渐变化。
- 这种渐变效果类似于从中心向外扩散的波纹,常用于创建圆形或球形的视觉效果。
- 使用
PathGradientBrush时,可以通过设置FocusScales属性来控制渐变的焦点,从而实现不同的径向渐变效果。
-
路径渐变(
PathGradientBrush):- 路径渐变是沿着一个闭合的路径(如形状的轮廓)进行渐变填充。
- 这种渐变可以是任何形状,不仅限于直线或圆形,因此它提供了极高的灵活性。
PathGradientBrush允许你定义一个路径(如矩形、圆形、多边形或自定义形状),然后在这个路径的轮廓上应用渐变效果。- 路径渐变非常适合用于复杂的图形设计,比如沿着特定形状的轮廓进行颜色渐变。
示例代码对比
线性渐变示例
using System.Drawing;
using System.Drawing.Drawing2D;public void DrawLinearGradient(Graphics g)
{Rectangle rect = new Rectangle(0, 0, 200, 200);LinearGradientBrush linearBrush = new LinearGradientBrush(rect.Location, // 渐变开始的坐标new Point(rect.Right, rect.Bottom), // 渐变结束的坐标Color.Blue, // 渐变开始的颜色Color.White // 渐变结束的颜色);g.FillRectangle(linearBrush, rect);linearBrush.Dispose();
}
径向渐变示例(使用 PathGradientBrush)
using System.Drawing;
using System.Drawing.Drawing2D;public void DrawRadialGradient(Graphics g)
{GraphicsPath path = new GraphicsPath();path.AddEllipse(0, 0, 200, 200); // 添加一个圆形路径PathGradientBrush radialBrush = new PathGradientBrush(path);radialBrush.CenterColor = Color.Blue;radialBrush.SurroundColors = new Color[] { Color.White };g.FillPath(radialBrush, path);radialBrush.Dispose();path.Dispose();
}
路径渐变示例(使用 PathGradientBrush)
using System.Drawing;
using System.Drawing.Drawing2D;public void DrawPathGradient(Graphics g)
{GraphicsPath path = new GraphicsPath();path.AddRectangle(new Rectangle(0, 0, 200, 200)); // 添加一个矩形路径PathGradientBrush pathBrush = new PathGradientBrush(path);pathBrush.CenterColor = Color.Blue;pathBrush.SurroundColors = new Color[] { Color.White };g.FillPath(pathBrush, path);pathBrush.Dispose();path.Dispose();
}
总结
- 线性渐变:沿着直线渐变,适用于简单的背景或效果。
- 径向渐变:从中心向外辐射,适用于圆形或球形效果。
- 路径渐变:沿着任意路径渐变,适用于复杂形状和自定义效果。
每种渐变类型都有其独特的用途和视觉效果,可以根据具体需求选择合适的画刷类型。
相关文章:
C#中的各种画刷, PathGradientBrush、线性渐变(LinearGradientBrush)和径向渐变的区别
在C#中,画刷(Brush)是用来填充图形(如形状或文本)内部区域的对象。在.NET框架中,画刷是System.Drawing命名空间的一部分,通常用于GDI绘图操作。以下是一些常用的画刷类型: SolidBru…...
如何在Mac中修改pip的镜像源
一. 修改步骤 进入命令行 进入到用户根目录 cd ~/在用户根目录下创建 .pip 文件夹 mkdir .pip进入到 ~/.pip 文件夹内 cd ~/.pip创建 pip.conf 文件 vim pip.conf在 pip.conf 文件中添加清华大学的镜像源,如下: [global] index-urlhttps://pypi.tuna.ts…...
MySQL你必须知道的事
文章目录 前言一、InnoDB的数据页,和B树的关系?二、为什么InnoDB三层B树可以存2000w数据三、什么是InnoDB的页分裂和页合并四、什么是回表?怎么减少回表的次数?什么是覆盖索引,索引下推?覆盖索引索引下推总…...
Ceph RBD使用
CephRBD使用 一、RBD架构说明二、RBD相关操作1、创建存储池2、创建img镜像2.1 创建镜像2.1.2 查看镜像详细信息2.1.3 镜像其他特性2.1.4 镜像特性的启用和禁用 3、配置客户端使用RBD3.1 客户端配置yum源3.2 客户端使用admin用户挂载并使用RBD3.2.1 同步admin账号认证文件3.2.2 …...
Spark MLlib模型训练—回归算法 Random forest regression
Spark MLlib模型训练—回归算法 Random forest regression 随机森林回归 (Random Forest Regression) 是一种集成学习方法,通过结合多个决策树的预测结果来提升模型的准确性和稳健性。相较于单一的决策树模型,随机森林通过随机采样和多棵树的集成,减少了模型的方差,从而在…...
华为OD机试真题-数大雁-2024年OD统一考试(E卷)
题目描述: 一群大雁往南飞,给定一个字符串记录地面上的游客听到的大雁叫声,请给出叫声最少由几只大雁发出。具体的 大雁发出的完整叫声为”quack“,因为有多只大雁同一时间嘎嘎作响,所以字符串中可能会混合多个”quack”大雁会依次完整发出”quack”,即字符串中q,u,a,c,k这5个…...
Oracle数据迁移:导出与导入的详细指南
在数据库管理中,数据的导出与导入是一项常见的任务,无论是为了数据迁移、备份还是其他目的。Oracle数据库提供了多种工具和方法来实现数据的导出和导入。本文将详细介绍如何在Oracle中实现数据的导出和导入,包括使用Oracle SQL Developer、Or…...
SpringBoot实现前后端传输加密设计
在Web应用中,确保前后端之间的数据传输安全是非常重要的。这通常涉及到使用HTTPS协议、数据加密、令牌验证等安全措施。本文通过将前后端之间的传输数据进行加密,用于在Spring Boot应用中实现前后端传输加密设计。 一、数据加密方案 即使使用了HTTPS&…...
X 射线测厚仪-高效精准,厚度测量的卓越之选
在现代工业的舞台上,对精准度和效率的追求从未停歇。而 X 射线测厚仪,宛如一颗璀璨的明星,以其高效精准的特质,成为厚度测量的卓越之选。 X 射线测厚仪,是科技与智慧的完美结晶。它凭借先进的 X 射线技术,…...
10款好用的文件加密软件排行榜|文件加密管理软件推荐(合集篇)
某企业在疫情期间实行远程办公政策,所有员工通过公司提供的VPN访问内部系统。为了保障数据安全,然而,某位员工为了加快工作进度,将文件下载到个人电脑上进行编辑。 在一次在线会议中,员工不慎将这份未加密的文件通过非…...
服务器蓝屏该怎么办
服务器蓝屏是一种常见但严重的问题,可能会导致系统无法正常工作和数据损失。遇到服务器蓝屏时,及时采取正确的措施至关重要。以下是处理服务器蓝屏的步骤: 1. 记录蓝屏错误信息 首先,记录下蓝屏错误代码和相关信息。这些信息通常显…...
Elasticsearch:使用 inference API 进行语义搜索
本教程中的说明向您展示了如何将 inference API 工作流与各种服务结合使用来对你的数据执行语义搜索。为了说明问题的方便,我将使用 Cohere 服务来进行详细说明。更多其它服务,请详细参阅链接。 重要:有关在 Elastic Stack 中执行语义搜索的最…...
PVE开启核显直通
启用内核 IOMMU 支持 修改/etc/default/grub配置文件以启用 IOMMU 支持,将GRUB_CMDLINE_LINUX_DEFAULT修改为: GRUB_CMDLINE_LINUX_DEFAULT"quiet intel_iommuon iommupt"iommupt的参数建议添加,以提高未直通设备 PCIe 的性能&am…...
使用 Bert 做文本分类,利用 Trainer 框架实现 二分类,事半功倍
简介 使用 AutoModelForSequenceClassification 导入Bert 模型。 很多教程都会自定义 损失函数,然后手动实现参数更新。 但本文不想手动微调,故使用 transformers 的 Trainer 自动微调。 人生苦短,我用框架,不仅可保证微调出的模…...
Obsidian git sync error / Obsidian git 同步失敗
Issue: commit due to empty commit message Solution 添加commit資訊,確保不留空白 我的設置:auto-backup: {{hostname}}/{{date}}/...
谷歌英文SEO外链如何做?
做英文SEO外链涉及多种策略和技巧,目标是提升目标网站的排名和流量,Google的搜索算法在不断演变,但外链一直是搜索引擎优化中重要的一环。有效的外链建设能够显著提升网站的SEO数据效果。关键在于创建一个多元化且自然的外链结构。不能仅仅依…...
vue使用Export2Excel导出表格
安装插件 npm install xlsx xlsx-style file-saver npm install node-polyfill-webpack-plugin (如果不安装的话后面使用会报错) 添加相关配置 在vue.config.js文件 const NodePolyfillPlugin require("node-polyfill-webpack-plugin") module.exports defineCon…...
Linux环境变量 本地变量 命令行参数
并行和并发 并行 多个进程在多个 CPU 下分别,同时进行运行。 并发 多个进程在一个 CPU 采用进程切换的方式,在一段时间内,让多个进程都得以推进,称之为并发。 CPU 中的寄存器扮演什么角色? 寄存器:cpu 内的寄存器里面保存的是进程…...
向量数据库Faiss的搭建与使用
1. 什么是Faiss? Faiss是由Facebook AI Research团队开发的一个库,旨在高效地进行大规模向量相似性搜索。它不仅支持CPU,还能利用GPU进行加速,非常适合处理大量高维数据。Faiss提供了多种索引类型,以适应不同的需求&a…...
微信小程序接入客服功能
前言 用户可使用小程序客服消息功能,与小程序的客服人员进行沟通。客服功能主要用于在小程序内 用户与客服直接沟通用,本篇介绍客服功能的基础开发以及进阶功能的使用,另外介绍多种客服的对接方式。 更多介绍请查看客服消息使用指南 客服视…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
