2013-03-13 3 views
5

Я пытаюсь сохранить цвет в базу данных. Я знаю, что могу разрезать цвет на 4 части, RGBA, но кажется глупым сохранить цвет, используя 3 столбца. Поэтому, хотя я просто сохранил его в строке с использованием ограничителя или даже просто использовал 3 символа для каждого цвета. Но снова это кажется глупым. Структура Color имеет свойство packingValue, которое, похоже, что-то делает со значениями для создания uint. но я не знаю, как его распаковать. Кто-нибудь есть какие-либо идеиКак вы можете распаковать 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 и R (цвета) возвращают четыре compnents как байтов. –

ответ

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

Прекрасно работает. –

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

Извините, я не пытался быть грубым! Просто предоставьте ссылку на мой ответ. Я вижу, как это сошло, извините! –

+0

Этот ответ не работал должным образом. вероятно, из-за смещения байтов я не знаю. Не сказать, что это не сработает, но ответ Коула Кэмпбелла отлично работает –

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

вы получите правильное значение цвета обратно из него

Смежные вопросы