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 ...
随机推荐
- 记录--纯CSS实现骚气红丝带
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在本文中,我们将探讨如何使用 CSS 以最少的代码创造出精美的 CSS 丝带形状,并最终实现下面这个效果: 下面我们使用html和css来 ...
- 记录--JavaScript原型和原型链复习笔记
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 原型和原型链 1. 原型 每个JS对象一定对应一个原型对象,并从原型对象继承属性和方法 1.1 __proto__ 对象的__proto_ ...
- FFmpeg开发笔记(三)FFmpeg的可执行程序介绍
外界对于FFmpeg主要有两种使用途径,一种是在命令行运行FFmpeg的可执行程序,该方式适合没什么特殊要求的普通场景:另一种是通过代码调用FFmpeg的动态链接库,由于开发者可以在C代码中编排个性 ...
- 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第9章
本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 暂无 本章释疑: 暂无,等待你的提问 致谢: MVP 林德熙 MVP 吕毅 sPhinX 相关链接 试读记录
- 一文搞懂JavaEE的接口
在Java EE(Java Enterprise Edition)开发环境中,编程意义上的"接口"(interface)和API接口虽然都涉及接口的概念,但它们属于不同层面的术语. ...
- OWOD:开放世界目标检测,更贴近现实的检测场景 | CVPR 2021 Oral
不同于以往在固定数据集上测试性能,论文提出了一个更符合实际的全新检测场景Open World Object Detection,需要同时识别出未知类别和已知类别,并不断地进行增量学习.论文还给出了OR ...
- KingbaseES自动生成列介绍
在KingbaseES中create table语句支持GENERATED column(生成列). 生成列是一种特别的列类型,它的值基于其他列的值计算得出.因此,生成列之于列,有点像视图之于表的关系 ...
- KingbaseES V8R6数据库运维案例之---用户权限导致的备份恢复故障
案例说明: 由于限制了用户对数据库的访问,导致在执行'sys_backup.sh init'初始化物理备份时,执行失败. 适用版本: KingbaseES V8R6 一.问题现象 如下所示,执行'sy ...
- KingbaseES V8R6备份恢复案例之---sys_restore实现schema转换
**案例说明:** sys_restore用于sys_dump备份的数据恢复,在实际的应用中有需求,将从sys_dump备份对象从原schema中转换到到另外的schema,sys_restore支持 ...
- reinterpret_cast 和 static_cast 的区别
安全性: static_cast 是一个安全的类型转换,它只能转换具有继承关系或密切相关的类型,并且在编译时进行类型检查. reinterpret_cast 是一个不安全的类型转换,它可以将任何类型的 ...