将RGB/Brush转换为十六进制值

本文关键字:十六进制 转换 Brush RGB | 更新日期: 2023-09-27 18:24:23

所以,在我的程序中,我有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来显示一个十六进制值。

将RGB/Brush转换为十六进制值

首先让我指出,假设滑块的value属性返回int,则将int转换为string,然后再转换回来。这是没有必要的。代替

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"格式化一个数字会强制它以十六进制呈现,其中包含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();

hexcode.Text = ((SolidColorBrush)(EndColor.Background)).Color.ToString();应该这样做。

注意,这里使用的Color.ToString()System.Windows.Media.Color.ToString()实现(因为SolidColorBrushSystem.Windows.Media类的一部分

System.Drawing.Color.ToString()将给出不同的结果-请参阅看见https://msdn.microsoft.com/en-us/library/50cb8sdx(v=vs.110).aspx[绘图]vshttps://msdn.microsoft.com/en-us/library/ms606572(v=vs.110).aspx[媒体]

为此,您可以使用ColorHelper库。

RGB到HEX:

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

链接:

  • Github
  • Nuget