2013-03-13 11 views
5

Tôi đang cố lưu một Màu vào cơ sở dữ liệu. Tôi biết tôi có thể cắt màu thành 4 phần, RGBA nhưng có vẻ ngớ ngẩn để tiết kiệm một màu bằng 3 cột. Vì vậy, sau đó tôi mặc dù chỉ đơn giản là tiết kiệm nó vào một chuỗi bằng cách sử dụng một giới hạn, hoặc thậm chí chỉ sử dụng 3 ký tự cho mỗi màu. Nhưng một lần nữa nó có vẻ ngớ ngẩn. Cấu trúc màu có một thuộc tính đóng góiValue, dường như làm điều gì đó với các giá trị để tạo ra một uint. nhưng tôi không biết cách giải nén nó. Bất cứ ai có bất cứ ý tưởngLàm cách nào để bạn có thể giải nén một Color.PackedValue

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

Các properites A, B, G và R (of Color) trả bốn compnents như giá trị byte. –

Trả lời

5

PackedValue là một đọc/viết tài sản. Bạn không cần phải làm bất kỳ chút dịch chuyển nào để tận dụng nó.

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

Hoạt động hoàn hảo nhờ –

2

Từ 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

Xin lỗi, tôi không cố tỏ ra thô lỗ! Chỉ cần cung cấp một tham chiếu cho câu trả lời của tôi. Tôi có thể thấy nó như thế nào, xin lỗi! –

+0

Câu trả lời này không hoạt động đúng cách. có thể do sự dịch chuyển byte mà tôi không biết. Không nói nó sẽ không hoạt động, nhưng câu trả lời của Cole Campbell hoạt động hoàn hảo –

1

Bạn cần trao đổi kênh B và R khi thực hiện dịch chuyển bit. IIRC DirectX sử dụng màu BGRA trong khi XNA sử dụng RGBA. Vì vậy, nếu chúng ta sửa đổi các mẫu mã ở trên để đọc

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

bạn sẽ nhận được giá trị màu sắc chính xác trở lại ra khỏi nó

Các vấn đề liên quan