Konversi System.Drawing.Color ke RGB dan Hex Value

125

Menggunakan C # saya mencoba mengembangkan dua berikut. Cara saya melakukannya mungkin memiliki beberapa masalah dan butuh saran baik dari Anda. Selain itu, saya tidak tahu apakah ada metode yang ada untuk melakukan hal yang sama.

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

Terima kasih.

Nazmul
sumber

Jawaban:

202

Saya gagal melihat masalahnya di sini. Kode itu terlihat bagus untuk saya.

Satu-satunya hal yang dapat saya pikirkan adalah bahwa mencoba / menangkap blok yang berlebihan - Warna adalah struct dan R, G, dan B adalah byte, sehingga c tidak dapat null dan c.R.ToString(), c.G.ToString(), dan c.B.ToString()tidak bisa benar-benar gagal (yang Satu - satunya cara saya dapat melihat mereka gagal adalah denganNullReferenceException , dan tidak satupun dari mereka yang benar-benar dapat null).

Anda bisa membersihkan semuanya menggunakan yang berikut:

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() + ")";
}
Ari Roth
sumber
1
Saya lebih jauh mengatakan bahwa blok try-catch kosong seharusnya (hampir) secara universal diberantas. Mereka memiliki potensi besar untuk mengarah ke kode kereta, jika tidak sekarang maka jalan ketika kode ini dimodifikasi. Namun, +1 untuk kode yang telah dibersihkan, dan ke OP +1 untuk pertanyaan dengan kerangka yang baik.
JMD
7
Butuh waktu beberapa saat untuk menemukan VB equivelant: String.Format ("# {0: X2} {1: X2} {2: X2}", cR, cG, cB)
zacharydl
1
Saya memposting adaptasi kode Anda ke C # 6 sebagai jawaban alternatif. Anda bisa melihatnya di sini .
aloisdg pindah ke codidact.com
Ini akan menghasilkan warna yang salah jika warna memiliki saluran alfa (transparansi). Anda akan mendapatkan kekaburan penuh.
LarryBud
@LarryBud Benar sekali, dan terima kasih telah menunjukkannya. Contoh saya melewatkan saluran alfa hanya karena saya mematikan pertanyaan aslinya, yang juga tidak memasukkannya. :)
Ari Roth
189

Anda dapat membuatnya tetap sederhana dan menggunakan penerjemah warna asli:

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

Kemudian pisahkan tiga pasangan warna menjadi bentuk integer:

int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
Troy Hunt
sumber
7
Tetapi jika saya melakukannya dengan cara ini, Warna merah = System.Drawing.Color.Red; string redHex = ColorTranslator.ToHtml (merah); itu tidak memberikan Nilai Hex.
Nazmul
Tentunya harus dilakukan, saya menguji kode itu secara khusus dan mendapat # "FF0000". Apa yang kamu dapatkan Anda mungkin juga ingin merujuk ke referensi MSDN: msdn.microsoft.com/en-us/library/…
Troy Hunt
Coba dengan Warna merah = System.Drawing.Color.Red; -> tidak menyediakan # FF0000.
Nazmul
9
Kode yang Anda berikan berfungsi tetapi ketika saya mengubah baris pertama kode Anda menjadi: Warna merah = System.Drawing.Color.Red; -> Maka itu tidak memberikan kode hex. Ini memberi "Merah" sebagai output.
Nazmul
4
@ Hooque - Dikonfirmasi. ColorTranslator memberi nama "ramah" pada warnanya. Menyebalkan sekali!
anon
38

Jika Anda dapat menggunakan C # 6 atau lebih tinggi, Anda bisa mendapat manfaat dari Interpolated Strings dan menulis ulang solusi @Ari Roth seperti ini:

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

Juga:

  • Saya menambahkan kata kunci thisuntuk menggunakannya sebagai metode ekstensi.
  • Kita bisa menggunakan kata kunci type string bukan nama kelas.
  • Kita bisa menggunakan sintaks lambda.
  • Saya mengganti nama mereka menjadi lebih eksplisit untuk seleraku.
aloisdg pindah ke codidact.com
sumber
Sangat bersih ... +1!
Shockwaver
26

misalnya

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

Ini dapat menghindari trik FamousColor.

Andy Fong
sumber
1

Saya menemukan metode ekstensi yang berfungsi dengan baik

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-equ-ent-hequ-code-code? forum = winappswithcsharp

pengguna1
sumber
Saya percaya itu harus Hex2, bukan Hex, kalau tidak warna mungkin salah diinterpolasi.
Mohammed Noureldin
@MohammedNoureldin Ke mana Hex2 masuk dalam kode, kadang-kadang saya melihat warna sedikit berbeda?
user1
Maksud saya X2alih-alih X, kalau tidak, Anda mungkin mendapatkan 1alih-alih 01itu akan menjadi masalah.
Mohammed Noureldin
@MohammedNoureldin Ya, dengan X2itu Anda tidak perlu semua color.B.ToString("X").Length == 1 ? terner.
ProfK
1

Untuk kode heksadesimal coba ini

  1. Dapatkan representasi ARGB (Alpha, Red, Green, Blue) untuk warna
  2. Saring saluran Alpha:& 0x00FFFFFF
  3. Format nilai (sebagai hexadecimal "X6" untuk hex)

Untuk RGB satu

  1. Hanya memformat keluar Red , Green, Bluenilai-nilai

Penerapan

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);
}
Dmitry Bychenko
sumber