如何使用Java将hex转换为rgb?


96

如何在Java中将十六进制颜色转换为RGB代码?在Google中,大多数示例都是关于如何从RGB转换为十六进制的示例。


您能否举例说明您要转换的内容以及您要转换的内容?目前尚不清楚您要做什么。
kkress 2010年

000000将转换为黑色rgb
user236501

Answers:


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

6
@wuppi我认为这实际上是个好消息,因为AWT在JDK中。有什么不幸的呢?
德米特里·阿夫托诺莫夫

19
公认的解决方案也使用AWT。对于原始问题提问者,AWT不是问题。这应该是公认的解决方案。
jewbix.cube 2014年

6
在android上:Color.parseColor()
Dawid

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

您可以尝试以下#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(红色,绿色,蓝色);
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支持Alpha通道,但是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;
}

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

2

对于JavaFX

import javafx.scene.paint.Color;

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


1

这些解决方案有很多可用,但这是替代方案。

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

如果不添加4278190080(#FF000000),则该颜色的Alpha值为0,并且不会显示。


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

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

0

最简单的方法:

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


-1

前几天,我一直在解决类似的问题,发现将十六进制颜色字符串转换为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;
}

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

#eee呢?
Boni2k
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.