2010-07-23 31 views
13

Tôi cần phải sắp xếp từng màu được sử dụng trong ứng dụng WPF vào cơ sở dữ liệu. Tôi muốn sử dụng các giá trị sRGB, vì chúng quen thuộc hơn với những người trong số chúng ta đã dành vài năm qua để phát triển web.Làm cách nào để tuần tự hóa đối tượng System.Windows.Media.Color thành chuỗi sRGB?

Làm cách nào để nhận chuỗi ARGB (như #FFFFFFFF) từ đối tượng System.Windows.Media.Color?

CẬP NHẬT: Tôi đã bị lừa bởi tài liệu về MSDN. Như @Kris đã lưu ý bên dưới, tài liệu về phương thức ToString() không chính xác. Mặc dù nó nói rằng ToString() "tạo ra một chuỗi đại diện của màu sắc bằng cách sử dụng các kênh ScRGB", nó thực sự sẽ trả về một chuỗi trong định dạng hex ARGB nếu màu sắc được tạo ra bằng cách sử dụng phương pháp FromARGB(). Đó là một tính năng không có giấy tờ, tôi cho là vậy.

Xem http://msdn.microsoft.com/en-us/library/ms606572.aspx

Trả lời

16

Nếu bạn tạo màu bằng cách sử dụng Color.FromRgb hoặc Color.FromArgb thay vì FromScRgb, bạn sẽ nhận được kết quả chuỗi hex từ ToString.

Nếu bạn muốn làm điều đó bằng tay

string.Format("#{0:X2}{1:X2}{2:X2}{3:X2}", c.A, c.R, c.G, c.B); 

Bạn có thể sử dụng int.Parse (, NumberStyles.HexNumber) để đi theo con đường khác.

Lưu ý sRGB và scRGB tham chiếu đến các không gian màu khác nhau, đảm bảo bạn sử dụng vùng màu bạn muốn.

+0

Bạn có nghĩa là nếu tôi tạo đối tượng Màu bằng cách sử dụng FromArgb, ToString sẽ trả về chuỗi hex ARGB thay vì giá trị ScRgb? Điều đó mâu thuẫn với những gì nó nói trong tài liệu MSDN: http://msdn.microsoft.com/en-us/library/ms606572.aspx. – dthrasher

+0

Tôi đã không nhận thấy rằng trong tài liệu nhưng nó tạo ra một định dạng hex khi sử dụng những phương pháp đó. Nhìn vào phản xạ một lá cờ được thiết lập được sử dụng trong việc thực hiện ToString. – Kris

+0

Yup. ToString() cung cấp cho tôi định dạng tôi muốn. Có vẻ như tài liệu MSDN không đầy đủ. – dthrasher

0

Bạn có thể lấy A, R, G và B giá trị từ một trường hợp màu như bytes, vì vậy bạn chỉ cần phải chuyển đổi các byte để hex và nối những giá trị hex như dây đàn.

byte[] to hex string

1

câu trả lời này là dành cho GDI màu sắc, và không WPF, vì vậy có thể không giúp đỡ nhiều.

Bạn có thể lấy chuỗi màu HTML (và mặt sau) như thế này

System.Drawing.Color c = System.Drawing.ColorTranslator.FromHtml("#F5F7F8"); 
String strHtmlColor = System.Drawing.ColorTranslator.ToHtml(c); 

here là tài liệu MSDN.

+3

Đó là cho hệ thống.Drawing.Color (GDI +), không phải System.Windows.Media.Color (WPF). – AndrewS

+3

vâng, như tôi đã lưu ý. –

4

Tôi đã tạo cấu trúc để xử lý chuyển đổi và tuần tự hóa. Nó giải quyết hai vấn đề đối với tôi: đó là serialisable nó sửa lỗi chính tả;)

[Serializable] 
public struct Colour 
    { 
    public byte A; 
    public byte R; 
    public byte G; 
    public byte B; 

    public Colour(byte a, byte r, byte g, byte b) 
     { 
     A = a; 
     R = r; 
     G = g; 
     B = b; 
     } 

    public Colour(Color color) 
     : this(color.A, color.R, color.G, color.B) 
     { 
     } 

    public static implicit operator Colour(Color color) 
     { 
     return new Colour(color); 
     } 

    public static implicit operator Color(Colour colour) 
     { 
     return Color.FromArgb(colour.A, colour.R, colour.G, colour.B); 
     } 
    } 

Chỉ sử dụng Colour nơi bạn nếu không sẽ sử dụng System.Windows.Media.Color

+0

Dude, 'Color' là chính tả của người Mỹ. 'Colour' là người Anh. –

+3

Nó được gọi là mỉa mai. – Ricky

8

Bạn còn thể làm điều đó theo cách này:

string myHex = new ColorConverter().ConvertToString(myColor); 
+0

Không có phương thức nào trong 'ColorConverter' –

+1

@EmpereurAiman ​​nó được thừa kế https://msdn.microsoft.com/en-us/library/92ybstc2%28v=vs.110%29.aspx – RJFalconer

+0

Bạn không thể sử dụng. ToString() – Epirocks

1

Nếu mục đích của bạn là để tuần tự hóa thành một tệp và deserialize trở lại đối tượng màu, tôi nghĩ bạn nên chuyển đổi màu thành Int32 và ngược lại. Không cần phải serialize/deserialize Int32. Nếu đây là mục đích của bạn, đây là mã: Màu Để Int32:

 byte[] color = new byte[4]; 
     color[0] = Color.B; 
     color[1] = Color.G; 
     color[2] = Color.R; 
     color[3] = Color.A; 
     Int32 intColor = System.BitConverter.ToInt32(color, 0); 

Int32 Để Màu sắc:

byte[] bytes = System.BitConverter.GetBytes(intColor); 
Color =new System.Windows.Media.Color(){B= bytes[0], G=bytes[1], R=bytes[2], A=bytes[3]}; 
Các vấn đề liên quan