Получить RGB BufferedImage - программирование
Подтвердить что ты не робот

Получить RGB BufferedImage

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

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

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

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

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

4b9b3361

Ответ 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