Вопрос по java – Получить RGB BufferedImage

18

Кто-нибудь может объяснить, как получить массив значений RGB из BufferedImage?

У меня есть изображение в оттенках серого в BufferedImage, и мне нужно извлечь массив от 0 до 255 значений, которые описывают изображение.
  Я знаю, что BufferedImage правильный, потому что я могу сохранить его в PNG. Однако, если я используюint[] dataBuffInt = ((DataBufferInt) heightMap.getDataBuffer()).getData(); Я получаю кучу огромных отрицательных чисел.

Я искал некоторое время и видел некоторые ссылки на сдвиг некоторых значений (сообщение) но на самом деле не понимаю, о чем они говорят.

В основном я хочу перейти от BufferedImage к массиву от 0 до 255 значений RBG.
 Я не уверен, что объяснил себя правильно, пожалуйста, попросите более подробную информацию.

Редактировать:
@Garbage Спасибо за совет. Я попытался int [] dataBuffInt = heightMap.getRGB (0, 0, heightMap.getWidth (), heightMap.getHeight (), null, 0, heightMap.getWidth ()); Но получить тот же результат.
@Greg Kopff Результат равен 2 и для него установлено значение TYPE_INT_ARGB

Каков результат BufferedImage.getType ()? Greg Kopff
@Garbage Спасибо за совет. Я попытался int [] dataBuffInt = heightMap.getRGB (0, 0, heightMap.getWidth (), heightMap.getHeight (), null, 0, heightMap.getWidth ()); Но получить тот же результат. kotoko

Ваш Ответ

1   ответ
27

так как значение int, полученное из одного из пикселей, состоит из красного, зеленого, синего и альфа. Вам нужно разделить цвета, чтобы получить значение для каждого компонента цвета.

Самый простой способ сделать это - создатьColor возражать и использоватьgetRed, getGreen а такжеgetBlue (так же какgetAlpha) методы получения компонентов:

public static void main(String... args) throws Exception {

    BufferedImage image = ImageIO.read(
         new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png"));

    int w = image.getWidth();
    int h = image.getHeight();

    int[] dataBuffInt = image.getRGB(0, 0, w, h, null, 0, w); 

    Color c = new Color(dataBuffInt[100]);

    System.out.println(c.getRed());   // = (dataBuffInt[100] >> 16) & 0xFF
    System.out.println(c.getGreen()); // = (dataBuffInt[100] >> 8)  & 0xFF
    System.out.println(c.getBlue());  // = (dataBuffInt[100] >> 0)  & 0xFF
    System.out.println(c.getAlpha()); // = (dataBuffInt[100] >> 24) & 0xFF
}

Выходы:

173
73
82
255
Привет всем, это средняя RGB изображения, полученного в приведенном выше коде @kotoko
Спасибо вам большое! kotoko
Добавлено & quot; быстрее & quot; способ получить то же самое, используя Bitfiddling! :)
Изменен пример для использования данных, возвращаемыхint[] getRGB(...), Данные возвращаются вARGB режим, так что вы можете извлекать цветовые компоненты самостоятельно, но эй, всегда профилируйте сначала вместо того, чтобы делать преждевременные оптимизации. :)
Спасибо вам большое! Просто чтобы проверить, чтобы найти это для всех точек на изображении, я должен сделать несколько циклов, другого более эффективного способа нет, верно? kotoko

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