WPF 从 RGB 字符串转纯色颜色画刷的方法
本文告诉大家几个方法用来从 RGB 字符串转纯色的 SolidColorBrush 画刷
在 Windows 下,约定的编程规范里,颜色的 RGB 的字符串表示方法是 #[A]RGB 的格式,一定是 R 红色,接着是 G 绿色,最后是 B 蓝色,其中可选首个 Alpha 通道
颜色格式如下
#AARRGGBB: 这是最完全的字符串表示方式#RRGGBB: 省略了 Alpha 通道,此表示方式的 Alpha 通道等同于 0xFF 的值,表示不透明的纯色#ARGB: 对于#AARRGGBB不同的是,只使用一个字符表示一个通道,例如#AC12等同于#AACC1122的颜色#RGB: 和#ARGB差不多,只是省略 Alpha 通道,表示不透明的纯色
在开始进行转换时,如果发现转换的颜色不符合预期,还请先仔细阅读一下传入的颜色字符串,看字符串的格式是否符合预期
BrushConverter
使用框架自带的 BrushConverter 进行转换的方法如下:
先有一个 BrushConverter 对象,此对象可以被重复使用。这个 BrushConverter 类型也是 XAML 里面转换颜色字符串所采用的转换器
var brushConverter = new BrushConverter();
使用 BrushConverter 的 ConvertFrom 方法即可转换为纯色画刷。只不过 BrushConverter 的 ConvertFrom 方法是 TypeConverter 定义的,返回值是 object 类型,需要进行转换
var solidColorBrush = (SolidColorBrush) brushConverter.ConvertFrom("#CCFF00");
如此即可完成转换
手动解析
如果不想使用框架自带的,也可以进行手动转换颜色,以下是我从 win10 uwp 颜色转换 拷贝的代码
static (bool success, byte a, byte r, byte g, byte b) ConvertToColor(string input)
{
bool startWithPoundSign = input.StartsWith('#');
var colorStringLength = input.Length;
if (startWithPoundSign) colorStringLength -= 1;
int currentOffset = startWithPoundSign ? 1 : 0;
// 可以采用的格式如下
// #FFDFD991 8 个字符 存在 Alpha 通道
// #DFD991 6 个字符
// #FD92 4 个字符 存在 Alpha 通道
// #DAC 3 个字符
if (colorStringLength == 8
|| colorStringLength == 6
|| colorStringLength == 4
|| colorStringLength == 3)
{
bool success;
byte result;
byte a;
int readCount;
// #DFD991 6 个字符
// #FFDFD991 8 个字符 存在 Alpha 通道
//if (colorStringLength == 8 || colorStringLength == 6)
if (colorStringLength > 5)
{
readCount = 2;
}
else
{
readCount = 1;
}
bool includeAlphaChannel = colorStringLength == 8 || colorStringLength == 4;
if (includeAlphaChannel)
{
(success, result) = HexCharToNumber(input, currentOffset, readCount);
if (!success) return default;
a = result;
currentOffset += readCount;
}
else
{
a = 0xFF;
}
(success, result) = HexCharToNumber(input, currentOffset, readCount);
if (!success) return default;
byte r = result;
currentOffset += readCount;
(success, result) = HexCharToNumber(input, currentOffset, readCount);
if (!success) return default;
byte g = result;
currentOffset += readCount;
(success, result) = HexCharToNumber(input, currentOffset, readCount);
if (!success) return default;
byte b = result;
return (true, a, r, g, b);
}
return default;
}
static (bool success, byte result) HexCharToNumber(string input, int offset, int readCount)
{
Debug.Assert(readCount == 1 || readCount == 2, "要求 readCount 只能是 1 或者 2 的值,这是框架限制,因此不做判断");
byte result = 0;
for (int i = 0; i < readCount; i++, offset++)
{
var c = input[offset];
byte n;
if (c >= '0' && c <= '9')
{
n = (byte)(c - '0');
}
else if (c >= 'a' && c <= 'f')
{
n = (byte)(c - 'a' + 10);
}
else if (c >= 'A' && c <= 'F')
{
n = (byte)(c - 'A' + 10);
}
else
{
return default;
}
result *= 16;
result += n;
}
if (readCount == 1)
{
result = (byte)(result * 16 + result);
}
return (true, result);
}
WPF 从 RGB 字符串转纯色颜色画刷的方法的更多相关文章
- WPF学习系列之八(形状,画刷和变换)
形状,画刷和变换 概述: 在许多用户界面技术中,普通控件和自定义绘图之间具有清晰的区别.通常来说,绘图特性只用于特定的应用程序--如游戏,数据可视化和物理仿真等.而WPF具有一个非常不同的原则.它 ...
- [No000012B]WPF(3/7)有趣的边框和画刷[译]
介绍 边框是每个WPF程序的主要构成块.在我现在的程序中,我使用了很多的边框来装饰界面.从把边框直接放到窗口中到把边框放到控件模板和列表项中,边框在创建一个好的应用界面上扮演了一个非常重要的角色.在这 ...
- win32之取画刷的方法
取画刷(HBRUSH) 的六种方法2009-- :00HBRUSH hbr; 第一种: hbr= CreateSolidBrush(RGB(,,)); //单色的画刷 第二种: hbr= (HBRUS ...
- 简述WPF中的画刷(Brush)
原文:简述WPF中的画刷(Brush) -------------------------------------------------------------------------------- ...
- Sliverlight之 画刷
1,5种画刷 (见Project15) (1)TextBlock控件中的Forground和BackGround属性是一个什么对象?它在前台的完整的写法是什么?(实际是.net做了一个转换,可以直接写 ...
- 【WPF学习】第四十章 画刷
画刷填充区域,不管是元素的背景色.前景色以及边框,还是形状的内部填充和笔画(Stroke).最简单的画刷类型是SolidColorBrush,这种画刷填充一种固定.连续的颜色.在XAML中设置形状的S ...
- WPF 动画(形状、画刷)
一:形状 在WPF用户界面中,可以通过形状(Shape)来绘制直线.椭圆.矩形及一些多边形的类.通过这些基本的图像,组合成为复杂的图形. Shape类中,主要的形状有Rectangle(),Ellip ...
- WPF 10天修炼 第八天 - 形状、画刷和变换
图形 在WPF中使用绘图最简单的就是使用Shape类.Shape类继承自FrameworkElement,是一个专门用来绘图的类.Shape类中年派生的类有直线.矩形.多边形和圆形等. System. ...
- MFC更换画笔(画刷)颜色以及画眼睛(GDI画图)
MFC画眼睛 换画笔(画刷)颜色(参考链接:https://blog.csdn.net/sunxiving/article/details/51272001) 由于画笔一旦创建后就无法修改.所以要修改 ...
- WPF样式之画刷结合样式
第一种画刷,渐变画刷GradientBrush (拿线性渐变画刷LinearGradientBrush(其实它涵盖在GradientBrush画刷内.现在拿他来说事.),还有一个圆心渐变画刷Radia ...
随机推荐
- 快速上手系列:XML
一 xml 简介extensible markup language :可扩展标记型语言(1)标记型语言:html 也是标记型语言,即使用标签来操作(2)可扩展: 1)html 里面的标签是固定的,每 ...
- GID:旷视提出全方位的检测模型知识蒸馏 | CVPR 2021
论文提出的GID框架能够自动选择可辨别目标用于知识蒸馏,而且综合了feature-based.relation-based和response-based知识,全方位蒸馏,适用于不同的检测框架中.从实验 ...
- PSS:你距离NMS-free+提点只有两个卷积层 | 2021论文
论文提出了简单高效的PSS分支,仅需在原网络的基础上添加两个卷积层就能去掉NMS后处理,还能提升模型的准确率,而stop-grad的训练方法也挺有意思的,值得一看 来源:晓飞的算法工程笔记 公众号 ...
- 【问题解决1】fatal error: X11/XXXX.h: No such file or directory
问题现象 编译鸿蒙代码时,报如下类似的错误: 错误1: 错误2: 解决方法 step 1:安装依赖文件 sudo apt-get install apt-file sudo apt-file upda ...
- 才储性格测试(INTJ 专家型——追求能力与独立)
INTJ 专家型--追求能力与独立 一.你的荣格理论图形 二.基本描述 才储分析:您的性格类型倾向为" INTJ "(内向 直觉 思维 判断 倾向度: I60 N56 T74 J5 ...
- Python---flask框架实现清除cookies功能
路由部分: 1 #用户退出清理cookie 2 @app.route('/clean_cookies',methods=['GET', 'POST']) 3 def clean_cookies(): ...
- #并查集#JZOJ 4223 旅游
题目 多次询问有多少个无序点对\((x,y)\), 满足至少有一条最大边权\(\leq d\)的路径 分析 离线询问,用并查集加边,每次产生的贡献为\(2*siz[x]*siz[y]\) 代码 #in ...
- 使用vcpkg和OHOS SDK构建开源软件
安装OHOS SDK 参照OHOS IDE和SDK的安装方法,安装构建工具. 创建用户环境变量OHOS_NDK_HOME,指向OHOS SDK的安装路径,比如D:\Tools\Huawei\OHOS\ ...
- el-table设置列属性fixed导致滚动条无法拖动-骨灰级
一.前言说明 网上一搜索,千篇一律的设置el-table__fixed,如: .el-table__fixed { // 左固定列 height: auto !important; bottom: 1 ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit
1.问题描述 升级到4.0.0.59版本后,通过pushService.getToken获取华为的token时报如下错误:Illegal application identity. 解决方案 Mate ...