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.


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

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");

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

26

Für die Android- Entwicklung verwende ich:

int color = Color.parseColor("#123456");

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

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

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

2

Für JavaFX

import javafx.scene.paint.Color;

.

Color whiteColor = Color.valueOf("#ffffff");

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).


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.


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

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


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

0

Der einfachste Weg:

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


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

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

was ist mit #eee?
Boni2k
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.