【问题标题】:Having trouble converting integer color for cyan to RGB将青色的整数颜色转换为 RGB 时遇到问题
【发布时间】:2014-10-22 18:00:49
【问题描述】:

integer to rgb 有一个简单的算法可以将整数值转换为 0-255 之间的三个数字的 RGB 值。我从Android Colors 得到整数。我什至跑了:

System.out.println(Color.decode("-16711681"));

答案是 java.awt.Color[r=0,g=255,b=0],这是意料之中的。

我确实在第一步遇到了问题,-16711681 % 256 是 255,我希望红色为 0。我在 Java 中编码:

System.out.println(-16711681 % 256);

我得到 -1,这意味着我必须加上 256,我的红色是 255。有人可以帮我吗?

【问题讨论】:

  • 为什么要用十进制文字来表示颜色? 0xFF00FF00-16711681 清晰得多。
  • 我正在通过 websocket 发送颜色,在 Java 中获取我的颜色上的 getRGB() 方法并将它们发送到我的客户端似乎很简单。我正计划在 javascript 客户端提取 RGB。

标签: java colors rgb modulo modulus


【解决方案1】:

那是因为您的号码不是像您的 gamedev 链接所暗示的那样采用 ABGR 封装的整数,而是采用 ARGB 封装的整数。

Color.decode(int) 想要以下格式的颜色:

0xAARRGGBB

其中AA 是透明度,RR 是红色,GG 是绿色,BB 是蓝色。当您执行 color % 256 时,将返回颜色的蓝色 (BB) 部分。

如果我们用Integer.toHexString(-16711681)查看颜色,我们会得到:

 Color:   ff00ffff
(Format:  AARRGGBB)

相当于Color[r=0,g=255,b=255]

如果要读取红色值,需要先将其移过来:

(color >> 16) & 0xFF

【讨论】:

  • 所提供的显示 %256 的链接是针对 getABGRPackedInt() 中的某些内容的——AABBGGRR 这就是混乱所在。
  • @Alcanzar 确实,因为Color.decode() 想要一个ARGB-packed int :(
【解决方案2】:

让我们说x=-16711681

x 的二进制值为11111111000000001111111111111111

Integer c = new Integer(-16711681);
System.out.println(Integer.toBinaryString(x));

现在,根据Java Docs得到Red Value,我们需要从x中提取16-23 bits


Qn:如何从 32 位整数中从位置 16-23 中提取 8 位?

回答: x = (x >> 16) & 0xFF;


// 位 24-31 是 alpha,16-23 是红色,8-15 是绿色,0-7 是蓝色

因此,Color.decode("-16711681")); 等价于

System.out.println(((-16711681 >> 16) & 0xFF) + ":"
                + ((-16711681 >> 8) & 0xFF) + ":" + ((-16711681 >> 0) & 0xFF));

输出

0:255:255

请注意 System.out.println(Color.decode("-16711681")); 输出

java.awt.Color[r=0,g=255,b=255]

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 2012-08-25
    • 2019-02-08
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2011-05-05
    • 2013-12-10
    相关资源
    最近更新 更多