Chuyển đổi System.Drawing.Color thành RGB và Hex Value


125

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

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.


Câu trả lời:


202

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ĩ đến là try / catch khối là dư thừa - Màu sắc là một struct và R, G và B là byte, vì vậy c không thể vô c.R.ToString(), c.G.ToString()c.B.ToString()không thể thực sự thất bại (các cách duy nhất tôi có thể thấy họ thất bại là với mộtNullReferenceException , và không ai trong số họ thực sự có thể là null).

Bạn có thể làm sạch toàn bộ bằng cách sử dụng như sau:

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() + ")";
}

1
Tôi đã đi xa để nói rằng các khối thử bắt trống nên (gần như) sẽ bị xóa bỏ. Chúng 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 tốt.
JMD

7
Mất một lúc tôi mới tìm được bộ cân bằng VB: String.Format ("# {0: X2} {1: X2} {2: X2}", cR, cG, cB)
zacharydl

1
Tôi gửi một bản phóng tác mã của bạn lên C # 6 như một câu trả lời thay thế. Bạn có thể thấy nó ở đây .
aloisdg chuyển đến codidact.com

Điều này sẽ tạo ra màu sai nếu màu có kênh alpha (độ trong suốt). Bạn sẽ nhận được đầy đủ opaquiness.
LarryBud

@LarryBud Hoàn toàn đúng, và cảm ơn bạn đã chỉ ra. Ví dụ của tôi đã bỏ qua kênh alpha chỉ vì tôi đã bỏ qua câu hỏi ban đầu, điều này cũng không bao gồm nó. :)
Ari Roth

189

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

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

Sau đó chia ba cặp màu thành dạng số nguyên:

int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

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

Chắc chắn nên làm, tôi đã kiểm tra mã đó một cách cụ thể và nhận được # "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: msdn.microsoft.com/en-us/l Library / từ
Troy Hunt

Thử với Màu đỏ = System.Drawing.Color.Red; -> nó không cung cấp # FF0000.
Nazmul

9
Mã bạn đã cung cấp hoạt động nhưng khi tôi thay đổi dòng đầu tiên của mã thành: Color red = System.Drawing.Color.Red; -> Sau đó, nó không cung cấp mã hex. Nó cho "Red" làm đầu ra.
Nazmul

4
@Hoque - Khẳng định. ColorTranslator đặt tên "thân thiện" với màu. Thật khó chịu!
anon

38

Nếu bạn có thể sử dụng C # 6 trở lên, bạn có thể hưởng lợi từ Chuỗi nội suy và viết lại giải pháp của @Ari Roth 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})";
}

Cũng thế:

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

Thật sạch sẽ ... +1!
Shockwaver

26

ví dụ

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

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


1

Tôi tìm thấy một phương pháp mở rộng 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"));
}

Tham chiếu: https://social.msdn.microsoft.com/Forums/en-US/4c77ba6c-6659-4a46-920a-7261dd4a15d0/how-to-convert-rgba-value-into-its-equivalent-hex-code? diễn đàn = winappswithcsharp


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

@MohammedNoureldin Hex2 sẽ đi đâu trong mã, đôi khi tôi thấy màu sắc hơi khác nhau?
dùng1

Ý tôi là X2thay vì X, nếu không bạn có thể nhận được 1thay vì 01đó sẽ là một vấn đề.
Mohammed Noureldin

@MohammedNoureldin Vâng, X2sau đó bạn không cần tất cả color.B.ToString("X").Length == 1 ? chim nhạn.
ProfK

1

Đối với mã thập lục phân, hãy thử điều này

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

Đối với RGB một

  1. Chỉ cần định dạng ra Red , Green, Bluegiá 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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.