Как изменить размер изображения без загрузки в память? - PullRequest
5 голосов
/ 17 мая 2011

Я хотел бы проверить размеры изображения, а затем уменьшить его размер, если ширина превышает заданный порог. Когда я загружаю изображение JPEG размером 6 МБ с помощью ImageIO.read (), BufferedImage выделяет около 45 МБ пространства кучи. Есть ли способ сделать изменение размера изображения без загрузки всех данных в память? Я попытался передать ImageIO.read () объект File, полагая, что он будет передавать данные с диска, но это не помогает.

Ответы [ 3 ]

3 голосов
/ 17 мая 2011

Проверить im4java и JMagick .Оба используют чрезвычайно эффективный внешний инструмент под названием ImageMagick для работы с изображениями.Im4Java вызывает приложение командной строки (работает в отдельном процессе), а JMagick вызывает его в том же процессе через JNI.

Если я делаю простые манипуляции с изображениями (изменение размера, масштабирование, вращение и т. Д.),Я бы предпочел, чтобы ImageMagick сделал это для меня.Это будет быстрее, надежнее и потреблять меньше памяти, чем то, что вы реализуете за такое же время.

Надеюсь, это поможет!

3 голосов
/ 30 марта 2012

Раньше я использовал jmagick с отличными результатами, однако может быть неудобно заставить его работать в разных средах (вставлять банки в нужное место, проверяя, правильно ли вы собрали imagemagick и т. Д.).

Возможно, вы захотите использовать imgscalr (http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library). Это библиотека с открытым исходным кодом для манипулирования изображениями java, доступная под лицензией Apache 2.0. Гораздо (намного ..) проще в использовании и быстрее, чем эти ужасные вещи Java2D..

1 голос
/ 17 мая 2011

Вы можете использовать ImageInfo , чтобы проверить ширину и высоту изображения, не загружая его в память. Я не знаю библиотеки, которая позволит вам изменять размер без загрузки изображения в память. 45 МБ не так уж много памяти на самом деле. Можете ли вы просто увеличить размер кучи?

...