2014-08-28 181 views
2

有一个简单的算法可将整数值转换为0到255之间的三个数字的RGB值,其格式为integer to rgb。我从Android Colors得到整数。我甚至跑:无法将青色的整数颜色转换为RGB

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有人能帮助我吗?

+2

你为什么要使用十进制文本表示的颜色? '0xFF00FF00'比'-16711681'清晰得多。 – resueman 2014-08-28 19:04:18

+0

我通过websocket发送颜色,在Java的Colors中获取getRGB()方法并将它们发送给我的客户端似乎很简单。我打算在javascript客户端提取RGB。 – smuggledPancakes 2014-08-28 19:13:46

回答

2

这是因为你的号码不像ABDR包装的int那样与你的gamedev链接建议,而是一个ARGB-packed int。

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 
+0

而提供的显示%256的链接是用于'getABGRPackedInt()' - AABBGGRR中的某处,这是混淆的地方。 – Alcanzar 2014-08-28 19:48:54

+0

@Alcanzar的确,由于'Color.decode()'想要一个'ARGB'-packed int :( – 2014-08-28 19:54:20

1

比方说x=-16711681

x二进制值是11111111000000001111111111111111

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

现在,根据Java Docs获得我们需要从x

enter image description here


QN提取16-23 bitsRed Value怎么办我从32位整数中提取16-23位的8位?

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


// 24-31位是字母,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]