2014-01-19 3 views
2

У меня есть десятичный (не шестнадцатеричный) цветовой код и, используя Java, мне нужно преобразовать его в три цвета RGB.Java - десятичный цвет для цвета RGB

Так, например, 16777215 (чистый белый) необходимо, чтобы преобразовать в Red: 255 Green: 255 Синий: 255.
65280 (чистый зеленый) нужно, чтобы преобразовать в красный: 0 Зеленый 255: Синий: 0

Here - это конвертер для большего количества примеров.


Просто делать некоторые небольшие расчеты и играть с калькулятором на странице связаны выше, я решил:

  • Красный равна 65536 (256^2)
    • (255x65536 = 16711680, он же чистый красный)
  • Зеленый равен 256 (256^1)
    • (255x256 = 65280, также известный как чистый зеленый)
  • Синий равна 1 (256^0)
    • (255x1 = 255, так называемый чистый синий)

я могу сказать, это, очевидно, что-то делать с байтами, но мне не хватает это последнее немного. Я не самый лучший со всей концепцией бит/байтов/etc и как он взаимодействует с Java, поэтому, скорее всего, это довольно просто.

Итак, кто-нибудь знает, как это сделать? Что было бы лучшим способом преобразования одного числового десятичного цвета в три отдельных значения RGB с помощью java?

ответ

6

Вы могли бы сделать

Color color = new Color(16777215); 
int red = color.getRed(); 
int green = color.getGreen(); 
int blue = color.getBlue(); 
+1

Java имеет прямолинейный конструктор цветов, принимающий единственный int, который тоже работает. – Jems

+0

Это именно то, что мне нужно. Не знал, что все существо цвета. Большое спасибо! – Alex

+0

+1 для ответа более высокого уровня :) –

12

Вы где говорить правильно: значения RGB кодируются в виде байтов в int. R - байт 2, G - байт 1, а B - байт 0, суммирующий до 24-битной глубины цвета. В зависимости от цели, это может быть возможным представлением.

00000000 00000000 00000000 00000000 <-- 32bit int 
     ^   ^ ^
     |    |  | 
     +--red here |  +--green here 
       8bit  |   8bit 
         | 
         +--blue here 
          8bit 

Вы можете извлечь значения RGB с некоторым битном сдвига и маскирования:

int red = (color >> 16) & 0xff; 
int green = (color >> 8) & 0xff; 
int blue = color & 0xff; 
+0

Кажется, что это сработало бы для того, что мне было нужно, и гораздо лучшей информации, но размещенная в ней книга «Реймеус» делает то, что мне нужно, и выглядит намного проще. Большое спасибо, хотелось бы выбрать как лучший ответ. – Alex

+1

Да, я согласен. Я не удалял это, потому что искусство ASCII может помочь вам понять, как значения RGB были упакованы в номере, который у вас есть. Вы должны обязательно пойти по пути @Reimeus. –

+0

Отличный ответ! Он может использоваться на нескольких языках программирования с одним и тем же решением. Даже если для этого нет объекта Color. –

0

Вы можете получить каналы путем простых побитовых операций.

int r = (color >> 16) & 0xff; 
int g = (color >> 8) & 0xff; 
int b = color & 0xff; 

Оттуда должно быть легко сделать все, что хотите, с информацией о цвете.

1

Десятичный, шестнадцатеричный: не имеет значения. Ваш компьютер использует двоичные представления внутри.

Возможно, вы заметили, что 0xFF00 == 65280.

Десятичные и шестнадцатеричные пользователь изображения.

0

Я знаю, что я немного поздно, но ...

int r = color/65536; 
int g = (color - r * 65536)/256; 
int b = color - r * 65536 - g * 256; 

Это действительно делает точно такую ​​же вещь, как бинарные сдвиги, даже если он не использует битовые операторы. Это также работает только при использовании допустимых значений RGB (что означает, что каждое значение представляет собой целое число от 0 до 255). Однако для эффективности я использовал бинарные сдвиги из приведенных выше ответов.

Смежные вопросы