Konvertieren Sie einen RGB-Farbwert in eine hexadezimale Zeichenfolge

86

In meiner Java-Anwendung konnte ich das Colorvon a JButtonin Bezug auf Rot, Grün und Blau erhalten; Ich habe diese Werte in drei ints gespeichert .

Wie konvertiere ich diese RGB-Werte in eine, Stringdie die entsprechende hexadezimale Darstellung enthält? Sowie#0033fA

Lalchand
quelle

Antworten:

204

Sie können verwenden

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

Verwenden Sie Großbuchstaben X, wenn Sie möchten, dass Ihre resultierenden Hex-Ziffern großgeschrieben werden ( #FFFFFFvs. #ffffff).

mhshams
quelle
1
Mit dem Eingabetyp 'Farbe': String.format ("#% 06x", Integer.valueOf (color.getRGB () & 0x00FFFFFF));
smillien62
Dies führt zuclass java.util.IllegalFormatConversionException with message: x != java.lang.Float
Mig82
@ smillien62: Ich glaube, das kann vereinfacht werdenString.format("#%06x", color.getRGB() & 0xFFFFFF);
MestreLion
@MestreLion, Mit Ihrer Syntax haben Sie eine Warnung, weil Sie ein "int" anstelle einer "Integer" verwenden.
smillien62
45

Ein Einzeiler ohne String.format:

Color your_color = Color.BLACK;

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

Sie können ein hinzufügen, .toUpperCase()wenn Sie zu Großbuchstaben wechseln möchten.

Beachten Sie, dass ARRG richtig ist - nur für nicht transparente Farben.

if(your_color.getAlpha() >= 16){
   String hex = "#"+Integer.toHexString(your_color.getRGB()).substring(2);
}
else{...}
Lonzak
quelle
10
Beachten Sie, dass diese Methode fehlerhaft ist, wenn Ihre Farbe einen Alpha-Wert <16 hat (dh ihre hexadezimale ARGB-Darstellung beginnt mit 0).
ARRG
14
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;
Vivien Barousse
quelle
3
Diese Antwort schlägt fehl, wenn die roten oder grünen Werte Null sind (ein Beispiel ist Color.BLUEdie #0ffAusgabe , da der RGB-Wert von Color.BLUE zu der 256Basis 10 führt, die hexadezimal ist ff). Ein Fix besteht darin, eine whileSchleife anstelle einer if-Anweisung zu verwenden, wenn Nullen vorangestellt werden.
FThompson
1

Dies ist eine angepasste Version der Antwort von Vivien Barousse mit dem Update von Vulcan . In diesem Beispiel verwende ich Schieberegler, um die RGB-Werte von drei Schiebereglern dynamisch abzurufen und diese Farbe in einem Rechteck anzuzeigen. Dann verwende ich in der Methode toHex () die Werte, um eine Farbe zu erstellen und den entsprechenden Hex-Farbcode anzuzeigen.

Dieses Beispiel enthält nicht die richtigen Einschränkungen für das GridBagLayout. Obwohl der Code funktioniert, sieht die Anzeige seltsam aus.

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

Ein großes Dankeschön an Vivien und Vulcan. Diese Lösung funktioniert perfekt und war super einfach zu implementieren.

AlyssaFox
quelle