如何使用java将十六进制转换为十进制rgb565?

时间:2017-10-18 13:32:46

标签: java algorithm math hex rgb

我正在尝试将hex转换为十进制rgb888和rgb565的make程序。

我已经完成了将hex转换为rgb888格式的程序,我的代码如下所示:

String color = "0xFFFF00";
    int hexToRgb = 0;

    color.toLowerCase();
    String[] colorSplited = color.split("0x");
    String splitedConverted = colorSplited[1];

    int R = Integer.valueOf(splitedConverted.substring(0,2), 16);
    int G = Integer.valueOf(splitedConverted.substring(2,4), 16);
    int B = Integer.valueOf(splitedConverted.substring(4,6), 16);

    System.out.println(R + " " + G + " " + B);

我看到一些文章,他们解释说每个rgb888组件R,G和B变量为0和2 ^ 8。我目前的程序没有使用那个特定的过程,但我得到了我需要的结果。

现在我需要制作相同的程序,但要将hex转换为rgb565,。我的十六进制输入如下所示:

String color = “0xFFE0”;

因此将转换为FFE0。

对于这个输入我需要得到结果R = 31,G = 63和B = 0.但是我不知道我是如何实现这个结果的。 我在互联网上得到的是每个分量RGB变化0 <= R <= 2 ^ 5,0 <= G <= 2 ^ 6且0 <= B <= 2 ^ 5。

不幸的是,我不是数学方面的专家。 有人可以帮我理解这背后的数学,或者对我如何得到这个结果有任何意见?

3 个答案:

答案 0 :(得分:1)

RGB颜色的典型十六进制表示与RGB888相同,我将尝试用示例来说明这一点。猜猜我们有颜色

0xFF8800,字面意思是

1111.1111.1000.1000.0000.0000作为二进制数,其组成部分为:

R = FF = 1111.1111 = 255(点仅用于帮助查看)

G = 88 = 1000.1000 = 136

B = 00 = 0000.0000 = 0

所以,翻译是立即的(好吧,确实没有翻译),每个组件的值可以从00到FF(十进制基数为0到255)

RGB565的情况不同。您只有5位(或绿色情况下为6)来表示颜色的组成部分。

您可以将每个组件视为参与全局颜色的百分比。

0xFF8800

的示例中

红色组件参与100%(它具有组件的最大可能值,255)

格林参与53.33%(其值为136超过255)

蓝色参与0%,这个很明显。

如果将此百分比的颜色应用于RGB565颜色,您将获得每个组件的值。

因此,要将0xFF8800翻译为RGB565,请计算每个百分比

R = 1 * 31 = 31 //(percentage over 100 by the maximum value of red in RGB565 = 2^5, minus 1)

G = 0.5333 * 63 = 33.6 //(you should round this value to integer)

B = 0 * 31 = 0

有了这个,最终的数字是:

  31    34    0

11111.100010.00000

      or

1111.1100.0100.0000

     in hex

0xFC40

不确定解释是否最好,但希望有所帮助。

答案 1 :(得分:1)

首先,每个十六进制字符由4位编码。因此,具有4个十六进制字符意味着您有16位来编码颜色。

RGB565使用5位表示红色,6位表示绿色,5位表示蓝色。对于颜色具有 n 位意味着它将具有 2 ^ n 可能的值。 2 ^ 5 = 32和2 ^ 6 = 64,这是您从互联网获得的每种颜色的不同值来自的地方。

要将RGB565值拆分为每种单独的颜色,您需要为每一种颜色提取相应的位,例如,如下所示:

int redMask   = 0b1111100000000000;
int greenMask = 0b0000011111100000;
int blueMask  = 0b0000000000011111;

String color = "0xFFE0";
int colorAsInteger = Integer.parseInt(color.substring(2,color.length()), 16); // convert the Hex value to int

int R = (colorAsInteger & redMask) >> 11; // keep only red bits
int G = (colorAsInteger & greenMask) >> 5; // keep only green bits
int B = colorAsInteger & blueMask; // keep only blue bits

System.out.println(R + " " + G + " " + B);

答案 2 :(得分:0)

您不能像对rgb888格式那样简单地拆分字符串。 你应该做的是将整个字符串转换为数字,然后使用这样的位移来分割这个数字:

    String color = "0xFFE0";
    int rgb = Integer.valueOf(color.substring(2,6), 16);
    int r = (rgb & 0b1111100000000000) >> 11;
    int g = (rgb & 0b0000011111100000) >> 5;
    int b = (rgb & 0b0000000000011111) >> 0;