2013-03-13 18 views
5

Próbuję zapisać kolor do bazy danych. Wiem, że mogę przyciąć kolor na 4 części, RGBA, ale wydaje się głupie, aby zapisać kolor za pomocą 3 kolumn. Tak więc chciałem po prostu zapisać go na sznurku za pomocą ogranicznika, a nawet po prostu używając 3 znaków na kolor. Ale znowu wydaje się głupie. Struktura koloru ma właściwość packedValue, która wydaje się robić coś z wartościami, aby utworzyć uint. ale nie wiem jak to rozpakować. Ktoś ma jakieś pomysłyJak rozpakować Color.PackedValue

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

The properites A, B, G i R (od koloru) Zwraca cztery compnents jak wartości bajtów. –

Odpowiedz

5

PackedValue jest do odczytu/zapisu własności. Nie musisz nic zmieniać, żeby z niego skorzystać.

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

Działa doskonale dzięki –

2

Od 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

Przepraszam, nie próbowałem być niegrzeczny! Po prostu podaj referencję dla mojej odpowiedzi. Widzę, jak to się stało, przepraszam! –

+0

Ta odpowiedź nie działa poprawnie. prawdopodobnie ze względu na przesunięcie bajtów nie wiem. Nie mówię, że to nie działa, ale odpowiedź Cole'a Campbella działa idealnie –

1

Podczas zmiany bitu należy zamienić kanały B i R. IIRC DirectX wykorzystuje kolor BGRA, a XNA używa RGBA. Jeśli więc modyfikować kod przykładowy powyżej czytać

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

dostaniesz poprawnej wartości kolorów z powrotem z niego