¿Cómo convertir hexadecimal a rgb usando Java?

96

¿Cómo puedo convertir color hexadecimal a código RGB en Java? Principalmente en Google, los ejemplos son sobre cómo convertir de RGB a hexadecimal.

user236501
fuente
¿Puede dar un ejemplo de lo que está tratando de convertir y a lo que está tratando de convertir? No está claro exactamente qué estás tratando de hacer.
kkress
000000 se convertirá a rgb de color negro
user236501

Respuestas:

161

Supongo que esto debería hacerlo:

/**
 * 
 * @param colorStr e.g. "#FFFFFF"
 * @return 
 */
public static Color hex2Rgb(String colorStr) {
    return new Color(
            Integer.valueOf( colorStr.substring( 1, 3 ), 16 ),
            Integer.valueOf( colorStr.substring( 3, 5 ), 16 ),
            Integer.valueOf( colorStr.substring( 5, 7 ), 16 ) );
}
xhh
fuente
Para aquellos que también quieren una versión de 3 caracteres, tenga en cuenta que en el caso de 3 caracteres cada valor debe ser * 255 / 16. Probé esto con "000", "aaa" y "fff", y ahora todos funcionan correctamente. .
Andrew
283

En realidad, hay una forma más fácil (integrada) de hacer esto:

Color.decode("#FFCCEE");
Ben Hoskins
fuente
3
desafortunadamente eso es AWT: /
wuppi
6
@wuppi Pensé que en realidad eran buenas noticias, ya que AWT está en JDK. ¿Qué tiene de desafortunado?
Dmitry Avtonomov
19
La solución aceptada también utiliza AWT. AWT no es un problema para el autor de la pregunta original. Esta debería ser la solución aceptada.
jewbix.cube
6
En Android: Color.parseColor ()
Dawid Drozd
37
public static void main(String[] args) {
    int hex = 0x123456;
    int r = (hex & 0xFF0000) >> 16;
    int g = (hex & 0xFF00) >> 8;
    int b = (hex & 0xFF);
}
Andrew Beck
fuente
26

Para el desarrollo de Android , uso:

int color = Color.parseColor("#123456");
Todd Davies
fuente
Simplemente reemplace el '#' con '0x'
Julian Os
1
Color.parseColor no admite colores con tres dígitos como este: #fff
neoexpert
¿Puedes probar debajo de #fff int red = colorString.charAt (1) == '0'? 0: 255; int blue = colorString.charAt (2) == '0'? 0: 255; int green = colorString.charAt (3) == '0'? 0: 255; Color.rgb (rojo, verde, azul);
GTID
9

Aquí hay una versión que maneja las versiones RGB y RGBA:

/**
 * Converts a hex string to a color. If it can't be converted null is returned.
 * @param hex (i.e. #CCCCCCFF or CCCCCC)
 * @return Color
 */
public static Color HexToColor(String hex) 
{
    hex = hex.replace("#", "");
    switch (hex.length()) {
        case 6:
            return new Color(
            Integer.valueOf(hex.substring(0, 2), 16),
            Integer.valueOf(hex.substring(2, 4), 16),
            Integer.valueOf(hex.substring(4, 6), 16));
        case 8:
            return new Color(
            Integer.valueOf(hex.substring(0, 2), 16),
            Integer.valueOf(hex.substring(2, 4), 16),
            Integer.valueOf(hex.substring(4, 6), 16),
            Integer.valueOf(hex.substring(6, 8), 16));
    }
    return null;
}
Ian Newland
fuente
Esto fue útil para mí ya que Integer.toHexString admite el canal alfa, pero Integer.decode o Color.decode no parecen funcionar con él.
Ted
4

Un código de color hexadecimal es #RRGGBB

RR, GG, BB son valores hexadecimales que van de 0 a 255

Llamemos a RR XY donde X e Y son caracteres hexadecimales 0-9A-F, A = 10, F = 15

El valor decimal es X * 16 + Y

Si RR = B7, el decimal para B es 11, entonces el valor es 11 * 16 + 7 = 183

public int[] getRGB(String rgb){
    int[] ret = new int[3];
    for(int i=0; i<3; i++){
        ret[i] = hexToInt(rgb.charAt(i*2), rgb.charAt(i*2+1));
    }
    return ret;
}

public int hexToInt(char a, char b){
    int x = a < 65 ? a-48 : a-55;
    int y = b < 65 ? b-48 : b-55;
    return x*16+y;
}
MattRS
fuente
4

puede hacerlo simplemente de la siguiente manera:

 public static int[] getRGB(final String rgb)
{
    final int[] ret = new int[3];
    for (int i = 0; i < 3; i++)
    {
        ret[i] = Integer.parseInt(rgb.substring(i * 2, i * 2 + 2), 16);
    }
    return ret;
}

Por ejemplo

getRGB("444444") = 68,68,68   
getRGB("FFFFFF") = 255,255,255
Naveen
fuente
2

