2014-08-28 5 views
2

Существует простой алгоритм преобразования целочисленных значений в значение RGB из трех чисел между 0-255 по адресу integer to rgb. Я получил целое число от Android Colors. Я даже побежал:Ошибка при преобразовании целочисленного цвета для cyan в RGB

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

и ответ был java.awt.Color [г = 0, г = 255, B = 0], который, как ожидается.

У меня буквально есть проблема на первом шаге, -16711681% 256 - 255, и я ожидаю 0 для красного цвета. В Java я закодирован:

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

и я получаю -1, что означает, что я должен добавить 256 и мой красный цвет 255. Может кто-нибудь мне помочь?

+2

Почему вы используете десятичные литералы для представления цвета? '0xFF00FF00' намного понятнее, чем' -16711681'. – resueman

+0

Я посылаю цвета через websocket, и просто казалось, что получить метод getRGB() на моих Цветах на Java и отправить их моему клиенту. Я планировал извлечь RGB на стороне клиента javascript. – smuggledPancakes

ответ

2

Это потому, что ваш номер не является ABGR-упакованным, как ваша ссылка на gamedev, но ARGB-упакованный 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

+0

@Alcanzar Действительно, поскольку 'Color.decode()' хочет 'ARGB'-упакованный int :( –

1

Позволяет сказать x=-16711681

двоичное значение x является 11111111000000001111111111111111

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

Теперь, согласно Java Docs получить Red Value нам нужно извлечь 16-23 bits из x

enter image description here


Qn: Как Я извлекаю 8 бит из Позиций 16-23 из 32-битного целого?

Ответ: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] 
Смежные вопросы