Convertir un valor de color RGB en una cadena hexadecimal

87

En mi aplicación Java, pude obtener el Colorde a JButtonen términos de rojo, verde y azul; He almacenado estos valores en tres ints.

¿Cómo convierto esos valores RGB en una que Stringcontenga la representación hexadecimal equivalente? Como#0033fA

Lalchand
fuente

Respuestas:

206

Puedes usar

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

Utilice X mayúsculas si desea que los dígitos hexadecimales resultantes estén en mayúscula ( #FFFFFFvs. #ffffff).

mhshams
fuente
3
Con el tipo de entrada 'Color': String.format ("#% 06x", Integer.valueOf (color.getRGB () & 0x00FFFFFF));
Stéphane Millien
Esto resulta enclass java.util.IllegalFormatConversionException with message: x != java.lang.Float
Mig82
@ smillien62: Creo que esto se puede simplificar aString.format("#%06x", color.getRGB() & 0xFFFFFF);
MestreLion
@MestreLion, Con tu sintaxis tienes una advertencia porque usas un "int" en lugar de un "Integer".
Stéphane Millien
46

Un trazador de líneas pero sin String.formatpara todos los colores RGB :

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

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

Puede agregar una .toUpperCase()si desea cambiar a mayúsculas. Tenga en cuenta que esto es válido (como se pregunta en la pregunta) para todos los colores RGB.

Cuando tienes colores ARGB puedes usar:

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

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

En teoría, también es posible una línea, pero sería necesario llamar a toHexString dos veces. Evalué la solución ARGB y la comparé con String.format():

ingrese la descripción de la imagen aquí

Lonzak
fuente
11
Tenga en cuenta que este método no funciona si su color tiene un valor alfa <16 (es decir, su representación hexadecimal ARGB comienza con 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
fuente
3
Esta respuesta falla en el caso de que los valores rojo o verde sean cero (un ejemplo es Color.BLUE, que #0ffresulta porque & 'ing el valor RGB de Color.BLUE resulta 256en base 10, que está ffen hexadecimal). Una solución es utilizar un whilebucle en lugar de una instrucción if al anteponer ceros.
FThompson
1

Esta es una versión adaptada de la respuesta dada por Vivien Barousse con la actualización de Vulcan aplicada. En este ejemplo, utilizo controles deslizantes para recuperar dinámicamente los valores RGB de tres controles deslizantes y mostrar ese color en un rectángulo. Luego, en el método toHex () utilizo los valores para crear un color y mostrar el código de color hexadecimal respectivo.

Este ejemplo no incluye las restricciones adecuadas para GridBagLayout. Aunque el código funcionará, la pantalla se verá extraña.

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 gran agradecimiento a Vivien y Vulcan. Esta solución funciona perfectamente y fue muy sencilla de implementar.

AlyssaFox
fuente