首页 > 其他分享 >WPF 从 RGB 字符串转纯色颜色画刷的方法

WPF 从 RGB 字符串转纯色颜色画刷的方法

时间:2022-09-21 08:56:06浏览次数:92  
标签:readCount 画刷 success RGB colorStringLength result input byte WPF

本文告诉大家几个方法用来从 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);
}

标签:readCount,画刷,success,RGB,colorStringLength,result,input,byte,WPF
From: https://www.cnblogs.com/lindexi/p/16714358.html

相关文章

  • WPF 使用 Win10 的 WinRT 自带 Windows.Media.Ocr 实现图片转文本
    世界上有很多OCR识别技术,本文来和大家介绍如果在WPF里,在运行到win10的设备上,通过WindowsRuntime自带的Windows.Media.Ocr实现在给定的图片里面识别文本的功能......
  • WPF 用户控件,无法使用中文
    一、打开VS的高级保存选项1、工具——自定义——命令——菜单栏,下拉,选择文件。2、点击添加命令,左边类别,选择文件;右边命令,选择高级保存选项;确定。3、可以点击上移,下......
  • AV_PIX_FMT_CUDA 数据转 RGB
    ffmpeg的cuvid解码结果数据格式为AV_PIX_FMT_CUDA,实际使用中后续接算法需要转为RGB。算法跑在显卡上,解码也在显卡上,所以转换也定为直接在显卡上进行。 关于ffmpeg的cuv......
  • 深入浅出WPF变换(Transform)之矩阵(Matrix)
    背景知识Matrix是一个用于在二维坐标系中进行坐标转换的3*3仿射变换矩阵。什么是仿射变换?为什么是3*3,不是2*2?好的,让我们来复习一下(以下内容来自百度百科):仿射变换,又称仿......
  • WPF正确处理屏幕位置
    WPF可通过引用System.Windows.Forms来使用Screen.AllScreens获取屏幕信息,但是Screen.AllScreens获取的屏幕信息和物理屏幕有关,在Windows系统设置多屏幕之后会获取意想不到......
  • How To Bind a Combobox to a Dictionary in WPF C#
    HowToBindaComboboxtoaDictionaryinWPFC# 回答1UseaDictionary<Answer,string>(noneedforanotherclass)AnswerDisplay=newDictionary<Answer,s......
  • WPF DataBinding: Nullable Int still gets a validation error?
    WPFDataBinding:NullableIntstillgetsavalidationerror?Ihaveatextboxdataboundtoanullableintthroughcode.IfIerasethedatafromthetextboxi......
  • WPF 输入文本检测是否为数字
     <Windowx:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.......
  • Visual Studio 各版本中开启WPF应用热重载工具
    官方链接以VS2022为例,别的版本,只需要切换版本信息就行。 ......
  • WPF之RUI
    最近工作需要,边学边写WPF,看到<Application.Resources>里的<ResourceDictionary.MergedDictionaries> ResourceDictionarysource=uri时看到URI好奇怪,查询了下记录如......