Convertir une valeur de couleur RVB en une chaîne hexadécimale

87

Dans mon application Java, j'ai pu obtenir le Colord'un JButtonen termes de rouge, vert et bleu; J'ai stocké ces valeurs dans trois ints.

Comment convertir ces valeurs RVB en un Stringcontenant la représentation hexadécimale équivalente? Tel que#0033fA

Lalchand
la source

Réponses:

206

Vous pouvez utiliser

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

Utilisez des X majuscules si vous voulez que vos chiffres hexadécimaux résultants soient en majuscules ( #FFFFFFvs. #ffffff).

mhshams
la source
3
Avec le type d'entrée 'Color': String.format ("#% 06x", Integer.valueOf (color.getRGB () & 0x00FFFFFF));
Stéphane Millien le
Cela donneclass java.util.IllegalFormatConversionException with message: x != java.lang.Float
Mig82
@ smillien62: Je crois que cela peut être simplifié àString.format("#%06x", color.getRGB() & 0xFFFFFF);
MestreLion
@MestreLion, Avec votre syntaxe vous avez un avertissement car vous utilisez un "int" au lieu d'un "Integer".
Stéphane Millien
46

Un seul liner mais sans String.formatpour toutes les couleurs RVB :

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

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

Vous pouvez ajouter un .toUpperCase()si vous souhaitez passer aux lettres majuscules. Notez que cela est valable (comme demandé dans la question) pour toutes les couleurs RVB.

Lorsque vous avez des couleurs ARVB , vous pouvez utiliser:

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

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

Un one liner est théoriquement également possible mais nécessiterait d'appeler toHexString deux fois. J'ai comparé la solution ARGB avec String.format():

entrez la description de l'image ici

Lonzak
la source
11
Sachez que cette méthode est interrompue si votre couleur a une valeur alpha <16 (c'est-à-dire que sa représentation ARVB hexadécimale commence par 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;
Vivien Barousse
la source
3
Cette réponse échoue dans le cas où les valeurs rouges ou vertes sont nulles (un exemple étant Color.BLUE, qui sort #0ffparce que & 'ing la valeur RVB de Color.BLUE aboutit 256à la base 10, qui est ffen hexadécimal). Un correctif consiste à utiliser une whileboucle plutôt qu'une instruction if lors de la préproduction de zéros.
FThompson
1

Ceci est une version adaptée de la réponse donnée par Vivien Barousse avec la mise à jour de Vulcan appliquée. Dans cet exemple, j'utilise des curseurs pour récupérer dynamiquement les valeurs RVB de trois curseurs et afficher cette couleur dans un rectangle. Ensuite, dans la méthode toHex (), j'utilise les valeurs pour créer une couleur et afficher le code de couleur Hex respectif.

Cet exemple n'inclut pas les contraintes appropriées pour le GridBagLayout. Bien que le code fonctionne, l'affichage paraîtra étrange.

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

Un immense merci à Vivien et Vulcan. Cette solution fonctionne parfaitement et était super simple à mettre en œuvre.

AlyssaFox
la source