title author date CreateTime categories
win10 uwp 颜色转换
lindexi
2019-09-02 12:57:38 +0800
2018-2-13 17:23:3 +0800
Win10 UWP

本文告诉大家如何从字符串转颜色,从颜色转字符串

字符串转颜色

在 WPF 可以使用下面的代码把十六进制的颜色字符串转颜色

            Color color = (Color) ColorConverter.ConvertFromString("#FFDFD991");
string hex = "#FFFFFF";
Color color = System.Drawing.ColorTranslator.FromHtml(hex);

但是 UWP 没这个方法,所以需要自己写一个方法

        public SolidColorBrush GetSolidColorBrush(string hex)
{
hex = hex.Replace("#", string.Empty);
byte a = (byte) (Convert.ToUInt32(hex.Substring(0, 2), 16));
byte r = (byte) (Convert.ToUInt32(hex.Substring(2, 2), 16));
byte g = (byte) (Convert.ToUInt32(hex.Substring(4, 2), 16));
byte b = (byte) (Convert.ToUInt32(hex.Substring(6, 2), 16));
return new SolidColorBrush(Windows.UI.Color.FromArgb(a, r, g, b));
}

如果有小伙伴传入一个不带透明的,那么上面的代码就会出现异常,因为不带透明的颜色只有 6 个字符,所以就无法使用上面的代码,我修改了下面代码可以转换颜色

       public SolidColorBrush GetSolidColorBrush(string hex)
{
hex = hex.Replace("#", string.Empty); bool existAlpha = hex.Length == 8; if (!existAlpha && hex.Length != 6)
{
throw new ArgumentException("输入的hex不是有效颜色");
} int n = 0;
byte a;
if (existAlpha)
{
n = 2;
a = (byte) ConvertHexToByte(hex, 0);
}
else
{
a = 0xFF;
} var r = (byte) ConvertHexToByte(hex, n);
var g = (byte) ConvertHexToByte(hex, n + 2);
var b = (byte) ConvertHexToByte(hex, n + 4);
return new SolidColorBrush(Windows.UI.Color.FromArgb(a, r, g, b));
} private static uint ConvertHexToByte(string hex, int n)
{
return Convert.ToUInt32(hex.Substring(n, 2), 16);
}

大家可以从上面代码发现 ConvertHexToByte 这就是 16 进制转 int 的方法,请看C# 16 进制字符串转 int

但是存在这样写的颜色 #FD92 #DAC 的颜色,所以还需要继续修改一下算法

       public SolidColorBrush GetSolidColorBrush(string hex)
{
hex = hex.Replace("#", string.Empty); //#FFDFD991
//#DFD991
//#FD92
//#DAC bool existAlpha = hex.Length == 8 || hex.Length == 4;
bool isDoubleHex = hex.Length == 8 || hex.Length == 6; if (!existAlpha && hex.Length != 6 && hex.Length != 3)
{
throw new ArgumentException("输入的hex不是有效颜色");
} int n = 0;
byte a;
int hexCount = isDoubleHex ? 2 : 1;
if (existAlpha)
{
n = hexCount;
a = (byte) ConvertHexToByte(hex, 0, hexCount);
if (!isDoubleHex)
{
a = (byte) (a * 16 + a);
}
}
else
{
a = 0xFF;
} var r = (byte) ConvertHexToByte(hex, n, hexCount);
var g = (byte) ConvertHexToByte(hex, n + hexCount, hexCount);
var b = (byte) ConvertHexToByte(hex, n + 2 * hexCount, hexCount);
if (!isDoubleHex)
{
//#FD92 = #FFDD9922 r = (byte) (r * 16 + r);
g = (byte) (g * 16 + g);
b = (byte) (b * 16 + b);
} return new SolidColorBrush(Windows.UI.Color.FromArgb(a, r, g, b));
} private static uint ConvertHexToByte(string hex, int n, int count = 2)
{
return Convert.ToUInt32(hex.Substring(n, count), 16);
}

如果想看微软的转换,请看 https://referencesource.microsoft.com/#PresentationCore/Core/CSharp/System/Windows/Media/Parsers.cs

可以复制的源代码:

<script src="https://gist.github.com/lindexi/36c5e223ff77cfb8adc4909dec1576b5.js"></script>

如果你没有在上面看到代码,请点击 <https://gist.github.com/lindexi/36c5e223ff77cfb8adc4909dec1576b5 >

颜色转字符串

如果需要从颜色转字符串是很简单

Color.ToString()

上面的代码就可以输出字符串

最新文章

  1. clearfix的应用
  2. 【温故而知新-Javascript】窗口效果 (全屏显示窗口、定时关闭窗口)
  3. USB HID描述符【转】
  4. 从开发的角度比较 ASP.NET Web 服务与 WCF
  5. 解决在管理wordpress时权限不足的问题
  6. [codevs1380]没有上司的舞会
  7. excel导入数据库iis设置
  8. java基础-&gt;循环
  9. Linux 监测命令
  10. (转)java创建对象的步骤
  11. MySQ数据表设计
  12. FFmpeg进行视频帧提取&amp;音频重采样-Process.waitFor()引发的阻塞超时
  13. 【转】exec xargs的区别 另附eval命令介绍
  14. SpringBoot集成Mybatis并具有分页功能PageHelper
  15. C#如何调用其他.config配置文件,就是2个乃至3个以上的config文件
  16. bzoj1208: [HNOI2004]宠物收养所 (sbt)
  17. Centos6.8配置svn
  18. HDU 1875 畅通工程再续(kruskal)
  19. pycharm中创建并设置docker解释器
  20. mac和linux下使用Docker,部署SpringBoot项目到docker

热门文章

  1. docker初学
  2. 用pycharm运行pytest
  3. JavaWeb(三):JSP
  4. java生成随机数方法
  5. 通俗理解BiLSTM-CRF命名实体识别模型中的CRF层
  6. mui is not defined
  7. Python基础教程(017)--执行Python的方式解释器运行及其他几种解释器简介
  8. Linux编程 多进程,多线程求解PI(圆周率)
  9. nRF51822 蓝牙低功耗和 2.4GHz 专利 SoC
  10. Tomcat安装后修改路径方法