c# - 十六进制值颜色到 C# 中的可读文本颜色
问题描述
我正在制作一个系统,其中包括使用“colorDialog”选择颜色并将其显示在文本框上。问题是其他颜色显示十六进制值(如 ffff8000)。如何将其更改为可读文本?
我有一个解决方案:
private string changeColortoReadable(string changedColor){
if(colorDialog.Color.Name == "ffff8000"){
changedColor = "Orange";
}
return changedColor;
}
将所有十六进制颜色转换为可读颜色对我来说有点累和耗时。
解决方案
仅通过完美匹配获取颜色名称:
您可以使用 KnownColor 枚举来创建您需要的查找。见下文:
public static class HexColorTranslator
{
private static Dictionary<string, string> _hex2Name;
private static Dictionary<string, string> Hex2Name
{
get
{
if (_hex2Name == null)
{
_hex2Name = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
foreach (KnownColor ce in typeof(KnownColor).GetEnumValues())
{
var name = ce.ToString();
var color = Color.FromKnownColor(ce);
var hex = HexConverter(color);
_hex2Name[hex] = name;
}
}
return _hex2Name;
}
}
//https://stackoverflow.com/a/2395708/1155329
private static String HexConverter(System.Drawing.Color c)
{
return c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
}
public static string GetKnownColorFromHex(string hex)
{
hex = hex.TrimStart('#');
if (Hex2Name.TryGetValue(hex, out string result)) return result;
return "???";
}
}
通过调用 GetKnownColorFromHex 函数获取颜色:
Console.WriteLine(HexColorTranslator.GetKnownColorFromHex("#ff0000")); // Red
请注意,遗憾的是您不能使用 ToKnownColor,除非颜色是使用已知颜色创建的。看:
var aquaKnown = Color.FromKnownColor(KnownColor.Aqua);
var aquaUnknown = Color.FromArgb(aquaKnown.A, aquaKnown.R, aquaKnown.G, aquaKnown.B);
Console.WriteLine(aquaKnown.ToKnownColor()); //Aqua
Console.WriteLine(aquaUnknown.ToKnownColor()); //0
获取 RGB 空间中最接近颜色的名称:
如果你想得到最接近的颜色,你可以试试这个:
public static string GetNearestKnownColor(string hex)
{
var color = System.Drawing.ColorTranslator.FromHtml(hex);
double bestSquared = double.MaxValue;
KnownColor bestMatch = default(KnownColor);
foreach (KnownColor ce in typeof(KnownColor).GetEnumValues())
{
Color tryColor = Color.FromKnownColor(ce);
double deltaR = tryColor.R - color.R;
double deltaG = tryColor.G - color.G;
double deltaB = tryColor.B - color.B;
double squared = deltaR * deltaR + deltaG * deltaG + deltaB * deltaB;
if(squared == 0) return ce.ToString();
if (squared < bestSquared)
{
bestMatch = ce;
bestSquared = squared;
}
}
return bestMatch.ToString();
}
请注意,这并不完全准确,因为它在 RGB 空间中运行,这可能会产生不同于人类对颜色进行分类的结果。
推荐阅读
- javascript - 单击按钮后,文本区域输入未设置为空字符串,并且文本区域光标未从头开始
- java - Android - 从 uri 加载照片
- python - 在 OpenSSL 或 Python 中使用给定密钥解密 AES-256 文件
- grails - 无法使用 Java 11 运行 Grails 4.0.1 cli - 在堆栈跟踪中出现空指针错误
- c# - 双斜杠在字符串 C# 中无法正常工作
- angular - app.module.ts 中声明的 Angular 子 html 引用组件
- codeblocks - 我需要在 Code::Blocks 中更改工作区的颜色
- c# - 有没有办法在 c# 中将参数与访问器一起使用
- python - 如何正确使用 Keras 添加层?
- go - 从其他功能使用 mongodb 连接