我正在尝试制作将十六进制分别转换为十进制 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。
很遗憾,我不是数学专家。 有人可以帮助我理解这背后的数学原理,或者对我如何得到这个结果有任何建议吗?
最佳答案
首先,每个十六进制字符被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);
关于java - 如何使用 java 将十六进制转换为十进制 rgb565?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46811436/