将 System.Drawing.Color 转换为 RGB 和 Hex 值

9 浏览
0 Comments

将 System.Drawing.Color 转换为 RGB 和 Hex 值

我正在尝试使用C#开发以下两个功能。我目前的方法可能存在问题,希望能得到您的建议。另外,我不知道是否有现有的方法可以实现相同的功能。

private static String HexConverter(System.Drawing.Color c)

{

String rtn = String.Empty;

try

{

rtn = "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");

}

catch (Exception ex)

{

//不做任何操作

}

return rtn;

}

private static String RGBConverter(System.Drawing.Color c)

{

String rtn = String.Empty;

try

{

rtn = "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")";

}

catch (Exception ex)

{

//不做任何操作

}

return rtn;

}

谢谢。

0
0 Comments

问题出现的原因:

该问题的出现是因为需要将System.Drawing.Color对象转换为RGB和十六进制值。在给出的代码示例中,使用了C#6或更高版本的插值字符串和扩展方法来实现这个功能。

解决方法:

为了解决这个问题,可以使用插值字符串和扩展方法来实现System.Drawing.Color对象到RGB和十六进制值的转换。在给出的代码示例中,定义了一个ColorConverterExtensions的静态类,并添加了ToHexString和ToRgbString两个扩展方法。通过这些扩展方法,可以将Color对象转换为相应的RGB和十六进制字符串。另外,如果需要支持alpha通道,还可以添加ToHexaString和ToRgbaString两个扩展方法。

代码示例中的ToHexString方法将Color对象转换为十六进制字符串,格式为#RRGGBB。ToRgbString方法将Color对象转换为RGB字符串,格式为RGB(R, G, B)。ToHexaString方法将Color对象转换为带alpha通道的十六进制字符串,格式为#RRGGBBAA。ToRgbaString方法将Color对象转换为带alpha通道的RGBA字符串,格式为RGBA(R, G, B, A)。

此外,代码示例中还定义了一个私有的ToProportion方法,用于将字节值转换为[0, 1]之间的比例值。这是为了将alpha通道的值从字节表示转换为小数表示。

以上就是将System.Drawing.Color对象转换为RGB和十六进制值的解决方法。通过使用插值字符串和扩展方法,可以实现简洁且高效的转换过程。

0
0 Comments

问题的原因是当使用System.Drawing.Color.Red这样的颜色对象时,ColorTranslator.ToHtml方法无法提供十六进制值。解决方法是使用ColorTranslator.FromHtml和ColorTranslator.ToHtml方法将颜色对象转换为十六进制值。

以下是整理后的文章:

你可以简单地使用原生的颜色转换器:

Color red = ColorTranslator.FromHtml("#FF0000");
string redHex = ColorTranslator.ToHtml(red);

然后将三个颜色对转换为整数形式:

int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

但是,如果我按照这种方式操作:

Color red = System.Drawing.Color.Red;
string redHex = ColorTranslator.ToHtml(red);

它不会提供十六进制值。

当然应该提供,我专门测试了这段代码,并得到了#"FF0000"。你得到了什么?你可能还想参考MSDN的参考文档:msdn.microsoft.com/en-us/library/…

尝试使用Color red = System.Drawing.Color.Red; --> 它不会提供#FF0000。

所以使用我提供的第一个代码块,redHex的值是什么?我认为你那边可能有些东西缺失了。

你提供的代码是有效的,但是当我将你的代码的第一行改为:Color red = System.Drawing.Color.Red; --> 然后它不会给出十六进制代码,而是输出"Red"。

- 确认。ColorTranslator为颜色提供了一个"友好"的名称。真让人恼火!

+1,因为这让我研究了的.NET实现,这是接受的答案 + 逻辑。我不想要那个逻辑,所以我选择了接受的答案(但是我创建了扩展方法)。

这种方法可能对某些情况不适用,因为在WinForm中进行的快速测试得到了以下结果:System.Drawing.ColorTranslator.ToHtml(Me.BackColor) = "buttonface",而不是(期望的)十六进制值。

还要注意的一件事是,你的颜色中的任何Alpha值都会丢失!

0
0 Comments

问题的原因是代码中的try/catch块是多余的,因为Color是一个struct,R、G和B是字节,所以c不能为null,c.R.ToString()、c.G.ToString()和c.B.ToString()不会失败(我唯一能想到的它们失败的方式是NullReferenceException,但它们都不能为null)。

以下是一个简化的代码示例:

private static String HexConverter(System.Drawing.Color c)

{

return "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");

}

private static String RGBConverter(System.Drawing.Color c)

{

return "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")";

}

空的try-catch块应该(几乎)普遍消除。它们很有可能导致有错误的代码,如果不是现在,那么当代码被修改时可能会出现问题。尽管如此,对于简化后的代码给予+1,并且对于提问者给予+1,因为问题提问得很好。

找到VB等效的代码有点困难:String.Format("#{0:X2}{1:X2}{2:X2}", c.R, c.G, c.B)。

我发布了一个对你的代码进行了适应的C#6版本作为另一种答案。你可以在这里看到它。

如果颜色具有Alpha通道(透明度),这将产生错误的颜色。你将得到完全不透明度。

绝对正确,谢谢你指出来。我的示例跳过了Alpha通道,只是因为我基于原始问题,原始问题也没有包含它。

此答案支持Alpha通道。

0