2012-02-09 63 views
1

我将我的颜色保存在数据库中的int值。System.Drawing.Color转换FromArgb问题

int icolor = System.Drawing.Color.Red.ToArgb(); 
//result: -65536 

当将int转换为Color而不是丢失属性Color.Name。必须返回“红色”,但财产返回“ff000000”。我在做什么呢?

我需要获得这一个 - 属性红色而不是十六进制值

+1

“FromArgb”可以返回40亿种可能的颜色。为什么要通过试图确定是否从所有可能性中选择了某种指定的颜色,然后特意返回该代码来减慢代码路径?你为什么需要它是'红色'? – 2012-02-09 08:10:18

+0

[使用ToArgb()后跟FromArgb()不会导致原始颜色](http://stackoverflow.com/questions/721324/using-toargb-followed-by-fromargb-does-not-result原来的颜色) – 2012-02-09 08:12:33

回答

6

试试这个

System.Drawing.ColorTranslator.FromHtml("#" + "Hex value").Name 
+1

它工作...谢谢你) – user571874 2012-02-09 08:25:35

3

你没有做错什么。

十六进制ff等于255,为十进制值的Red颜色,这是由 System.Drawing.Color.Red.ToArgb();

返回如果您想获得该颜色的名称,使用System.Drawing.Color.Red.Name

string sRedColorName = System.Drawing.Color.Red.Name; 
+0

好的。我如何获得财产名称“红”? – user571874 2012-02-09 08:08:02

+0

@ user571874正如在答案中指出的,你可以使用'System.Drawing.Color.Red.Name' – Shai 2012-02-09 08:23:04

2

将int转换为Color时比丢失属性Color.Name。

是的,这是正确的。这是Color.Name属性的工作原理。根据the documentation

此方法返回任一颜色的用户定义的名称,如果颜色由一个名称,或公知的颜色的名称创建。对于自定义颜色,返回RGB值。

那么既然你从整数创建Color对象(RGB)值,而不是它的名字 - Color结构不承认它是一个命名的颜色。

该信息不会在运行时通过遍历包含所有已知颜色及其RGB值的映射来动态确定,而是在创建Color对象时存储在专用标记字段中。在将颜色信息作为整数序列化到数据库的过程中,您正在丢失该信息。

0

你混了已知的颜色,只是颜色。当你将一个已知的颜色转换为int,并将其转换回颜色时,你将失去该名称。您必须这样做:

int icolor = System.Drawing.Color.Red.ToArgb(); 

Color knownColor = System.Drawing.Color.FromArgb(icolor).ToKnownColor();