2010-08-31 14 views
57

Dans mon application Java, j'ai pu obtenir la valeur JButton couleur en termes de valeurs Rouge, Vert et Bleu; J'ai stocké ces valeurs dans trois entiers. Comment convertir les valeurs RVB en valeurs hexadécimales équivalentes?Conversion d'une valeur de couleur RVB en hexadécimal

Exemple de que, comme dans ce format #0033fA

+4

Il n'existe pas de valeur hexadécimale. Il y a une représentation hexadécimale *. * – EJP

Répondre

142

Vous pouvez utiliser

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

utiliser le capital X est si vous voulez que vos chiffres hexadécimaux résultant à l'actif (#FFFFFF contre #ffffff).

+1

et c'est le chemin du retour: http://stackoverflow.com/a/4129692/1761622 – Mikescher

+0

Merci @mhshams –

12
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; 
+0

Cette réponse échoue dans le cas où les valeurs rouges ou vertes sont nulles (un exemple étant 'Color.BLUE', qui produit' # 0ff' parce que la valeur RGB des résultats de Color.BLUE est affichée en '256' dans la base 10, qui est' ff' en hexadécimal). Une solution consiste à utiliser une boucle 'while' plutôt qu'une instruction if lors de la pré-affectation de zéros. – Vulcan

35

une doublure, mais sans String.format:

Color your_color = Color.BLACK; 

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

Vous pouvez ajouter un .toUpperCase() si vous voulez passer en majuscules.

+6

Sachez que cette méthode est cassée si votre couleur a une valeur alpha <16 (ie sa représentation hexadécimale ARGB commence par 0). – ARRG

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 correspondant.

Cet exemple n'inclut pas les contraintes appropriées pour GridBagLayout. Bien que le code fonctionne, l'affichage semblera é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 grand merci à la fois Vivien et Vulcain. Cette solution fonctionne parfaitement et était super simple à mettre en œuvre.