Color.FromArgb如何将Int32作为参数?

时间:2014-09-11 15:35:56

标签: c# colors argb

Color.FromArgb methodInt32作为参数。 Color.White的值为#FFFFFFFF为ARGB,4.294.967.295为十进制(超过int.MaxValue)。我在这里不理解什么?如果有效ARGB值高于int的最大值,该方法如何将int作为参数?

8 个答案:

答案 0 :(得分:9)

不幸的是,由于Color.FromArgb需要int而不是uint,因此您需要将unchecked关键字用于大于int.MaxValue的颜色。< / p>

var white = Color.FromArgb(unchecked((int)0xFFFFFFFF));

答案 1 :(得分:3)

你的困惑在于标牌。虽然Int32.MaxValue等于2,147,483,647,但已签名。

如果你看UInt32.MaxValue,那是无符号的,正如你所看到的,最大值是4,294,967,295。

你看,有符号数字,二进制,使用最左边的位来确定它是正数还是负数。二进制的无符号数字没有有符号位并使用最后一位,使存储容量基本上翻倍。

我认为Color类使用Int32而不是unsigned的部分原因是因为unsigned int不符合CLS,如this SO Question中所述

答案 2 :(得分:0)

  

32位ARGB值的字节顺序是AARRGGBB。最多   由AA表示的有效字节(MSB)是alpha分量   值。第二个,第三个和第四个字节,由RR,GG和   BB分别是红色,绿色和蓝色,   分别

http://msdn.microsoft.com/en-us/library/2zys7833(v=vs.110).aspx

该方法似乎将int32分解为32位并将其转换为AARRGGBB,即每个参数A,R,G和B的两个半字节(1个字节)。

这是有效的,因为十进制FFFFFFFF中的每个数字都转换为单个半字节。每个空格特别等于4位。因此,该位表示直接转换为32位,可以表示为单个int32。

再举几个细节:

以十六进制表示的空格的最大值为F(或十进制的15)。

4位(1个半字节)的最大值是(8,4,2,1),也是15.

因此,FFFFFFFF = 1111 1111 1111 1111 1111 1111 1111 1111,然后表示为int32。

AS @icemanind指出,第一位是为符号(+或 - )保留的,因此将int32的数值限制为2,147,483,647。

它不是数值,而是对此方法很重要的位值。

答案 3 :(得分:0)

Color由四个重要字段组成,A(字母),R(红色),G(绿色)和B (蓝色)。每个都是8位。四个八位值适合int32。虽然MSB可能是符号位,但会被忽略。

0xFFFFFFFF在表示为int时可能是负数,但它的颜色为白色。

答案 4 :(得分:0)

实际的问题是您想输入一个八位数的十六进制数字,但是由于单参数版本使用int而不是uint,因此很难用高于&7F的Alpha值。这是因为int使用一位来表示符号。

最简单的解决方案是使用四参数版本:

var whiteColor = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);

答案 5 :(得分:-1)

根据Color.FromArgb Method (Int32)的MSDN页面,您不会传递颜色的实际int值。例如,要变红,您可以拨打Color.FromArgb(0x78FF0000)。因此,对于白色,您只需要拨打Color.FromArgb(0xFFFFFFFF)

答案 6 :(得分:-1)

没关系。

#FFFFFFFF是二进制的11111111111111111111111111111111。

如果您使用无符号整数,则小数为4.294.967.295 。如果您使用签名的整数,则会将其解释为-1。

但实际的十进制值并不重要;重要的是各个位的价值。

signed int仍然可以存储4.294.967.295个值,其中只有一半是负数。 这些位是相同的。

答案 7 :(得分:-2)

您可以将0x00FFFFFF-0x01000000编译器正常工作