Para JavaFX

import javafx.scene.paint.Color;

.

Color whiteColor = Color.valueOf("#ffffff");
Sayka
fuente
1

Conviértalo en un número entero, luego divmodlo dos veces por 16, 256, 4096 o 65536 dependiendo de la longitud de la cadena hexadecimal original (3, 6, 9 o 12 respectivamente).

Ignacio Vázquez-Abrams
fuente
1

Muchas de estas soluciones funcionan, pero esta es una alternativa.

String hex="#00FF00"; // green
long thisCol=Long.decode(hex)+4278190080L;
int useColour=(int)thisCol;

Si no agrega 4278190080 (# FF000000), el color tiene un Alfa de 0 y no se mostrará.

Rico S
fuente
0

Para desarrollar la respuesta que @xhh proporcionó, puede agregar el rojo, el verde y el azul para formatear su cadena como "rgb (0,0,0)" antes de devolverla.

/**
* 
* @param colorStr e.g. "#FFFFFF"
* @return String - formatted "rgb(0,0,0)"
*/
public static String hex2Rgb(String colorStr) {
    Color c = new Color(
        Integer.valueOf(hexString.substring(1, 3), 16), 
        Integer.valueOf(hexString.substring(3, 5), 16), 
        Integer.valueOf(hexString.substring(5, 7), 16));

    StringBuffer sb = new StringBuffer();
    sb.append("rgb(");
    sb.append(c.getRed());
    sb.append(",");
    sb.append(c.getGreen());
    sb.append(",");
    sb.append(c.getBlue());
    sb.append(")");
    return sb.toString();
}
dragunfli
fuente
0

Si no desea utilizar AWT Color.decode, simplemente copie el contenido del método:

int i = Integer.decode("#FFFFFF");
int[] rgb = new int[]{(i >> 16) & 0xFF, (i >> 8) & 0xFF, i & 0xFF};

Integer.decode maneja el # o 0x, dependiendo de cómo se formatee su cadena

dannrob
fuente
0

Aquí hay otra versión más rápida que maneja versiones RGBA:

public static int hexToIntColor(String hex){
    int Alpha = Integer.valueOf(hex.substring(0, 2), 16);
    int Red = Integer.valueOf(hex.substring(2, 4), 16);
    int Green = Integer.valueOf(hex.substring(4, 6), 16);
    int Blue = Integer.valueOf(hex.substring(6, 8), 16);
    Alpha = (Alpha << 24) & 0xFF000000;
    Red = (Red << 16) & 0x00FF0000;
    Green = (Green << 8) & 0x0000FF00;
    Blue = Blue & 0x000000FF;
    return Alpha | Red | Green | Blue;
}
ucMedia
fuente
0

La forma más fácil:

// 0000FF
public static Color hex2Rgb(String colorStr) {
    return new Color(Integer.valueOf(colorStr, 16));
}
Amerousful
fuente
-1

Los códigos de color hexadecimales ya son rgb. El formato es #RRGGBB

Samuel
fuente
4
A menos que sea #RGB, #RRRGGGBBB o #RRRRGGGGBBBB.
Ignacio Vazquez-Abrams
-1

El otro día estuve resolviendo un problema similar y encontré conveniente convertir una cadena de color hexadecimal en una matriz int [alpha, r, g, b]:

 /**
 * Hex color string to int[] array converter
 *
 * @param hexARGB should be color hex string: #AARRGGBB or #RRGGBB
 * @return int[] array: [alpha, r, g, b]
 * @throws IllegalArgumentException
 */

public static int[] hexStringToARGB(String hexARGB) throws IllegalArgumentException {

    if (!hexARGB.startsWith("#") || !(hexARGB.length() == 7 || hexARGB.length() == 9)) {

        throw new IllegalArgumentException("Hex color string is incorrect!");
    }

    int[] intARGB = new int[4];

    if (hexARGB.length() == 9) {
        intARGB[0] = Integer.valueOf(hexARGB.substring(1, 3), 16); // alpha
        intARGB[1] = Integer.valueOf(hexARGB.substring(3, 5), 16); // red
        intARGB[2] = Integer.valueOf(hexARGB.substring(5, 7), 16); // green
        intARGB[3] = Integer.valueOf(hexARGB.substring(7), 16); // blue
    } else hexStringToARGB("#FF" + hexARGB.substring(1));

    return intARGB;
}
Andrey
fuente
-1
For shortened hex code like #fff or #000

int red = "colorString".charAt(1) == '0' ? 0 : 
     "colorString".charAt(1) == 'f' ? 255 : 228;  
int green =
     "colorString".charAt(2) == '0' ? 0 :  "colorString".charAt(2) == 'f' ?
     255 : 228;  
int blue = "colorString".charAt(3) == '0' ? 0 : 
     "colorString".charAt(3) == 'f' ? 255 : 228;

Color.rgb(red, green,blue);
GTID
fuente
¿qué pasa con #eee?
Boni2k