2013-03-13 52 views
5

我想將一個Color保存到數據庫。我知道我可以將顏色分成4部分,RGBA,但使用3列保存顏色似乎很愚蠢。所以,然後我簡單地使用限制器將其保存爲字符串,或者甚至僅使用每種顏色3個字符。但它又似乎很愚蠢。 Color結構有一個packedValue屬性,它似乎對值創建了一個uint。但我不知道如何解開它。任何人有任何想法如何解壓一個Color.PackedValue

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

的性質在A,B,G和R(顏色)返回四個compnents爲字節值。 – 2013-03-13 18:45:09

回答

5

PackedValue是一個讀/寫性能。你不需要做任何移位就可以使用它。

var c = new Color() { PackedValue = packedColor }; 
Console.WriteLine(c.A); 
Console.WriteLine(c.R); 
Console.WriteLine(c.G); 
Console.WriteLine(c.B); 
+0

完美謝謝作品 – 2013-03-13 21:26:51

2

the first Google result

//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); 
+0

對不起,我並不是很粗魯!只爲我的答案提供一個參考。我可以看到它是如何脫落的,對不起! – 2013-03-13 18:58:03

+0

此答案無法正常工作。可能是由於我不知道字節移位。不說它不會工作,但科爾坎貝爾的答案完美作品 – 2013-03-13 21:23:57

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); 

你會得到正確的顏色值回了它