Я публикую эту тему, потому что у меня есть некоторые трудности с обработкой изображений на Java. Я хотел бы иметь возможность конвертировать изображение в массив byte [], а затем иметь возможность выполнять обратную операцию, поэтому я могу изменить RGB каждого пикселя, а затем создать новое изображение. Я хочу использовать это решение, потому что setRGB() и getRGB() BufferedImage могут быть слишком медленными для огромных изображений (исправьте меня, если я ошибаюсь).
Я прочитал несколько сообщений здесь, чтобы получить массив byte [] (такой как здесь), так что каждый пиксель представлен 3 или 4 ячейками массива, содержащего красный, зеленый и синий (с дополнительным альфа-значением, когда есть 4 ячейки), что очень полезно и легко для меня использовать. Вот код, который я использую для получения этого массива (хранящегося в классе PixelArray, который я создал):
public PixelArray(BufferedImage image)
{
width = image.getWidth();
height = image.getHeight();
DataBuffer toArray = image.getRaster().getDataBuffer();
array = ((DataBufferByte) toArray).getData();
hasAlphaChannel = image.getAlphaRaster() != null;
}
Моя большая проблема заключается в том, что я не нашел эффективного метода для преобразования этого байтового [] массива в новое изображение, если бы я хотел преобразовать изображение (например, удалить значения синего/зеленого цвета и сохранить только красный один). Я пробовал эти решения:
1) Создание объекта DataBuffer, затем создание SampleModel, чтобы, наконец, создать WritableRaster, а затем BufferedImage (с дополнительными объектами ColorModel и Hashtable). Это не сработало, потому что я, видимо, не располагаю всей необходимой информацией (я не знаю, что такое Hashtable для конструктора BufferedImage()).
2) Использование ByteArrayInputStream. Это не сработало, потому что массив байтов, ожидаемый с ByteArrayInputStream, не имеет ничего общего с моим: он представляет каждый байт файла, а не каждый компонент каждого пикселя (с 3-4 байтами для каждого пикселя)...
Может кто-нибудь мне помочь?