【问题标题】:Java Color encode RGB into single integer?Java颜色将RGB编码为单个整数?
【发布时间】:2017-12-26 20:38:20
【问题描述】:

我正在阅读“Java The Complete Reference Ninth Edition”,作者给出了这个例子,用一个整数来创建一个 Color 对象,该整数对他所说的 RGB 值进行编码:

整数在第 16 到 23 位为红色,在第 23 位为绿色 8 到 15,位 0 到 7 为蓝色。以下是此构造函数的示例:

int newRed = (0xff000000 | (0xc0 << 16) | (0x00 << 8) | 0x00);
Color darkRed = new Color(newRed);

0xff000000 in hexadecimal is equivalent to  0b11111111000000000000000000000000 in binary

这是一个 32 位整数... 我理解按位操作,但我不明白的是:

数字开头的那些有什么用?为什么不以零开头

【问题讨论】:

标签: java colors bit-manipulation rgb


【解决方案1】:

我想你的意思是问为什么 0xff000000 被添加到聚会中。
它确实依赖于实现。
我的猜测是以下两种选择之一:
1. 颜色对这些位没有任何作用,为了安全起见,您将不相关的位设置为 1(因此溢出红色不会有任何不同)。
2. 那就是alpha通道(这个比前者更有意义)

编辑:
现在我意识到你在谈论 awt Color 对象,所以正确的答案是选项号。 2.

【讨论】:

    【解决方案2】:

    The Javadocs for Color 解释说 Java Color 类包含一个 alpha 通道以及 RGB——因此以全零开头的颜色将是完全透明的。 0xff000000 所代表的颜色是不透明黑色。

    在这种情况下,作者当然犯了错误。单参数构造函数忽略高字节。相反,如果他想指定 alpha,它应该使用 new Color(0xffc00000, true)(或者更简单地说,new Color(0xc0, 0, 0, 0xff))。

    【讨论】:

    • 感谢您的回答,很有帮助
    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2019-02-08
    • 2017-09-11
    • 2016-10-14
    • 1970-01-01
    • 2020-01-16
    相关资源
    最近更新 更多