我正在尝试将Color保存到数据库中。我知道我可以将颜色分为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
答案 0 :(得分:5)
PackedValue
是一个读/写属性。你不需要做任何转移就可以使用它。
var c = new Color() { PackedValue = packedColor };
Console.WriteLine(c.A);
Console.WriteLine(c.R);
Console.WriteLine(c.G);
Console.WriteLine(c.B);
答案 1 :(得分: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);
答案 2 :(得分: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);
您将从中获得正确的颜色值