如何从十六进制颜色代码(例如#FFDFD991)中获取颜色?

我正在读取文件并获取十六进制颜色代码。我需要为十六进制颜色代码创建相应的System.Windows.Media.Color实例。框架中是否有内置方法可以做到这一点?

评论

用哈希码表示#00ff00?

Viky-不要将其称为哈希码。令人困惑。 ;-)它是一种颜色的十六进制表示形式。

#FF0000是HTML(或十六进制)颜色代码,而不是哈希代码。请了解其中的区别。

符号#在许多国家/地区被称为哈希,因此很混乱。

@axeman ???您可能误解了C#中的GetHashCode()的作用。 GetHashCode()是.NET中每个对象的方法。它不会从Color类中返回十六进制值。

#1 楼

我假设这是一个ARGB代码...您是指System.Drawing.Color还是System.Windows.Media.Color?后者例如在WPF中使用。我还没有看到任何人提到它,所以以防万一您正在寻找它:

using System.Windows.Media;

Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");


评论


@Thorarin有关如何获取Alpha值的任何帮助,因为我需要转换此值以与Web设计的CSS rgba兼容。

– Siddharth Pandey
14年4月17日在8:14

@Yoda前两位数字(FF)是alpha值。在这种情况下,使用Color.FromArgb方法可能会更容易。如果使用浮点Alpha,则必须乘以255。

–胸腺素
14年4月18日在18:20

如果您具有RGB值-> Color.FromArgb(255,192,0)

–伊曼
2014年11月12日上午8:30

字符串hex =“ #FFFFFF”;颜色_color = System.Drawing.ColorTranslator.FromHtml(hex);

– Harshal Doshi Jain
2014年11月29日在7:41

为什么不使用color.FromArgb()代替呢?

– Nimitz E.
15年7月10日在20:44

#2 楼

