Convert System.Drawing.Color to RGB और Hex Value


125

C # का उपयोग करके मैं निम्नलिखित दो को विकसित करने की कोशिश कर रहा था। जिस तरह से मैं कर रहा हूं उससे कुछ समस्या हो सकती है और आपकी तरह की सलाह की जरूरत है। इसके अलावा, मुझे नहीं पता कि क्या ऐसा करने के लिए कोई मौजूदा तरीका है।

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

धन्यवाद।


जवाबों:


202

मैं यहाँ समस्या को देखने में विफल रहा हूँ। कोड मुझे अच्छा लग रहा है।

केवल एक चीज मैं के बारे में सोच सकता है कि ट्राई / कैच ब्लॉक निरर्थक हैं - रंग एक struct और आर, जी है, और बी बाइट्स हैं, इसलिए ग नल नहीं हो सकता और c.R.ToString(), c.G.ToString()है, और c.B.ToString()वास्तव में असफल नहीं हो सकता ( जिस तरह से मैं देख सकता हूँ कि उन्हें असफल होना एक के साथ है NullReferenceException, और उनमें से कोई भी वास्तव में अशक्त नहीं हो सकता है)।

आप निम्नलिखित का उपयोग करके पूरी चीज़ को साफ कर सकते हैं:

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
मैं यहाँ तक कहूँगा कि खाली कोशिश करने वाले ब्लॉक को (लगभग) सार्वभौमिक रूप से मिटा देना चाहिए। उनके पास छोटी गाड़ी कोड के लिए नेतृत्व करने की बहुत क्षमता है, अगर अब नहीं तो सड़क नीचे जब यह कोड संशोधित किया जाता है। फिर भी, साफ किए गए कोड के लिए +1, और अच्छी तरह से तैयार किए गए प्रश्न के लिए ओपी +1 पर।
JMD

7
VB को खोजने के लिए मुझे कुछ समय मिला: String.Format ("# {0: X2} {1: X2} {2: X2}", cR, cG, cB)
zacharyll

1
मैं वैकल्पिक उत्तर के रूप में C # 6 में आपके कोड का एक अनुकूलन पोस्ट करता हूं। आप इसे यहाँ देख सकते हैं ।
aloisdg

यह गलत रंग का उत्पादन करेगा यदि रंग में एक अल्फा चैनल (पारदर्शिता) है। आपको पूर्ण अपारदर्शिता मिलेगी।
लैरीबड

@LarryBud बिल्कुल सच है, और इसे इंगित करने के लिए धन्यवाद। मेरे उदाहरण ने अल्फा चैनल को केवल इसलिए छोड़ दिया क्योंकि मैं मूल प्रश्न से हट रहा था, जिसमें यह भी शामिल नहीं था। :)
अरी रोथ

189

आप इसे सरल रख सकते हैं और देशी रंग अनुवादक का उपयोग कर सकते हैं:

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

फिर तीन रंग के जोड़े को पूर्णांक रूप में तोड़ें:

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

7
लेकिन अगर मैं इस तरह से, रंग लाल = System.Drawing.Color.Red; string redHex = ColorTranslator.ToHtml (लाल); यह हेक्स मूल्य प्रदान नहीं करता है।
नाज़मुल

निश्चित रूप से करना चाहिए, मैंने उस कोड का विशेष रूप से परीक्षण किया और # "FF0000" प्राप्त किया। आपको क्या मिल रहा है? आप MSDN संदर्भ को भी देखना पसंद कर सकते हैं: msdn.microsoft.com/en-us/library/…
ट्रॉय हंट

रंग लाल के साथ प्रयास करें = System.Drawing.Color.Red; -> यह # FF0000 प्रदान नहीं करता है।
नज़्मुल

9
आपके द्वारा प्रदान किया गया कोड, लेकिन जब मैं आपके कोड की पहली पंक्ति को बदलता हूं: रंग लाल = System.Drawing.Color.Red; -> फिर यह हेक्स कोड नहीं देता है। यह आउटपुट के रूप में "रेड" देता है।
नाजमुल

4
@ हॉक - पुष्टि। ColorTranslator रंग को "दोस्ताना" नाम देता है। कैसा कष्टकर!
आनन फानन

38

यदि आप C # 6 या उच्चतर का उपयोग कर सकते हैं, तो आप Interpolated Strings से लाभ उठा सकते हैं और @Ari Roth के समाधान को फिर से लिख सकते हैं जैसे:

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

इसके अलावा:

  • मैं thisउन्हें एक्सटेंशन विधियों के रूप में उपयोग करने के लिए कीवर्ड जोड़ता हूं ।
  • हम stringवर्ग नाम के बजाय टाइप कीवर्ड का उपयोग कर सकते हैं ।
  • हम लंबोदर सिंटैक्स का उपयोग कर सकते हैं।
  • मैं अपने स्वाद के लिए और अधिक स्पष्ट होने के लिए उनका नाम बदल देता हूं।

इतना साफ ... +1!
शोकावर

26

जैसे

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

इससे नॉटकोलर ट्रिक से बचा जा सकता है।


1

मुझे एक एक्सटेंशन विधि मिली जो काफी अच्छी तरह से काम करती है

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-its-equivalent-hex-code? मंच = winappswithcsharp


मेरा मानना ​​है कि यह Hex2 होना चाहिए, हेक्स नहीं, अन्यथा रंग गलत प्रक्षेपित हो सकता है।
मोहम्मद नौलेडिन

@MohammedNoureldin Hex2 कोड में कहां जाएगा, मैंने कभी-कभी रंगों को थोड़ा अलग देखा है?
user1

मैं X2इसके बजाय मतलब था X, अन्यथा आप के 1बजाय मिल सकता है 01तो यह एक समस्या होगी।
मोहम्मद नौरेलिन

@MohammedNoureldin हाँ, X2तब आपको सभी color.B.ToString("X").Length == 1 ? टर्नरी की आवश्यकता नहीं है ।
प्रोफ

1

हेक्साडेसिमल कोड के लिए यह प्रयास करें

  1. रंग के लिए ARGB (अल्फा, रेड, ग्रीन, ब्लू) प्रतिनिधित्व प्राप्त करें
  2. अल्फा चैनल को फ़िल्टर करें :& 0x00FFFFFF
  3. मान को प्रारूपित करें (हेक्साडेसिमल "हेक्स के लिए" X6 ")

आरजीबी एक के लिए

  1. बस बाहर से प्रारूप Red , Green, Blueमान

कार्यान्वयन

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);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.