2010-03-07 49 views
92

Sử dụng C# Tôi đã cố gắng phát triển hai phần sau đây. Cách tôi đang làm nó có thể có một số vấn đề và cần lời khuyên tốt bụng của bạn. Ngoài ra, tôi không biết liệu có bất kỳ phương pháp hiện có để làm như vậy.Chuyển đổi System.Drawing.Color thành RGB và Hex Value

private static String HexConverter(System.Drawing.Color c) 
{ 
    String rtn = String.Empty; 
    try 
    { 
     rtn = "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2"); 
    } 
    catch (Exception ex) 
    { 
     //doing nothing 
    } 

    return rtn; 
} 

private static String RGBConverter(System.Drawing.Color c) 
{ 
    String rtn = String.Empty; 
    try 
    { 
     rtn = "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")"; 
    } 
    catch (Exception ex) 
    { 
     //doing nothing 
    } 

    return rtn; 
} 

Cảm ơn.

+0

@Rod https://stackoverflow.com/questions/20750062/what- is-meaning-of-tostringx2 – samgak

Trả lời

143

Tôi không thấy vấn đề ở đây. Mã có vẻ tốt với tôi. Điều duy nhất tôi có thể nghĩ là khối try/catch thừa - Màu là cấu trúc và R, G và B là byte, vì vậy c không thể là rỗng và c.R.ToString(), c.G.ToString()c.B.ToString() có thể không thực sự thất bại (cách duy nhất tôi có thể nhìn thấy chúng thất bại là với một NullReferenceException, và không ai trong số họ thực sự có thể là null).

Bạn có thể tiêu diệt toàn bộ điều lên bằng cách sử dụng sau đây:

private static String HexConverter(System.Drawing.Color c) 
{ 
    return "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2"); 
} 

private static String RGBConverter(System.Drawing.Color c) 
{ 
    return "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")"; 
} 
+0

Tôi muốn đi xa như vậy để nói rằng các khối try-catch trống nên (gần như) phổ biến được loại bỏ. Họ có tiềm năng lớn để dẫn đến mã lỗi, nếu không phải bây giờ thì xuống đường khi mã này được sửa đổi. Tuy nhiên, +1 cho mã đã được dọn sạch và OP +1 cho câu hỏi được đóng khung. – JMD

+7

Hãy cho tôi một thời gian để tìm các equivelant VB: String.Format ("# {0: X2} {1: X2} {2: X2}", cR, cG, cB) – zacharydl

+0

Tôi đăng một sự thích ứng của mã của bạn để C# 6 như một câu trả lời thay thế. Bạn có thể thấy nó [ở đây] (http://stackoverflow.com/a/37821008/1248177). – aloisdg

149

Bạn có thể giữ cho nó đơn giản và sử dụng dịch màu có nguồn gốc:

Color red = ColorTranslator.FromHtml("#FF0000"); 
string redHex = ColorTranslator.ToHtml(red); 

Sau đó phá vỡ ba cặp màu sắc vào hình thức thập phân:

int decValue = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber); 
+5

Nhưng nếu tôi làm theo cách này, Màu đỏ = System.Drawing.Color.Red; chuỗi redHex = ColorTranslator.ToHtml (màu đỏ); không cung cấp Giá trị Hex. – Hoque

+0

Chắc chắn nên làm, tôi đã kiểm tra mã cụ thể và nhận # FF0000. Bạn đang nhận được gì? Bạn cũng có thể muốn tham khảo tài liệu tham khảo MSDN: http://msdn.microsoft.com/en-us/library/system.drawing.colortranslator.tohtml.aspx –

+0

Hãy thử với Màu đỏ = System.Drawing.Color.Red; -> nó không cung cấp # FF0000. – Hoque

18

ví dụ

ColorTranslator.ToHtml(Color.FromArgb(Color.Tomato.ToArgb())) 

Điều này có thể tránh được thủ thuật KnownColor.

+0

Hoạt động như một sự quyến rũ! cảm ơn nhiều. –

1

Tôi tìm thấy một phương pháp khuyến nông mà hoạt động khá tốt

public static string ToHex(this Color color) 
{ 
    return String.Format("#{0}{1}{2}{3}" 
     , color.A.ToString("X").Length == 1 ? String.Format("0{0}", color.A.ToString("X")) : color.A.ToString("X") 
     , color.R.ToString("X").Length == 1 ? String.Format("0{0}", color.R.ToString("X")) : color.R.ToString("X") 
     , color.G.ToString("X").Length == 1 ? String.Format("0{0}", color.G.ToString("X")) : color.G.ToString("X") 
     , color.B.ToString("X").Length == 1 ? String.Format("0{0}", color.B.ToString("X")) : color.B.ToString("X")); 
} 

Ref: https://social.msdn.microsoft.com/Forums/en-US/4c77ba6c-6659-4a46-920a-7261dd4a15d0/how-to-convert-rgba-value-into-its-equivalent-hex-code?forum=winappswithcsharp

+0

Tôi tin rằng nó phải là Hex2, không phải Hex, nếu không thì màu sắc có thể bị sai lệch nội suy. –

+0

@MohammedNoureldin Hex2 sẽ đi đâu trong đoạn mã, tôi đã thấy màu sắc hơi khác đôi khi? – user1

+0

Tôi có nghĩa là 'X2' thay vì' X', nếu không bạn có thể nhận '1' thay vì' 01' thì nó sẽ là một vấn đề. –

19

Nếu bạn có thể sử dụng C# 6, bạn có thể được hưởng lợi từ Interpolated Strings và viết lại @Ari Roth's solution như thế này:

C# 6:

public static class ColorConverterExtensions 
{ 
    public static string ToHexString(this Color c) => $"#{c.R:X2}{c.G:X2}{c.B:X2}"; 

    public static string ToRgbString(this Color c) => $"RGB({c.R}, {c.G}, {c.B})"; 
} 

Ngoài ra:

  • Tôi thêm từ khóa this để sử dụng chúng làm phương pháp tiện ích mở rộng.
  • Bạn có thể sử dụng từ khóa loại string thay vì tên lớp.
  • Bạn có thể sử dụng cú pháp lambda
  • Tôi đổi tên chúng để rõ ràng hơn cho khẩu vị của tôi.
1

Đối với mã thập lục phân thử này

  1. Nhận ARGB (Alpha, Red, Green, Blue) đại diện cho màu
  2. Lọc ra Alpha kênh: & 0x00FFFFFF
  3. Format ra giá trị (dưới dạng thập lục phân "X6" cho hex)

Đối với RGB một

  1. Chỉ dạng raRed, Green, Blue giá trị

Thực hiện

private static string HexConverter(Color c) { 
    return String.Format("#{0:X6}", c.ToArgb() & 0x00FFFFFF); 
} 

public static string RgbConverter(Color c) { 
    return String.Format("RGB({0},{1},{2})", c.R, c.G, c.B); 
} 
Các vấn đề liên quan