将 RGB 值转换为二进制到十进制
Convert RGB values to binary to decimal
我有以下 java 代码,它采用颜色 RGB 的三个双精度值(介于 0 和 1 之间)并将它们转换为十进制格式。我了解第一个 8 位如何保存颜色 x,第二个 8 位颜色 y ...以及如何从生成的二进制文件中获取十进制值。我 100% 不明白的是为什么我们乘以 255(我知道 128+64+32+16+8+4+2+1)。将 double 值乘以 255 到底得到了什么?它是一个可以存储在 8 位中的值吗?为什么我们不使用 256(一种颜色的可能数量)?
public final double getR() {
return (1 - cyan);
}
public final double getG() {
return (1 - magenta);
}
public final double getB() {
return (1 - yellow);
}
/**
* Gets the rgb color in one integer.
*
* @return an integer containing the red component in bits 16-23, the green component in bits 8-15
* and the blue component in bits 0-7. Bits 24-32 are zero.
*/
public int getRGB() {
int r = (int) Math.round(getB() * 255);
r |= (int) Math.round(getR() * 255) << 16;
r |= (int) Math.round(getG() * 255) << 8;
return r;
}
谢谢
您需要从 double
进行转换,因为您无法将 double
值存储为 8 位。
您的 double
值介于 0.0
和 1.0
之间。您可以将它们视为所用颜色的比例(例如,黄色中的 0.33333333 表示使用了 one-third 可能的黄色)。如您所见,这样的 double
可以有很多小数位,这意味着我们需要大量内存(64 位)来存储这样的颜色。
您的函数现在尝试将 double
值存储为仅 8 位(256 个值)。正如我们所说,double
值可以看作是一部分(介于 0 和 1 之间),函数计算相同的 8 位(介于 0 和 255 之间)。这可以简单地通过将 double
值乘以 255 来完成。对于黄色的示例(使用 0.33333333 黄色)它是:0.33333333 * 255 = 84,99999915
。意思还是一样 84,99999915 黄色部分 255 个黄色部分用到了,还是三分之一。
为了得到这个数字的压缩版本,它被四舍五入到下一个整数值。在我们的示例中,这是 85
,它非常接近实际部分,但我们节省了大量内存。
对于最低的 double
值 0.0
也有意义,它被转换为最低的 int
值 0
。最高双精度值1.0
转换为255
(最高8位数字)。
综上所述,我们将一个double
(64位)转换成一个只有8位的数字,颜色比例相同,但不那么准确。
编辑:由于与 255 也存在混淆:8 位可以存储 256 个值(0 到 255)。如果您可以在某处选择 256 作为颜色值,他们会使用 1-256 范围内不带 0 的值。本质上,它是相同的值,但偏移了 1。
我有以下 java 代码,它采用颜色 RGB 的三个双精度值(介于 0 和 1 之间)并将它们转换为十进制格式。我了解第一个 8 位如何保存颜色 x,第二个 8 位颜色 y ...以及如何从生成的二进制文件中获取十进制值。我 100% 不明白的是为什么我们乘以 255(我知道 128+64+32+16+8+4+2+1)。将 double 值乘以 255 到底得到了什么?它是一个可以存储在 8 位中的值吗?为什么我们不使用 256(一种颜色的可能数量)?
public final double getR() {
return (1 - cyan);
}
public final double getG() {
return (1 - magenta);
}
public final double getB() {
return (1 - yellow);
}
/**
* Gets the rgb color in one integer.
*
* @return an integer containing the red component in bits 16-23, the green component in bits 8-15
* and the blue component in bits 0-7. Bits 24-32 are zero.
*/
public int getRGB() {
int r = (int) Math.round(getB() * 255);
r |= (int) Math.round(getR() * 255) << 16;
r |= (int) Math.round(getG() * 255) << 8;
return r;
}
谢谢
您需要从 double
进行转换,因为您无法将 double
值存储为 8 位。
您的 double
值介于 0.0
和 1.0
之间。您可以将它们视为所用颜色的比例(例如,黄色中的 0.33333333 表示使用了 one-third 可能的黄色)。如您所见,这样的 double
可以有很多小数位,这意味着我们需要大量内存(64 位)来存储这样的颜色。
您的函数现在尝试将 double
值存储为仅 8 位(256 个值)。正如我们所说,double
值可以看作是一部分(介于 0 和 1 之间),函数计算相同的 8 位(介于 0 和 255 之间)。这可以简单地通过将 double
值乘以 255 来完成。对于黄色的示例(使用 0.33333333 黄色)它是:0.33333333 * 255 = 84,99999915
。意思还是一样 84,99999915 黄色部分 255 个黄色部分用到了,还是三分之一。
为了得到这个数字的压缩版本,它被四舍五入到下一个整数值。在我们的示例中,这是 85
,它非常接近实际部分,但我们节省了大量内存。
对于最低的 double
值 0.0
也有意义,它被转换为最低的 int
值 0
。最高双精度值1.0
转换为255
(最高8位数字)。
综上所述,我们将一个double
(64位)转换成一个只有8位的数字,颜色比例相同,但不那么准确。
编辑:由于与 255 也存在混淆:8 位可以存储 256 个值(0 到 255)。如果您可以在某处选择 256 作为颜色值,他们会使用 1-256 范围内不带 0 的值。本质上,它是相同的值,但偏移了 1。