Bagaimana cara mengubah hex ke rgb menggunakan Java?

96

Bagaimana cara mengubah warna hex menjadi kode RGB di Java? Sebagian besar di Google, contoh adalah tentang cara mengonversi dari RGB ke hex.

pengguna236501
sumber
Dapatkah Anda memberikan contoh tentang apa yang Anda coba konversi dan Anda coba konversi? Tidak jelas persis apa yang Anda coba lakukan.
kkress
000000 akan diubah menjadi warna hitam rgb
user236501

Jawaban:

161

Saya rasa ini harus dilakukan:

/**
 * 
 * @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
sumber
Bagi mereka yang menginginkan versi 3 karakter juga, perhatikan bahwa dalam kasus 3 karakter setiap nilai harus * 255/16. Saya menguji ini dengan "000", "aaa", dan "fff", dan semuanya berfungsi dengan baik sekarang .
Andrew
283

Sebenarnya, ada cara (bawaan) yang lebih mudah untuk melakukan ini:

Color.decode("#FFCCEE");
Ben Hoskins
sumber
3
sayangnya itu adalah AWT: /
wuppi
6
@wuppi Saya pikir itu sebenarnya kabar baik, karena AWT ada di JDK. Apa yang sangat disayangkan tentang itu?
Dmitry Avtonomov
19
Solusi yang diterima juga menggunakan AWT. AWT bukanlah masalah bagi penanya asli. Ini harus menjadi solusi yang diterima.
jewbix.cube
6
Di 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
sumber
26

Untuk pengembangan Android , saya menggunakan:

int color = Color.parseColor("#123456");
Todd Davies
sumber
Cukup ganti '#' dengan '0x'
Julian Os
1
Color.parseColor tidak mendukung Warna dengan tiga digit seperti ini:
#fff
U dapat mencoba di bawah ini dari #fff int red = colorString.charAt (1) == '0'? 0: 255; int blue = colorString.charAt (2) == '0'? 0: 255; int hijau = colorString.charAt (3) == '0'? 0: 255; Color.rgb (merah, hijau, biru);
GTID
9

Ini adalah versi yang menangani versi RGB dan 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
sumber
Ini berguna bagi saya karena Integer.toHexString mendukung saluran alfa, tetapi Integer.decode atau Color.decode tampaknya tidak berfungsi dengannya.
Ted
4

Kode warna hex adalah #RRGGBB

RR, GG, BB adalah nilai hex mulai dari 0-255

Sebut saja RR XY dimana X dan Y adalah karakter hex 0-9A-F, A = 10, F = 15

Nilai desimalnya adalah X * 16 + Y

Jika RR = B7, desimal untuk B adalah 11, jadi nilainya adalah 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
sumber
4

Anda dapat melakukannya seperti di bawah ini:

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

Sebagai contoh

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

Untuk JavaFX

import javafx.scene.paint.Color;

.

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

Ubah menjadi bilangan bulat, lalu lakukan divmod dua kali dengan 16, 256, 4096, atau 65536 bergantung pada panjang string hex asli (masing-masing 3, 6, 9, atau 12).

Ignacio Vazquez-Abrams
sumber
1

Banyak solusi ini berfungsi, tetapi ini adalah alternatif.

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

Jika Anda tidak menambahkan 4278190080 (# FF000000) warna memiliki Alpha 0 dan tidak akan ditampilkan.

Rich S
sumber
0

Untuk menguraikan jawaban yang diberikan @xhh, Anda dapat menambahkan warna merah, hijau, dan biru untuk memformat string Anda sebagai "rgb (0,0,0)" sebelum mengembalikannya.

/**
* 
* @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.dll
sumber
0

Jika Anda tidak ingin menggunakan AWT Color.decode, cukup salin konten metode:

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

Integer.decode menangani # atau 0x, bergantung pada bagaimana string Anda diformat

dannrob
sumber
0

Ini adalah versi lain yang lebih cepat yang menangani versi 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
sumber
0

Cara termudah:

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

Kode warna heksadesimal sudah menjadi rgb. Formatnya adalah #RRGGBB

Samuel
sumber
4
Kecuali #RGB, #RRRGGGBBB, atau #RRRRGGGGBBBB.
Ignacio Vazquez-Abrams
-1

Beberapa hari yang lalu saya telah memecahkan masalah serupa dan merasa nyaman untuk mengubah string warna hex menjadi int array [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
sumber
-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
sumber
bagaimana dengan #eee?
Boni2k