Вопрос по java – Получить 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
так как значение 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