Wie konvertiere ich Hex in RGB mit Java?

95

Wie kann ich Hex-Farbe in Java in RGB-Code konvertieren? In Google werden hauptsächlich Beispiele für die Konvertierung von RGB in Hex verwendet.

user236501
quelle
Können Sie ein Beispiel dafür geben, von was Sie konvertieren möchten und zu was Sie konvertieren möchten? Es ist nicht klar, was Sie genau versuchen.
kkress
000000 wird in schwarze Farbe rgb konvertieren
user236501

Antworten:

161

Ich denke, das sollte es tun:

/**
 * 
 * @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
quelle
Wenn Sie auch eine 3-Zeichen-Version wünschen, beachten Sie, dass im 3-Zeichen-Fall jeder Wert * 255/16 sein muss. Ich habe dies mit "000", "aaa" und "fff" getestet und alle funktionieren jetzt ordnungsgemäß .
Andrew
278

Tatsächlich gibt es eine einfachere (eingebaute) Möglichkeit, dies zu tun:

Color.decode("#FFCCEE");
Ben Hoskins
quelle
3
leider ist das AWT: /
wuppi
6
@wuppi Ich dachte, das wären wirklich gute Nachrichten, da AWT in JDK ist. Was ist daran so unglücklich?
Dmitry Avtonomov
19
Die akzeptierte Lösung verwendet auch AWT. AWT ist für den ursprünglichen Fragesteller kein Problem. Dies sollte die akzeptierte Lösung sein.
jewbix.cube
6
Auf 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
quelle
26

Für die Android- Entwicklung verwende ich:

int color = Color.parseColor("#123456");
Todd Davies
quelle
Ersetzen Sie einfach das '#' durch '0x'
Julian Os
1
Color.parseColor unterstützt keine Farben mit drei Ziffern wie dieser: #fff
neoexpert
Sie können unten versuchen, #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 (rot, grün, blau);
GTID
9

Hier ist eine Version, die sowohl RGB- als auch RGBA-Versionen verarbeitet:

/**
 * 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
quelle
Dies war für mich nützlich, da Integer.toHexString den Alpha-Kanal unterstützt, aber Integer.decode oder Color.decode nicht damit zu funktionieren scheinen.
Ted
4

Ein hexadezimaler Farbcode ist #RRGGBB

RR, GG, BB sind Hex-Werte im Bereich von 0 bis 255

Nennen wir RR XY, wobei X und Y Hexadezimalzeichen 0-9A-F, A = 10, F = 15 sind

Der Dezimalwert ist X * 16 + Y.

Wenn RR = B7, ist die Dezimalstelle für B 11, der Wert ist also 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
quelle
4

Sie können es einfach wie folgt tun:

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

Beispielsweise

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

Für JavaFX

import javafx.scene.paint.Color;

.

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

Konvertieren Sie es in eine Ganzzahl und teilen Sie es dann zweimal durch 16, 256, 4096 oder 65536, abhängig von der Länge der ursprünglichen Hex-Zeichenfolge (3, 6, 9 bzw. 12).

Ignacio Vazquez-Abrams
quelle
1

Viele dieser Lösungen funktionieren, aber dies ist eine Alternative.

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

Wenn Sie 4278190080 (# FF000000) nicht hinzufügen, hat die Farbe ein Alpha von 0 und wird nicht angezeigt.

Rich S.
quelle
0

Um die Antwort @xhh näher zu erläutern, können Sie Rot, Grün und Blau anhängen, um Ihre Zeichenfolge als "rgb (0,0,0)" zu formatieren, bevor Sie sie zurückgeben.

/**
* 
* @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
quelle
0

Wenn Sie den AWT Color.decode nicht verwenden möchten, kopieren Sie einfach den Inhalt der Methode:

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

Integer.decode behandelt das # oder 0x, je nachdem, wie Ihre Zeichenfolge formatiert ist

dannrob
quelle
0

Hier ist eine weitere schnellere Version, die RGBA-Versionen verarbeitet:

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
quelle
0

Der einfachste Weg:

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

Hexidezimale Farbcodes sind bereits rgb. Das Format ist #RRGGBB

Samuel
quelle
4
Es sei denn, es ist #RGB, #RRRGGGBBB oder #RRRRGGGGBBBB.
Ignacio Vazquez-Abrams
-1

Neulich hatte ich das ähnliche Problem gelöst und fand es praktisch, Hex-Farbzeichenfolgen in int-Arrays [alpha, r, g, b] umzuwandeln:

 /**
 * 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
quelle
-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
quelle
was ist mit #eee?
Boni2k