Java BufferedImage, становящийся красным, зеленым и синим индивидуально

getRGB() метод возвращает единственный интервал. Как я могу получить индивидуально красные, зеленые и синие цвета все как значения между 0 и 255?

49
задан Michu93 18 January 2019 в 12:54
поделиться

4 ответа

Класс Java Color может выполнять преобразование:

Color c = new Color(image.getRGB());
int red = c.getRed();
int green = c.getGreen();
int blue = c.getBlue();
71
ответ дан 7 November 2019 в 11:14
поделиться

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

int blue = rgb & 0xFF;
int green = (rgb >> 8) & 0xFF;
int red = (rgb >> 16) & 0xFF;

(Или, возможно, наоборот, я, честно говоря, не могу вспомнить, документация не дает мне мгновенного ответа)

8
ответ дан 7 November 2019 в 11:14
поделиться

Пиксель представлен 4-байтовым (32-битным) целым числом, например:

00000000 00000000 00000000 11111111
^ Alpha  ^Red     ^Green   ^Blue

Итак, чтобы получить отдельные цветовые компоненты, вам просто понадобится немного двоичной арифметики:

int rgb = getRGB(...);
int red = (rgb >> 16) & 0x000000FF;
int green = (rgb >>8 ) & 0x000000FF;
int blue = (rgb) & 0x000000FF;

Это действительно то, что java.awt.Color методы класса выполняют:

  553       /**
  554        * Returns the red component in the range 0-255 in the default sRGB
  555        * space.
  556        * @return the red component.
  557        * @see #getRGB
  558        */
  559       public int getRed() {
  560           return (getRGB() >> 16) & 0xFF;
  561       }
  562   
  563       /**
  564        * Returns the green component in the range 0-255 in the default sRGB
  565        * space.
  566        * @return the green component.
  567        * @see #getRGB
  568        */
  569       public int getGreen() {
  570           return (getRGB() >> 8) & 0xFF;
  571       }
  572   
  573       /**
  574        * Returns the blue component in the range 0-255 in the default sRGB
  575        * space.
  576        * @return the blue component.
  577        * @see #getRGB
  578        */
  579       public int getBlue() {
  580           return (getRGB() >> 0) & 0xFF;
  581       }
114
ответ дан 7 November 2019 в 11:14
поделиться

Для простых манипуляций с цветом вы можете использовать

bufImg.getRaster().getPixel(x,y,outputChannels)

outputChannels - это массив для хранения выбранного пикселя. Его длина зависит от фактического количества каналов вашего изображения. Например, изображение RGB имеет 3 канала; а изображение RGBA имеет 4 канала.

Этот метод имеет 3 типа вывода: int, float и double. Чтобы получить диапазон значений цвета от 0 до 255, ваш фактический параметр outputChannels должен быть массивом int [].

7
ответ дан 7 November 2019 в 11:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: