Converter um valor de cor RGB em uma string hexadecimal

87

Em meu aplicativo Java, consegui obter o Colorde a JButtonem termos de vermelho, verde e azul; Armazenei esses valores em três intsegundos.

Como faço para converter esses valores RGB em um Stringcontendo a representação hexadecimal equivalente? Tal como#0033fA

Lalchand
fonte

Respostas:

206

Você pode usar

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

Use X maiúsculo se desejar que os dígitos hexadecimais resultantes sejam capitalizados ( #FFFFFFvs. #ffffff).

mhshams
fonte
3
Com o tipo de entrada 'Cor': String.format ("#% 06x", Integer.valueOf (color.getRGB () & 0x00FFFFFF));
Stéphane Millien
Isso resulta emclass java.util.IllegalFormatConversionException with message: x != java.lang.Float
Mig82 de
@ smillien62: Eu acredito que isso pode ser simplificado paraString.format("#%06x", color.getRGB() & 0xFFFFFF);
MestreLion
@MestreLion, com sua sintaxe você tem um aviso porque você usa um "int" em vez de um "inteiro".
Stéphane Millien
46

Um forro, mas sem String.formatpara todas as cores RGB :

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

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

Você pode adicionar um .toUpperCase()se quiser alternar para letras maiúsculas. Observe que isso é válido (conforme perguntado na pergunta) para todas as cores RGB.

Quando você tem cores ARGB, pode usar:

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

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

Um liner também é teoricamente possível, mas exigiria chamar toHexString duas vezes. Eu comparei a solução ARGB e comparei com String.format():

insira a descrição da imagem aqui

Lonzak
fonte
11
Esteja ciente de que este método é quebrado se sua cor tiver um valor alfa <16 (ou seja, sua representação hexadecimal ARGB começa com 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
fonte
3
Esta resposta falha no caso de os valores de vermelho ou verde serem zero (um exemplo sendo Color.BLUE, que #0ffresulta porque & 'ing o valor RGB de Color.BLUE resulta em 256na base 10, que está ffem hexadecimal). Uma correção é usar um whileloop em vez de uma instrução if ao prefixar zeros.
FThompson
1

Esta é uma versão adaptada da resposta dada por Vivien Barousse com a atualização do Vulcan aplicada. Neste exemplo, uso controles deslizantes para recuperar dinamicamente os valores RGB de três controles deslizantes e exibir essa cor em um retângulo. Então, no método toHex (), eu uso os valores para criar uma cor e exibir o respectivo código de cor Hex.

Este exemplo não inclui as restrições adequadas para o GridBagLayout. Embora o código funcione, a tela ficará estranha.

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

Um grande obrigado a Vivien e Vulcan. Esta solução funciona perfeitamente e é super simples de implementar.

AlyssaFox
fonte