एक RGB रंग मान को हेक्साडेसिमल स्ट्रिंग में परिवर्तित करें


87

मेरी जावा आवेदन में, मैं प्राप्त करने में सक्षम था Colorएक के JButtonलाल, हरे और नीले रंग के मामले में; मैंने इन मूल्यों को तीन intएस में संग्रहीत किया है ।

मैं उन RGB मानों को Stringसमरूप हेक्साडेसिमल प्रतिनिधित्व में कैसे परिवर्तित करूं ? जैसे कि#0033fA

जवाबों:


206

आप उपयोग कर सकते हैं

String hex = String.format("#%02x%02x%02x", r, g, b);  

पूँजी X का प्रयोग करें यदि आप चाहते हैं कि आपके परिणामी हेक्स-अंक को बड़ा किया जाए ( #FFFFFFबनाम #ffffff)।


3
इनपुट प्रकार 'कलर' के साथ: String.format ("#% 06x", Integer.valueOf (color.getRGB () & 0x00FFFFFF));
स्टीफन मिलियन

इसका परिणाम हैclass java.util.IllegalFormatConversionException with message: x != java.lang.Float
मिग 82

@ smillien62: मेरा मानना ​​है कि इसे सरल बनाया जा सकता हैString.format("#%06x", color.getRGB() & 0xFFFFFF);
MestreLion

@MestreLion, आपके सिंटैक्स के साथ आपको एक चेतावनी है क्योंकि आप "इंटेगर" के बजाय "int" का उपयोग करते हैं।
स्टीफन मिलियन

46

एक लाइनर लेकिन String.formatसभी RGB रंगों के बिना :

Color your_color = new Color(128,128,128);

String hex = "#"+Integer.toHexString(your_color.getRGB()).substring(2);

.toUpperCase()यदि आप बड़े अक्षरों में बदलना चाहते हैं तो आप जोड़ सकते हैं । ध्यान दें, यह सभी RGB रंगों के लिए मान्य है (जैसा कि प्रश्न में पूछा गया है)।

जब आपके पास ARGB रंग हों तो आप इसका उपयोग कर सकते हैं:

Color your_color = new Color(128,128,128,128);

String buf = Integer.toHexString(your_color.getRGB());
String hex = "#"+buf.substring(buf.length()-6);

एक लाइनर सैद्धांतिक रूप से भी संभव है, लेकिन दो बार toexexring को कॉल करने की आवश्यकता होगी। मैंने ARGB समाधान को बेंचमार्क किया और इसके साथ तुलना की String.format():

यहाँ छवि विवरण दर्ज करें


11
ध्यान रखें कि यदि आपके रंग का अल्फा मान <16 है (यानी इसका हेक्साडेसिमल ARGB प्रतिनिधित्व 0 से शुरू होता है) तो यह विधि टूट गई है।
ARRG

15
Random ra = new Random();
int r, g, b;
r=ra.nextInt(255);
g=ra.nextInt(255);
b=ra.nextInt(255);
Color color = new Color(r,g,b);
String hex = Integer.toHexString(color.getRGB() & 0xffffff);
if (hex.length() < 6) {
    hex = "0" + hex;
}
hex = "#" + hex;

3
यह उत्तर इस मामले में विफल रहता है कि लाल या हरे रंग के मान शून्य हैं (एक उदाहरण है Color.BLUE, जो आउटपुट करता है #0ffक्योंकि 'Color.BLUE के RGB मान को 256आधार 10 में रखता है , जो कि ffहेक्स में है)। whileशून्य को पूर्ववर्ती करते समय एक स्टेटमेंट के बजाय एक लूप का उपयोग करना है ।
FThompson

1

यह द्वारा दिए गए जवाब का एक अनुकूलित संस्करण है विविएन Barousse से अद्यतन के साथ वालकैन लागू होता है। इस उदाहरण में मैं तीन स्लाइडर्स से RGB मानों को गतिशील रूप से पुन: उपयोग करने के लिए स्लाइडर्स का उपयोग करता हूं और उस रंग को एक आयत में प्रदर्शित करता हूं। तब विधि toHex () में मैं रंग बनाने और संबंधित हेक्स रंग कोड प्रदर्शित करने के लिए मूल्यों का उपयोग करता हूं।

यह उदाहरण GridBagLayout के लिए उचित बाधाओं को शामिल नहीं करता है। हालांकि कोड काम करेगा, डिस्प्ले अजीब लगेगा।

public class HexColor
{

  public static void main (String[] args)
  {
   JSlider sRed = new JSlider(0,255,1);
   JSlider sGreen = new JSlider(0,255,1);
   JSlider sBlue = new JSlider(0,255,1);
   JLabel hexCode = new JLabel();
   JPanel myPanel = new JPanel();
   GridBagLayout layout = new GridBagLayout();
   JFrame frame = new JFrame();

   //set frame to organize components using GridBagLayout 
   frame.setLayout(layout);

   //create gray filled rectangle 
   myPanel.paintComponent();
   myPanel.setBackground(Color.GRAY);

   //In practice this code is replicated and applied to sGreen and sBlue. 
   //For the sake of brevity I only show sRed in this post.
   sRed.addChangeListener(
         new ChangeListener()
         {
             @Override
             public void stateChanged(ChangeEvent e){
                 myPanel.setBackground(changeColor());
                 myPanel.repaint();
                 hexCode.setText(toHex());
         }
         }
     );
   //add each component to JFrame
   frame.add(myPanel);
   frame.add(sRed);
   frame.add(sGreen);
   frame.add(sBlue);
   frame.add(hexCode);
} //end of main

  //creates JPanel filled rectangle
  protected void paintComponent(Graphics g)
  {
      super.paintComponent(g);
      g.drawRect(360, 300, 10, 10);
      g.fillRect(360, 300, 10, 10);
  }

  //changes the display color in JPanel
  private Color changeColor()
  {
    int r = sRed.getValue();
    int b = sBlue.getValue();
    int g = sGreen.getValue();
    Color c;
    return  c = new Color(r,g,b);
  }

  //Displays hex representation of displayed color
  private String toHex()
  {
      Integer r = sRed.getValue();
      Integer g = sGreen.getValue();
      Integer b = sBlue.getValue();
      Color hC;
      hC = new Color(r,g,b);
      String hex = Integer.toHexString(hC.getRGB() & 0xffffff);
      while(hex.length() < 6){
          hex = "0" + hex;
      }
      hex = "Hex Code: #" + hex;
      return hex;
  }
}

विवियन और वल्कन दोनों को बहुत-बहुत धन्यवाद। यह समाधान पूरी तरह से काम करता है और लागू करने के लिए सुपर सरल था।

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