2010-04-22 13 views
9

System.Drawing.Color có phương thức ToArgb() để trả về biểu diễn Int của màu.
Trong Silverlight, tôi nghĩ chúng ta phải sử dụng System.Windows.Media.Color. Nó có các thành viên A, R, G, B, nhưng không có phương thức trả về một giá trị duy nhất.
Làm cách nào để triển khai ToArgb()? Trong System.Drawing.Color, ToArgb() bao gồmThực hiện ToArgb()

return (int) this.Value; 

System.Windows.Media.Color có một phương pháp FromArgb (byte A, byte R, byte G, byte B). Làm thế nào để phân hủy Int được trả về bởi ToArgb() để sử dụng với FromArgb()?

Cảm ơn mọi con trỏ ...

Trả lời

30

Ngắn và nhanh. Nếu không có một cuộc gọi phương thức bổ sung, nhưng với các hoạt động nhanh.

// To integer 
int iCol = (color.A << 24) | (color.R << 16) | (color.G << 8) | color.B; 

// From integer 
Color color = Color.FromArgb((byte)(iCol >> 24), 
          (byte)(iCol >> 16), 
          (byte)(iCol >> 8), 
          (byte)(iCol)); 
+0

Kết quả trong một ngoại lệ tràn trong VB.NET. 'CByte ((iCol >> 24) Và & HFF)' hoạt động. – mbomb007

5

Có vẻ như bạn đang đặt hai câu hỏi tại đây, hãy để tôi thực hiện một câu hỏi khác tại đó. Bất kể, bạn sẽ muốn xem xét sử dụng lớp BitConverter.

Từ this page:

Byte-Trật tự của 32-bit ARGB giá trị là AARRGGBB.

Vì vậy, để thực hiện ToArgb(), bạn có thể viết một extension method rằng làm điều gì đó như thế này:

public static int ToArgb(this System.Windows.Media.Color color) 
{ 
    byte[] bytes = new byte[] { color.A, color.R, color.G, color.B }; 
    return BitConverter.ToInt32(bytes, 0); 
} 

Và để "phân hủy các Int trả về bởi ToArgb() để sử dụng với FromArgb()", bạn có thể làm điều này:

byte[] bytes = BitConverter.GetBytes(myColor.ToArgb()); 
byte aVal = bytes[0]; 
byte rVal = bytes[1]; 
byte gVal = bytes[2]; 
byte bVal = bytes[3]; 

Color myNewColor = Color.FromArgb(aVal, rVal, gVal, bVal); 

Hy vọng điều này sẽ hữu ích.

+0

Rất hữu ích, cảm ơn. – Number8

+0

Tôi nghĩ rằng bạn có các mảng ngược. 'Thứ tự byte của giá trị ARGB 32 bit là AARRGGBB.' là các chữ số của uint 8 chữ số. Trong ít endian (có lẽ là trường hợp phổ biến hơn) mã của bạn là sai, màu xanh đến trước. – Zarat

+0

@ Zarat, bạn chính xác cho các chip tương thích với Intel. BitConverter không thay đổi endian-ness của thứ tự byte của bạn, do đó, cùng một mã có thể có các byte được sắp xếp theo thứ tự khác nhau tùy thuộc vào thứ tự endian. –

1

Chỉ cần một lưu ý ngắn:

Lấy đại diện nguyên của một đối tượng "Color" có vẻ là nhanh hơn gấp 4 lần đối với tôi khi gọi color.ToArgb() trực tiếp thay vì sử dụng bitshift-hoạt động tại câu trả lời được đánh dấu. Vì vậy, nếu bạn có quyền truy cập vào. ToArgb(), hãy luôn sử dụng nó!

Trình tạo chuỗi cho biết anh ấy không truy cập vào nó, do đó, tất nhiên câu trả lời được đánh dấu vẫn chính xác, juse không bị lẫn lộn bởi "hoạt động nhanh" được xác nhận quyền sở hữu trong đó. Chỉ cần nhớ: Màu của thể hiện Màu được lưu bên trong dưới dạng giá trị int, do đó ToArgb() chỉ trả về nó, trong khi truy cập từng byte đơn của nó tới (theo thuộc tính .A, .R., .G., .B) và sau đó tái hợp chúng bằng bithifting là kinda di chuyển trong một vòng tròn.

+1

System.Windows.Media.Color không có phương thức ToArgb và cũng không lưu trữ màu nội bộ dưới dạng int. Có vẻ như bạn không đọc câu hỏi. – Zarat