Получить RGB BufferedImage

Кто-нибудь может объяснить, как получить массив значений 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

 Greg Kopff04 июн. 2012 г., 13:04
Каков результат BufferedImage.getType ()?
 Garbage04 июн. 2012 г., 13:12
 kotoko04 июн. 2012 г., 16:15
@Garbage Спасибо за совет. Я попытался int [] dataBuffInt = heightMap.getRGB (0, 0, heightMap.getWidth (), heightMap.getHeight (), null, 0, heightMap.getWidth ()); Но получить тот же результат.

Ответы на вопрос(1)

Решение Вопроса

так как значение 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
 04 июн. 2012 г., 16:37
Добавлено & quot; быстрее & quot; способ получить то же самое, используя Bitfiddling! :)
 09 февр. 2014 г., 07:42
Привет всем, это средняя RGB изображения, полученного в приведенном выше коде @kotoko
 kotoko04 июн. 2012 г., 16:31
Спасибо вам большое! Просто чтобы проверить, чтобы найти это для всех точек на изображении, я должен сделать несколько циклов, другого более эффективного способа нет, верно?
 kotoko04 июн. 2012 г., 17:03
Спасибо вам большое!
 04 июн. 2012 г., 16:33
Изменен пример для использования данных, возвращаемыхint[] getRGB(...), Данные возвращаются вARGB режим, так что вы можете извлекать цветовые компоненты самостоятельно, но эй, всегда профилируйте сначала вместо того, чтобы делать преждевременные оптимизации. :)

Ваш ответ на вопрос