将RGB/画刷转换为十六进制值

3

在我的程序中,我有3个滑块,SliderRed、SliderGreen和SliderBlue。它们的最大值都为255。名为EndColor的控件在我移动滑块时可以正确地改变颜色,但我还没有想出一种方法将hexcode.text(Textblock)转换为刷子或颜色的十六进制值,例如#FF0000

我应该使用什么来使其工作?

public void SliderChanged()
{
    byte r = byte.Parse(sliderRed.Value.ToString());
    byte g = byte.Parse(sliderGreen.Value.ToString());
    byte b = byte.Parse(sliderBlue.Value.ToString());

    EndColor.Background = new SolidColorBrush(Color.FromArgb(255, r, g, b));
    hexcode.Text = EndColor.Background.ToString(); //Something like this
}

我只需要 hexcode.Text 来展示一个十六进制值。


可能是设置System.Drawing.Color值的重复问题。 - JNF
字符串格式化? String.Format("{0:X2}{1:X2}{2:X2}", EndColor.Background.Red, EndColor.Background.Green, EndColor.Background.Blue); - Dmitry Bychenko
@GurfX 这个链接可能会对你有所帮助。 - E.Solicito
3个回答

9

首先,假设你的滑块的value属性返回一个整数,你将整数转换为字符串,然后再转换回来。这是没有必要的。相反,可以使用

byte r = byte.Parse(sliderRed.Value.ToString());

您只需要做的是:
byte r = (byte)sliderRed.Value;

这可以避免字符串转换。将某些东西转换为字符串,然后从字符串转换回其他内容是一种代码异味,应该让您停下来思考是否有更好的方法。

将颜色转换为其十六进制代码很容易,因为您已经具有R、G和B值。您所需要的只是:

hexCode.Text = string.Format("#{0:X2}{1:X2}{2:X2}", r, g, b);

使用格式字符串"X2"格式化数字可以将其强制转换为16进制,并且有2个数字。因此,您只需对这三个数字执行此操作,并在前面添加#符号即可。 编辑 如果在代码的各个部分之间传递颜色数据,则应始终使用System.Drawing.Color对象进行传递,每当需要显示十六进制字符串时,才生成该字符串。不要传递十六进制字符串并在需要时将其转换回Color。记住我说过将东西转换为字符串然后再转回来是一种代码味道吗?
如果发现您经常这样做,那么最好将扩展方法添加到Color中,以便您可以轻松调用它。以下是一个实现该方法的类:
static class ColorExtensions
{
    public static string ToHexString(this System.Drawing.Color color)
    {
        return string.Format("#{0:X2}{1:X2}{2:X2}", color.R, color.G, color.B);
    }
}

这将为所有Color值提供一个ToHexString()方法,在您的上面的代码中,您可以按以下方式使用它:
var color = Color.FromArgb(255, r, g, b);
EndColor.Background = new SolidColorBrush(color);
hexcode.Text = color.ToHexString();

现在对于我的控件,如果我想要改变一些东西,我该如何让它做到像这样 EndColor.Background = hex; - mateos
你的意思是想使用十六进制字符串来设置可视化组件的颜色吗?如果你真的必须这样做,那么你可以编写一个小解析器,去掉井号,然后读取每个红、绿和蓝色的两个字符,然后构造一个颜色。但不要这样做。System.Drawing.Color已经存在了,这就是你应该在代码内部传递颜色信息的方式。编写一个将System.Drawing.Color转换为十六进制字符串的函数(甚至可以将其作为扩展方法),并在需要字符串时使用它。 - Richard Irons
能否在一行代码中完成所有操作?如果可以,请在评论中写出来,谢谢。 - mateos

1

背景中不包含名为color的定义。 - mateos
2
尝试使用(EndColor.Background as SolidColorBrush).Color.ToString() - CompuChip
Color.ToString() 不会返回格式为 '#FF0DBB' 的字符串。它会返回类似于 Color [A=255, R=255, G=13, B=187] 的内容。 - Richard Irons
我也是。此外,有没有办法去掉十六进制代码的 Alpha 通道?如果完全不透明且为白色,则我的代码最终会变成 #FFFFFFFF。 - mateos
1
你可以手动完成它 - if (hexcode.Text.Length > 7) hexcode.Text= hexcode.Text.Remove(1,2); - simonalexander2005
显示剩余2条评论

0

你可以使用ColorHelper库来实现这个功能。

RGB转HEX:

using ColorHelper;
...
HEX hex = ColorHeConverter.RgbToHex(new RGB(10, 20, 30));

链接:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接