2014-08-28 79 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]