System.Drawing.Color'u RGB ve Hex Değerine Dönüştür


126

C # kullanarak aşağıdaki ikisini geliştirmeye çalışıyordum. Bunu yapma şeklimde bazı sorunlar olabilir ve sizin nazik tavsiyenize ihtiyacım olabilir. Ayrıca, aynısını yapmak için mevcut bir yöntem olup olmadığını bilmiyorum.

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;
}

Teşekkürler.


Yanıtlar:


202

Buradaki sorunu göremiyorum. Kod bana iyi görünüyor.

Aklıma gelen tek şey deneme / yakalama blokları gereksiz olduğunu - c null olamaz ve bu nedenle, Renk, G yapı ve R ve B bayt olan c.R.ToString(), c.G.ToString()ve c.B.ToString()aslında başarısız olamaz ( onların başarısız olduğunu görebilmemin tek yolu a NullReferenceExceptionile ve hiçbiri aslında boş olamaz).

Aşağıdakileri kullanarak her şeyi temizleyebilirsiniz:

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
Boş deneme-yakalama bloklarının (neredeyse) evrensel olarak ortadan kaldırılması gerektiğini söyleyecek kadar ileri gideceğim. Buggy koduna yol açma konusunda büyük potansiyele sahipler, şimdi değilse de, bu kod değiştirildiğinde yolun aşağısında. Yine de, temizlenmiş kod için +1 ve iyi çerçeveli bir soru için OP + 1'e.
JMD

7
VB eşdeğerini bulmam biraz zaman aldı: String.Format ("# {0: X2} {1: X2} {2: X2}", cR, cG, cB)
zacharydl

1
Alternatif bir cevap olarak kodunuzun C # 6'ya bir uyarlamasını gönderiyorum. Burada görebilirsiniz .
aloisdg codidact.com'a taşınıyor

Renk bir alfa kanalına (saydamlık) sahipse bu yanlış rengi üretecektir. Tam opaklığa kavuşacaksınız.
LarryBud

@LarryBud Kesinlikle doğru ve bunu belirttiğiniz için teşekkür ederim. Örneğim, alfa kanalını yalnızca orijinal soruyu kapattığım için atladı, bu soruyu da içermiyordu. :)
Ari Roth

189

Basit tutabilir ve yerel renk çeviricisini kullanabilirsiniz:

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

Ardından üç renk çiftini tam sayı biçime bölün:

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

7
Ama bu şekilde yaparsam, Color red = System.Drawing.Color.Red; string redHex = ColorTranslator.ToHtml (kırmızı); Hex Değeri sağlamaz.
Nazmul

Kesinlikle yapmalı, bu kodu özel olarak test ettim ve # "FF0000" aldım. Ne alıyorsun Ayrıca MSDN referansına da başvurmak isteyebilirsiniz: msdn.microsoft.com/en-us/library/…
Troy Hunt

Color red = System.Drawing.Color.Red ile deneyin; -> # FF0000 sağlamaz.
Nazmul

9
Sağladığınız kod çalışıyor ancak kodunuzun ilk satırını şu şekilde değiştirdiğimde: Color red = System.Drawing.Color.Red; -> Daha sonra hex kodunu vermez. Çıktı olarak "Kırmızı" verir.
Nazmul

4
@Hoque - Onaylandı. ColorTranslator, renge "kolay" bir ad verir. Ne kadar can sıkıcı!
anon

38

C # 6 veya üstünü kullanabiliyorsanız, Interpolated Strings'den faydalanabilir ve @Ari Roth'un çözümünü şu şekilde yeniden yazabilirsiniz :

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

Ayrıca:

  • Anahtar kelimeyi thisuzantı yöntemi olarak kullanmak için ekliyorum .
  • stringSınıf adı yerine type anahtar kelimesini kullanabiliriz .
  • Lambda sözdizimini kullanabiliriz.
  • Onları kendi zevkime göre daha açık olacak şekilde yeniden adlandırıyorum.

Çok temiz ... +1!
Shockwaver

26

Örneğin

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

Bu, KnownColor hilesini önleyebilir.


1

Oldukça iyi çalışan bir uzatma yöntemi buldum

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

Referans: 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


Bunun Hex2 değil Hex2 olması gerektiğine inanıyorum, aksi takdirde renk enterpolasyonu yanlış olabilir.
Muhammed Nureldin

@MohammedNoureldin Hex2 kodda nereye giderdi, bazen renklerin biraz farklı olduğunu gördüm?
kullanıcı1

Bunun X2yerine demek istedim X, aksi takdirde 1yerine alabilirsiniz 01o zaman sorun olur.
Muhammed Nureldin

@MohammedNoureldin Evet, X2o zaman tüm color.B.ToString("X").Length == 1 ? üçlülere ihtiyacın yok .
ProfK

1

Onaltılık kod için şunu deneyin

  1. Get argb (Alpha, Kırmızı, Yeşil, Mavi) renk için temsilini
  2. Alfa kanalını filtreleyin :& 0x00FFFFFF
  3. Değeri biçimlendirin (onaltılık için onaltılık "X6" olarak)

RGB biri için

  1. Sadece dışarı biçimlendirmek Red , Green, Bluedeğerler

uygulama

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);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.