5

Colorをデータベースに保存しようとしています。色をRGBAの4つの部分にカットできることは知っていますが、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

最初のGoogleの結果から:

//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 に答える