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

标签 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];

    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/

相关文章:

java - 求 N 和 M 之间的每个数字可以表示为一对素数之和的次数

algorithm - 如何在不使用内置函数的情况下计算数字的平方根?

java - Jersey Client/JAX-RS 和可选(非默认)@QueryParam(客户端)

java - 使用带有 <a> 标签的 Html.fromHTML 不会着色!

组平均聚类的算法复杂度

c# - 将 3D 网格分割为任意大小的 block

algorithm - 如何在给定的两个二叉搜索树中找到最大的公共(public)子树?

java.net.MalformedURLException java.net.URL.<init>(来源未知)

java - 如何在运行时更改外部类日志记录级别后刷新 log4j

java - 过滤负值