假设您的意思是HTML类型的RGB代码(称为十六进制代码,例如#FFCC66),请使用ColorTranslator类:代码,则可以使用System.Windows.Media命名空间中的ColorConverter类:

System.Drawing.Color col = System.Drawing.ColorTranslator.FromHtml("#FFCC66");


#3 楼

如果您不想使用ColorTranslator,则可以轻松实现:

string colorcode = "#FFFFFF00";
int argb = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
Color clr = Color.FromArgb(argb);


颜色代码只是ARGB值的十六进制表示形式。

编辑

如果需要使用4个值而不是单个整数,则可以使用此值(结合多个注释):

string colorcode = "#FFFFFF00";    
colorcode = colorcode.TrimStart('#');

Color col; // from System.Drawing or System.Windows.Media
if (colorcode.Length == 6)
    col = Color.FromArgb(255, // hardcoded opaque
                int.Parse(colorcode.Substring(0,2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(2,2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(4,2), NumberStyles.HexNumber));
else // assuming length of 8
    col = Color.FromArgb(
                int.Parse(colorcode.Substring(0, 2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(2, 2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(4, 2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(6, 2), NumberStyles.HexNumber));


注1:NumberStyles位于System.Globalization中。注2:请提供您自己的错误检查(颜色代码应为6或8个字符的十六进制值)

评论


Color.FromArgb需要a,r,g和b参数,而不是整数。

–公民conn
2012年11月30日在22:41

如果您使用的紧凑框架中没有ColorTranslator,这也很有用

– TechyGypo
13年4月23日在12:25

@ user1763532-在colorcode = colorcode.Replace(“#”,“”)之后,只需使用int a = byte.parse(colorcode.Substring(0,2),NumberStyles.HexNumber);依次类推r,g和b。不要忘记用r的2,g的4和b的6替换Substring的第一个参数-索引。

– M. Mimpen
2013年12月24日11:29



@ HansKesting,FromArgb在System.Drawing.Color中采用1个参数,在System.Windows.Media.Color中采用4个参数

– Torvin
2015年10月8日在22:16

请注意,这适用于4字节(例如#FFFFFFFF)HTML颜色(inc alpha)。如果尝试使用3字节(#FFFFFF),则alpha将为0,并且颜色透明。如果颜色代码少于8/9个字符,则可以轻松插入alpha。非常适合紧凑型框架。

–apc
18年5月29日在16:22

#4 楼

下面的三个变体给出完全相同的颜色。最后一个优点是可以在Visual Studio 2010 IDE(可能是ReSharper)中以正确的颜色突出显示。

var cc1 = System.Drawing.ColorTranslator.FromHtml("#479DEE");

var cc2 = System.Drawing.Color.FromArgb(0x479DEE);

var cc3 = System.Drawing.Color.FromArgb(0x47, 0x9D, 0xEE);


评论


这些都不返回System.Windows.Media.Color。

– Sinatr
15年4月15日在13:04

#5 楼

还有一个简洁的扩展方法:

static class ExtensionMethods
{
    public static Color ToColor(this uint argb)
    {
        return Color.FromArgb((byte)((argb & -16777216)>> 0x18),      
                              (byte)((argb & 0xff0000)>> 0x10),   
                              (byte)((argb & 0xff00) >> 8),
                              (byte)(argb & 0xff));
    }
}


使用中:

Color color = 0xFFDFD991.ToColor();


评论


也许是一个愚蠢的问题,有些迟了,但是为什么要使用-16777216作为alpha值?

–GeekPeek
2012年3月26日8:49



始终使用十六进制进行小变化:返回Color.FromArgb((byte)((argb&0xff000000)>> 0x18),(byte)((argb&0xff0000)>> 0x10),(byte)((argb&0xff00)>> 0x08),(byte)(argb&0xff));

–太
2013年12月12日15:46

该代码有误。我不知道为什么什么都没显示,结果是因为这段代码无法正确将十六进制转换为Color。我使用了@too中的代码,并对其进行了修复。

– ub3rst4r
2014年5月31日上午7:00

这里是此答案的先前版本:http://stackoverflow.com/a/784852/2721611

– Mojtaba Rezaeian
15年10月24日在18:21

您每次都可以对最终降级后的值执行&0xFF,而不需要对&it使用所有这些不同的值。

– Nyerguds
16年11月25日,0:40

#6 楼

    private Color FromHex(string hex)
    {
        if (hex.StartsWith("#"))
            hex = hex.Substring(1);

        if (hex.Length != 6) throw new Exception("Color not valid");

        return Color.FromArgb(
            int.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber),
            int.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.HexNumber),
            int.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.HexNumber));
    }


评论


在UWP中,Color.FromArgb()需要4个字节的参数。因此它看起来像:return Color.FromArgb(255,byte.Parse(hex.Substring(0,2),System.Globalization.NumberStyles.HexNumber),byte.Parse(hex.Substring(2,2),System。 Globalization.NumberStyles.HexNumber),byte.Parse(hex.Substring(4,2),System.Globalization.NumberStyles.HexNumber));

– Kibernetik
16年7月16日在9:10



#7 楼

我需要将十六进制颜色代码转换为System.Drawing.Color,特别是在WPF表单上作为背景的Alice Blue阴影,发现查找答案所需的时间比预期的长:

using System.Windows.Media;


-

System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("#EFF3F7");
this.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(myColor.A, myColor.R, myColor.G, myColor.B));


#8 楼

您可以使用以下代码:

Color color = System.Drawing.ColorTranslator.FromHtml("#FFDFD991");


#9 楼

如果要使用Windows Store应用程序执行此操作,请紧接着@Hans Kesting和@Jink回答:

    string colorcode = "#FFEEDDCC";
    int argb = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
    tData.DefaultData = Color.FromArgb((byte)((argb & -16777216) >> 0x18),
                          (byte)((argb & 0xff0000) >> 0x10),
                          (byte)((argb & 0xff00) >> 8),
                          (byte)(argb & 0xff));


#10 楼

这篇文章已经成为任何试图从十六进制颜色代码转换为系统颜色的人的首选。因此,我想我要添加一个全面的解决方案,以处理6位(RGB)和8位(ARGB)十六进制值。 ARGB值


Alpha值隐式为255(完全不透明)。颜色代码,它将变成8位ARGB十六进制颜色代码。因此,可以创建一个处理ARGB和RGB十六进制并将其转换为适当的Color结构的简单方法。

br />

#11 楼

您可以看到Silverlight / WPF将十六进制颜色的椭圆设置为使用十六进制值:

your_contorl.Color = DirectCast(ColorConverter.ConvertFromString("#D8E0A627"), Color)


#12 楼

在asp.net中:
color_black = (Color)new ColorConverter().ConvertFromString("#FF76B3");


评论


ColorConverter在System.Drawing和System.Windows.Media中可用。您是指哪一个(两者都与ASP.NET无关)?

–克劳斯·古特(KlausGütter)
8月15日下午6:20

System.Drawing中的ColorConverter可以在ASP.NET中使用

–哈利勒·拉赫曼·尤塞菲(Khalil Al-rahman Yossefi)
8月15日11:02



#13 楼

WPF:

using System.Windows.Media;

//hex to color
Color color = (Color)ColorConverter.ConvertFromString("#7AFF7A7A");

//color to hex
string hexcolor = color.ToString();


评论


实际上,只有颜色[Indigo]才是十六进制

–乔治·兰兹(George Lanetz)
16年5月12日在21:53

#14 楼

使用

System.Drawing.Color.FromArgb(myHashCode);


评论


一览从十六进制字符串到int的转换?

–胸腺素
2010年1月21日,14:40

最初,该问题被问为“如何从哈希码中获取颜色”,这在这里引起了很多混乱。 ;-)

–herzmeister
2010-1-21在15:01

#15 楼

如果您像在.GetHashCode()中那样表示HashCode,恐怕您将无法返回。哈希函数不是双向的,您只能“前进”,而不能返回。

如果需要根据颜色的十六进制值获取颜色,请遵循Oded的建议。

评论


@Wim感谢您帮助OP阐明问题。我会说不再需要此答案,建议删除它。

– jpaugh
18年7月3日在15:26



#16 楼

我在项目中使用了ColorDialog。 ColorDialog有时返回“ Red”,“ Fhushia”,有时返回“ fff000”。我解决了这个问题,也许可以帮助别人。

        SolidBrush guideLineColor;
        if (inputColor.Any(c => char.IsDigit(c)))
        {
            string colorcode = inputColor;
            int argbInputColor = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
             guideLineColor = new SolidBrush(Color.FromArgb(argbInputColor));

        }
        else
        {
            Color col = Color.FromName(inputColor);
             guideLineColor = new SolidBrush(col);
        }


InputColor是ColorDialog的返回值。

感谢大家回答这个问题。对我有很大帮助。