范围.ToARGB()返回值

时间:2009-10-21 10:15:03

标签: c# .net

我希望能够在数据库中为我的应用程序中的面板存储backgroundcolor。

值可以是具体颜色或空,表示它已从父项继承。

我想通过调用System.Drawing.Color.ToArgb()方法将它存储在一个不可为空的int字段中。

对于白色,此方法的返回值似乎为-1,对于黑色,此方法的返回值似乎为-16777216 ...

所以我在想,为了表明没有选择颜色,我可以存储一个正整数。这将提供一种非常简单的方法来检查是否已存储显式颜色或未存储颜色。

现在我想知道为什么System.Drawing.Color.ToArgb()可能会返回正值。 (此功能的可能返回值范围是多少)。

我没有篡改alpha通道,所以我不知道这是否会产生影响....

如果我无法存储一个正整数来表示显式颜色的偏差,我想我只需要使该字段可以为空......

2 个答案:

答案 0 :(得分:5)

好吧,你得到一个包含Alpha,Red,Green和Blue的32位整数,每个整数都填充8位。

alpha值是最高位8位,所以对于每个非透明颜色,你都有0xFF(如果它是有符号整数,则自动使该整数为负)。

因此,如果您的Alpha值低于128(0x80),您将获得正值颜色。

该函数的可能返回值的范围确实是0x000000000xFFFFFFFF,换句话说:每个可能的32位整数。对于带符号的int,这是-2147483648到+2147483647。

在你的情况下,我肯定会允许NULL值,因为这实际上是你想要的。如果您完全删除alpha值,则还有另外8位信息。所以你可以然后实现它检查负值/非负值。

答案 1 :(得分:1)

引用from MSDN

  

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

这是一个32位字段。前8位用于alpha通道。当MSB为1时,它将始终返回负值。 当它变为0时,你就可以获得正值。我希望你知道如何存储值以及符号位如何影响它?

当AA从11111111b下降到0xxxxxxxb时,则期望获得正值。

恕我直言Nullable字段是一种可行的方式。