Масштабирование изображения Java без загрузки всего изображения в память

У нас есть несколько очень больших jpg, которые используются при печати на принтерах формата A0.

Проблема в том, что нам нужно преобразовать это большое изображение в миниатюру для использования в нескольких пользовательских интерфейсах Java.

Есть ли способ преобразовать изображение (с помощью Java) без загрузки всего изображения в память? В настоящее время мы получаем исключения из памяти, когда пытаемся загрузить изображения.

Есть ли что-нибудь в стандартном коде или мне лучше всего использовать jmagick? Для нашего развертывания лучше всего подойдет чистая реализация Java.

Спасибо


person Neil Wightman    schedule 30.05.2012    source источник
comment
Повторяющийся вопрос: Загрузка больших изображений в виде эскизов без проблем с памятью в Java?   -  person Robert    schedule 30.05.2012
comment
Я видел это, но не мог заставить его работать, поскольку он продолжал говорить java.lang.IllegalStateException: Input not set   -  person Neil Wightman    schedule 31.05.2012


Ответы (1)


Мне удалось заставить его работать, и полный код выглядит следующим образом.

Вызов reader.setInput(iis, true, true); это волшебство, которого мне не хватало в предыдущем посте.

FileInputStream fin = new FileInputStream(source);

ImageInputStream iis = ImageIO.createImageInputStream(fin);

Iterator iter = ImageIO.getImageReaders(iis);
if (!iter.hasNext()) {
    return;
}

ImageReader reader = (ImageReader) iter.next();

ImageReadParam params = reader.getDefaultReadParam();

reader.setInput(iis, true, true);

params.setSourceSubsampling(width, height, 0, 0);

BufferedImage img = reader.read(0, params);

ImageIO.write(img, "JPG", destination);
person Neil Wightman    schedule 31.05.2012
comment
ширина и высота - это не размер изображения, а количество пикселей, на которые нужно перейти между пикселями. Так что это действительно соотношение размера источника и требуемого размера вывода. - person Neil Wightman; 31.05.2012