Làm thế nào để chuyển đổi hex sang rgb bằng Java?


96

Làm cách nào để chuyển đổi màu hex sang mã RGB trong Java? Hầu hết trong Google, các mẫu về cách chuyển đổi từ RGB sang hex.


Bạn có thể cho một ví dụ về những gì bạn đang cố gắng chuyển đổi từ và những gì bạn đang cố gắng chuyển đổi sang không? Nó không rõ ràng chính xác những gì bạn đang cố gắng làm.
kkress

000000 sẽ chuyển đổi sang rgb màu đen
user236501

Câu trả lời:


161

Tôi đoán điều này nên làm điều đó:

/**
 * 
 * @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 ) );
}

Đối với những người muốn cả phiên bản 3 ký tự, hãy lưu ý rằng trong trường hợp 3 ký tự, mỗi giá trị phải là * 255 / 16. Tôi đã kiểm tra điều này với "000", "aaa" và "fff" và tất cả chúng đều hoạt động bình thường. .
Andrew

283

Trên thực tế, có một cách dễ dàng hơn (tích hợp sẵn) để làm điều này:

Color.decode("#FFCCEE");

3
rất tiếc đó là AWT: /
wuppi

6
@wuppi Tôi nghĩ đó thực sự là một tin tốt, vì AWT đang ở trong JDK. Có gì đáng tiếc về nó?
Dmitry Avtonomov

19
Giải pháp được chấp nhận cũng sử dụng AWT. AWT không phải là vấn đề đối với người đặt câu hỏi ban đầu. Đây phải là giải pháp được chấp nhận.
jewbix.cube

6
Trên 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

Để phát triển Android , tôi sử dụng:

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

Chỉ cần thay thế '#' bằng '0x'
Julian Os

1
Color.parseColor không hỗ trợ màu sắc với ba chữ số như thế này: #fff
neoexpert

Bạn có thể thử bên dưới của #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 (đỏ, lục, lam);
GTID

9

Đây là phiên bản xử lý cả phiên bản RGB và 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;
}

Điều này rất hữu ích cho tôi vì Integer.toHexString hỗ trợ kênh alpha, nhưng Integer.decode hoặc Color.decode dường như không hoạt động với nó.
Ted

4

Mã màu là #RRGGBB

RR, GG, BB là các giá trị hex từ 0-255

Hãy gọi RR XY trong đó X và Y là ký tự hex 0-9A-F, A = 10, F = 15

Giá trị thập phân là X * 16 + Y

Nếu RR = B7, số thập phân của B là 11, vì vậy giá trị là 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

bạn có thể làm điều đó đơn giản như sau:

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

Ví dụ

getRGB("444444") = 68,68,68   
getRGB("FFFFFF") = 255,255,255

2

Đối với JavaFX

import javafx.scene.paint.Color;

.

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

1

Chuyển nó thành một số nguyên, sau đó chia nó hai lần cho 16, 256, 4096 hoặc 65536 tùy thuộc vào độ dài của chuỗi hex gốc (3, 6, 9 hoặc 12 tương ứng).


1

Rất nhiều giải pháp này hoạt động, nhưng đây là một giải pháp thay thế.

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

Nếu bạn không thêm 4278190080 (# FF000000), màu sẽ có Alpha là 0 và sẽ không hiển thị.


0

Để giải thích rõ hơn về câu trả lời mà @xhh đã cung cấp, bạn có thể thêm màu đỏ, xanh lá cây và xanh lam để định dạng chuỗi của bạn là "rgb (0,0,0)" trước khi trả lại.

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

Nếu bạn không muốn sử dụng AWT Color.decode, thì chỉ cần sao chép nội dung của phương thức:

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

Integer.decode xử lý # hoặc 0x, tùy thuộc vào cách chuỗi của bạn được định dạng


0

Đây là một phiên bản nhanh hơn khác xử lý các phiên bản 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

Cách dễ nhất:

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


-1

Hôm trước, tôi đã giải quyết vấn đề tương tự và thấy thuận tiện khi chuyển đổi chuỗi màu hex thành mảng 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);

còn #eee thì sao?
Boni2k
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.