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

如何使用java将十六进制转换为十进制rgb565?,java,algorithm,math,hex,rgb,Java,Algorithm,Math,Hex,Rgb,我正在尝试制作一个程序,分别将十六进制转换为十进制rgb888和rgb565 我已经完成了将十六进制转换为rgb888格式的程序,我的代码如下所示: String color = "0xFFFF00"; int hexToRgb = 0; color.toLowerCase(); String[] colorSplited = color.split("0x"); String splitedConverted = colorSplited[1]; i

我正在尝试制作一个程序,分别将十六进制转换为十进制rgb888和rgb565

我已经完成了将十六进制转换为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);
String color = “0xFFE0”;
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);
我看过一些文章,其中他们解释了每个rgb888组件R、G和B都由0和2^8变量。我目前的程序没有使用那个特定的过程,但我得到了我需要的结果

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

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);
String color = “0xFFE0”;
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);
所以要转换的是FFE0

对于这个输入,我需要得到结果R=31,G=63和B=0。但我不知道我是如何达到这个结果的。
我在互联网上得到的是每个组件的RGB都是由0变化的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


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

您不能像对待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;

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

RGB565使用5位表示红色,6位表示绿色,5位表示蓝色。一种颜色有n位意味着它将有2^n可能的值。2^5=32和2^6=64,这是您从Internet获得的每种颜色的不同值的来源

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

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);
String color = “0xFFE0”;
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);

试着看一下你的数学解释,它帮助我更好地理解了计算机到底在做什么来处理这个问题。我会做一些纸上练习来练习你的理论,并记住解释,我不喜欢只是复制和粘贴代码,通常我也喜欢理解数学是如何工作的。谢谢@alseetheryou代码帮助我实现我的目标,我得到的第一个答案帮助我更好地理解这背后的数学。谢谢你,明白了!我会改变的。我没有注意到我不需要那条线