2010-08-31 14 views
57

W mojej aplikacji Java udało mi się uzyskać wartość koloru JButton pod względem wartości Czerwonej, Zielonej i Niebieskiej; Zapisałem te wartości w trzech liczbach całkowitych.Konwertuj wartość koloru RGB na szesnastkową

Jak przekonwertować wartości RGB na równoważną wartość szesnastkową?

Przykład, że podobnie jak w tym formacie #0033fA

+4

Nie ma czegoś takiego jak wartość szesnastkowa. Istnieje reprezentacja szesnastkowa *. * – EJP

Odpowiedz

142

Można użyć

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

wykorzystania kapitału X, jeśli chcesz, aby wynikające HEX-cyfry być kapitalizowane (#FFFFFF Vs. #ffffff).

+1

i to jest droga powrotna: http://stackoverflow.com/a/4129692/1761622 – Mikescher

+0

Dzięki @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

Ta odpowiedź kończy się niepowodzeniem w przypadku, gdy czerwone lub zielone wartości wynoszą zero (jednym z przykładów jest 'Color.BLUE', który wyświetla' # 0ff', ponieważ & ing. Wartość RGB wyników Color.BLUE w '256' w podstawie 10, która jest' ff' w hex). Poprawka polega na używaniu pętli 'while' zamiast instrukcji if przy wstępnym zerowaniu. – Vulcan

35

Jeden liner ale bez string.Format:

Color your_color = Color.BLACK; 

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

Możesz dodać .toUpperCase() jeśli chcesz, aby przełączyć się literami.

+6

Pamiętaj, że ta metoda jest zepsuta, jeśli twój kolor ma wartość alfa <16 (tzn. Jej szesnastkowa reprezentacja ARGB zaczyna się od 0). – ARRG

1

Jest to dostosowana wersja odpowiedzi podana przez Vivien Barousse z aktualizacją z Vulcan zastosowaną. W tym przykładzie używam suwaków, aby dynamicznie odtwarzać wartości RGB z trzech suwaków i wyświetlać ten kolor w prostokącie. Następnie w metodzie toHex() używam tych wartości, aby utworzyć kolor i wyświetlić odpowiedni kod koloru heksadecymalnego.

Ten przykład nie zawiera odpowiednich ograniczeń dla GridBagLayout. Choć kod zadziała, wyświetlacz będzie wyglądał dziwnie.

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

Ogromne podziękowania zarówno Vivien i Vulcan. To rozwiązanie działa doskonale i było super proste do wdrożenia.

Powiązane problemy