如何使用 java 将十六进制转换为十进制 rgb565?
How to convert hex to decimal rgb565 using java?
我正在尝试制作将十六进制分别转换为十进制 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);
我看到一些文章,他们解释说每个 rgb888 分量 R、G 和 B 都变化了 0 和 2^8。我目前的程序没有使用那个特定的过程,但我得到了我需要的结果。
现在我需要制作相同的程序,但要将十六进制转换为 rgb565。我的十六进制输入如下所示:
String color = “0xFFE0”;
所以要转换的是FFE0。
对于这个输入,我需要得到结果 R = 31,G = 63 和 B = 0。但我不知道我是如何获得这个结果的。
我在互联网上得到的是每个组件 RGB 的变化范围为 0 <= R <= 2^5、0 <= G <= 2^6 和 0 <=B <= 2^5.
很遗憾,我不是数学专家。
有人可以帮助我理解这背后的数学原理,或者对我如何得到这个结果有任何建议吗?
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,这是你从网上得到的每种颜色的不同值的来源。
要将 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);
我正在尝试制作将十六进制分别转换为十进制 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);
我看到一些文章,他们解释说每个 rgb888 分量 R、G 和 B 都变化了 0 和 2^8。我目前的程序没有使用那个特定的过程,但我得到了我需要的结果。
现在我需要制作相同的程序,但要将十六进制转换为 rgb565。我的十六进制输入如下所示:
String color = “0xFFE0”;
所以要转换的是FFE0。
对于这个输入,我需要得到结果 R = 31,G = 63 和 B = 0。但我不知道我是如何获得这个结果的。 我在互联网上得到的是每个组件 RGB 的变化范围为 0 <= R <= 2^5、0 <= G <= 2^6 和 0 <=B <= 2^5.
很遗憾,我不是数学专家。 有人可以帮助我理解这背后的数学原理,或者对我如何得到这个结果有任何建议吗?
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,这是你从网上得到的每种颜色的不同值的来源。
要将 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);