Как преобразовать шестнадцатеричный формат в RGB с помощью Java?

96

Как преобразовать шестнадцатеричный цвет в код RGB в Java? В основном в Google примеры того, как преобразовать из RGB в шестнадцатеричный.

user236501
источник
Можете ли вы привести пример того, из чего вы пытаетесь преобразовать и во что вы пытаетесь преобразовать? Непонятно, что именно вы пытаетесь сделать.
kkress
000000 будет преобразован в черный цвет rgb
user236501 09

Ответы:

161

Я думаю, это должно сработать:

/**
 * 
 * @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 ) );
}
ххх
источник
Для тех, кто хочет 3-символьную версию, обратите внимание, что в 3-символьном регистре каждое значение должно быть * 255/16. Я тестировал это с помощью «000», «aaa» и «fff», и теперь все они работают правильно. .
Эндрю
283

На самом деле, есть более простой (встроенный) способ сделать это:

Color.decode("#FFCCEE");
Бен Хоскинс
источник
3
к сожалению, это AWT: /
wuppi 04
6
@wuppi Я подумал, что это действительно хорошие новости, так как AWT находится в JDK. Что в этом плохого?
Дмитрий Автономов
19
В принятом решении также используется AWT. AWT не проблема для того, кто задает первоначальный вопрос. Это должно быть приемлемое решение.
jewbix.cube 06
6
На android: Color.parseColor ()
Давид Дрозд
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

Для разработки под Android я использую:

int color = Color.parseColor("#123456");
Тодд Дэвис
источник
Просто замените '#' на '0x'
Джулиан Ос
1
Color.parseColor не поддерживает цвета с тремя цифрами вроде этой: #fff
neoexpert
Вы можете попробовать ниже #fff int red = colorString.charAt (1) == '0'? 0: 255; int blue = colorString.charAt (2) == '0'? 0: 255; int зеленый = colorString.charAt (3) == '0'? 0: 255; Color.rgb (красный, зеленый, синий);
GTID
9

Вот версия, которая поддерживает версии RGB и 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;
}
Ян Ньюленд
источник
Это было полезно для меня, поскольку Integer.toHexString поддерживает альфа-канал, но Integer.decode или Color.decode, похоже, с ним не работают.
Тед
4

Шестнадцатеричный код цвета: #RRGGBB.

RR, GG, BB - шестнадцатеричные значения от 0 до 255.

Назовем RR XY, где X и Y - шестнадцатеричные символы 0-9A-F, A = 10, F = 15

Десятичное значение: X * 16 + Y.

Если RR = B7, десятичное число для B равно 11, поэтому значение равно 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
источник
4

вы можете сделать это просто, как показано ниже:

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

Например

getRGB("444444") = 68,68,68   
getRGB("FFFFFF") = 255,255,255
Naveen
источник
2

Для JavaFX

import javafx.scene.paint.Color;

.

Color whiteColor = Color.valueOf("#ffffff");
Сайка
источник
1

Преобразуйте его в целое число, затем дважды измените его на 16, 256, 4096 или 65536 в зависимости от длины исходной шестнадцатеричной строки (3, 6, 9 или 12 соответственно).

Игнасио Васкес-Абрамс
источник
1

Многие из этих решений работают, но это альтернатива.

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

Если вы не добавите 4278190080 (# FF000000), альфа цвета будет равна 0, и он не будет отображаться.

Rich S
источник
0

Чтобы уточнить ответ, предоставленный @xhh, вы можете добавить красный, зеленый и синий, чтобы отформатировать вашу строку как «rgb (0,0,0)» перед ее возвратом.

/**
* 
* @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
источник
0

Если вы не хотите использовать AWT Color.decode, просто скопируйте содержимое метода:

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

Integer.decode обрабатывает # или 0x, в зависимости от того, как отформатирована ваша строка

даннроб
источник
0

Вот еще одна более быстрая версия, которая обрабатывает версии 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
источник
0

Самый простой способ:

// 0000FF
public static Color hex2Rgb(String colorStr) {
    return new Color(Integer.valueOf(colorStr, 16));
}
Ужасный
источник
-1

Шестнадцатеричные коды цветов уже являются rgb. Формат: #RRGGBB.

Самуэль
источник
4
Если только это не #RGB, #RRRGGGBBB или #RRRRGGGGBBBB.
Игнасио Васкес-Абрамс
-1

На днях я решил аналогичную проблему и нашел удобным преобразовать шестнадцатеричную цветовую строку в 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;
}
Андрей
источник
-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
источник
как насчет #eee?
Boni2k 05