5

我正在尝试将颜色保存到数据库。我知道我可以将颜色分成 4 部分 RGBA,但使用 3 列保存颜色似乎很愚蠢。所以我想简单地使用限制器将它保存到一个字符串中,或​​者甚至只使用每种颜色的 3 个字符。但这又似乎很愚蠢。Color 结构有一个 packedValue 属性,它似乎对值做一些事情来创建一个 uint。但我不知道如何打开它。有人有想法么

Color c = new Color.Black;
uint i = c.PackedValue;
Color newColor=Color.FromUINT(i); // This doesn't work of course
4

3 回答 3

5

PackedValue是一个读/写属性。您无需进行任何位移即可使用它。

var c = new Color() { PackedValue = packedColor };
Console.WriteLine(c.A);
Console.WriteLine(c.R);
Console.WriteLine(c.G);
Console.WriteLine(c.B);
于 2013-03-13T20:37:25.687 回答
2

第一个谷歌结果

//First lets pack the color
Color color = new Color(155, 72, 98, 255);
uint packedColor = color.PackedValue;
//Now unpack it to get the original value.
Color unpackedColor = new Color();
unpackedColor.B = (byte)(packedColor);
unpackedColor.G = (byte)(packedColor >> 8);
unpackedColor.R = (byte)(packedColor >> 16);
unpackedColor.A = (byte)(packedColor >> 24);
于 2013-03-13T18:42:21.013 回答
1

进行位移时需要交换 B 和 R 通道。IIRC DirectX 使用 BGRA 颜色,而 XNA 使用 RGBA。所以如果我们修改上面的示例代码来阅读

//First lets pack the color
Color color = new Color(155, 72, 98, 255);
uint packedColor = color.PackedValue;
//Now unpack it to get the original value.
Color unpackedColor = new Color();
unpackedColor.R = (byte)(packedColor);
unpackedColor.G = (byte)(packedColor >> 8);
unpackedColor.B = (byte)(packedColor >> 16);
unpackedColor.A = (byte)(packedColor >> 24);

你会从中得到正确的颜色值

于 2013-06-07T07:22:12.797 回答