我正在尝试分别将十六进制转换为十进制 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,这是您从 Internet 获得的每种颜色的不同值的来源。
要将 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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句