当前位置: 首页 > 知识库问答 >
问题:

将RGB值转换为二进制到十进制

段干祺
2023-03-14

我有下面的java代码,它接受RGB颜色的三个双倍值(0和1之间)并将它们转换为十进制格式。我明白了第一个8位如何保存颜色x,第二个8位颜色y...以及如何从结果二进制中获得十进制值。我100%不明白的是为什么我们用255乘以(我知道128 64 32 16 8 4 2 1)。我们到底从用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;
}

谢谢

共有1个答案

邢心水
2023-03-14

您需要从double转换,因为无法将double值存储到8位。

您的double值介于0.01.0之间。您可以将其视为所使用颜色的比例(例如,黄色中的0.33333333表示使用了三分之一可能的黄色)。正如你所看到的那样,这样的double可以有很多小数位,这意味着我们需要大量内存(64位)来存储这样的颜色。

您的函数现在尝试将双精度值存储为仅8位(256个值)。正如我们所说的,double值可以被视为一部分(0和1之间),函数计算8位(0和255之间)的值。只需将double值乘以255即可。对于带有黄色的示例(使用0.33333333的黄色),它是:0.33333333*255=84999915。其含义仍然是相同的84999915黄色部分的255个黄色部分被使用,这仍然是第三个。为了得到这个数字的压缩版本,它被四舍五入到下一个整数值。在我们的示例中,这是85,这非常接近实际部分,但我们节省了大量内存。

对于最低的double0.0,它也有意义,它被转换为最低的int0。最高双精度值1.0转换为255(最高8位数字)。

总之,我们将一个双精度(64位)转换为一个只有8位的数字,该数字的颜色比例相同,但精度不高。

编辑:因为255也有混淆:8位可以存储256个值(0到255)。如果您可以选择256作为某个颜色值,他们使用的范围为1-256,不带0。从本质上讲,它是同一个1移位。

 类似资料:
  • 我正在尝试将数字从十进制值转换为其IEEE 752形式。例如: 我写了这个方法: 有个问题我解决不了,我再举个例子说清楚。 但是当数字为负数时,例如 我收到以下错误: 这意味着我的代码可以完美地处理正数(包括零),但如果是负数,代码就会崩溃。问题出在哪里? 笔记 我想我可以用这种方式解决我的问题 检查是否有一个字符At(0)等于1 如果是(numero.charAt(0)==1),则删除第一个字符

  • 本文向大家介绍十进制到二进制转换,包括了十进制到二进制转换的使用技巧和注意事项,需要的朋友参考一下 十进制数字也可以转换为二进制格式。要将十进制数转换为二进制数,我们需要将数字除以2,直到达到0或1。然后,在每一步骤中,其余部分将分开存储以形成相反的二进制等效数。 在此算法中,我们将遵循递归方法。这将帮助我们在不使用堆栈数据结构的情况下解决问题。在实现中,我们知道函数的递归将遵循内部堆栈。我们将使

  • 我可以运行这个程序,但由于某些原因,它会显示/放置随机字符,而不是二进制的初始值,而且我似乎无法将程序从十进制运行回二进制。我该如何改进这些代码。要明确说明它不会将二进制转换为十进制,我将如何将其转换回十进制转换为二进制,如果有一些代码可以帮助我,将不胜感激。

  • 问题内容: 在我的Java应用程序,我能得到的中的红色,绿色和蓝色的条款; 我将这些值存储在3 秒内。 如何将这些RGB值转换为包含等效十六进制表示形式的?如 问题答案: 您可以使用 资金使用X如果你希望你得到的十六进制数字予以资本化(的对比)。

  • 问题内容: 我正在尝试编写将数字转换为二进制的代码,这就是我写的。它给了我一些我不理解的Eclipse错误。怎么了 还有其他建议吗?我想学习并听取任何修复建议。谢谢。 错误消息: 类型中的方法不适用于参数() 这行有多个标记 令牌“ ”的语法错误,;; 预期 令牌“ ”的语法错误,;; 预期 是变量的无效类型 这行有多个标记 令牌“ mod”的语法错误,无效的AssignmentOperator

  • 问题内容: 如何将RGB格式的颜色转换为十六进制格式,反之亦然? 例如,转换为。 问题答案: 注 :这两个版本的期待整数值,并且,所以你需要,如果你有非整数值做自己的舍入。 以下将执行RGB到十六进制的转换,并添加任何所需的零填充: 转换另一种方式: 最后,在答案中讨论并在@cwolves的评论中建议使用的替代版本: 更新 这是它的一个版本,还解析了一个速记的三元组,例如“#03F”: