Как я могу изменить размер изображения с помощью Java? - PullRequest
120 голосов
/ 28 октября 2008

Мне нужно изменить размер файлов PNG, JPEG и GIF. Как я могу сделать это с помощью Java?

Ответы [ 16 ]

178 голосов
/ 24 декабря 2010

FWIW Я только что выпустил (Apache 2, размещенный на GitHub) простую библиотеку для масштабирования изображений для Java под названием imgscalr (доступна на Maven central ).

В библиотеке реализовано несколько различных подходов к масштабированию изображений (в том числе инкрементальный подход Криса Кэмпбелла с несколькими незначительными улучшениями), и он либо выберет наиболее оптимальный для вас подход, если вы попросите об этом, либо предоставит вам самый быстрый или лучший внешний вид. (если вы попросите об этом).

Использование очень просто, просто набор статических методов. Простейший вариант использования:

BufferedImage scaledImage = Scalr.resize(myImage, 200);

Все операции сохраняют исходные пропорции изображения, поэтому в этом случае вы просите imgscalr изменить размер изображения в пределах ширины 200 пикселей и высоты 200 пикселей, и по умолчанию он автоматически выберет наиболее подходящий и быстрый подход для этого. так как он не был указан.

Я с самого начала понимаю, что это выглядит как самореклама (так оно и есть), но я потратил большую часть времени на поиск этой же темы и продолжал придумывать разные результаты / подходы / мысли / предложения и решил сесть и напишите простую реализацию, которая бы охватывала 80-85% сценариев использования, когда у вас есть изображение и, возможно, вам нужен его миниатюрный рисунок - либо максимально быстро, либо максимально привлекательно выглядящий (для тех, кто пробовал, вы Вы заметите создание Graphics.drawImage даже с интерполяцией BICUBIC на достаточно маленькое изображение, оно все равно выглядит как мусор).

84 голосов
/ 28 октября 2008

После загрузки изображения вы можете попробовать:

BufferedImage createResizedCopy(Image originalImage, 
            int scaledWidth, int scaledHeight, 
            boolean preserveAlpha)
    {
        System.out.println("resizing...");
        int imageType = preserveAlpha ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
        BufferedImage scaledBI = new BufferedImage(scaledWidth, scaledHeight, imageType);
        Graphics2D g = scaledBI.createGraphics();
        if (preserveAlpha) {
            g.setComposite(AlphaComposite.Src);
        }
        g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null); 
        g.dispose();
        return scaledBI;
    }
49 голосов
/ 19 февраля 2011

Thumbnailator - это библиотека для изменения размера изображений с открытым исходным кодом для Java с открытым интерфейсом, распространяемая по лицензии MIT.

Я написал эту библиотеку, потому что создание высококачественных миниатюр в Java может быть на удивление трудным, а полученный код может быть довольно грязным. С Thumbnailator можно выразить довольно сложные задачи, используя простой свободный API.

Простой пример

Для простого примера: взять изображение и изменить его размер до 100 x 100 (с сохранением соотношения сторон исходного изображения) и сохранить его в файл можно одним оператором:

Thumbnails.of("path/to/image")
    .size(100, 100)
    .toFile("path/to/thumbnail");

Продвинутый пример

Выполнение сложных задач по изменению размера упрощается благодаря свободному интерфейсу Thumbnailator.

Предположим, мы хотим сделать следующее:

  1. взять изображения в каталоге и,
  2. изменить их размер до 100 x 100 с соотношением сторон исходного изображения,
  3. сохранить их все в формате JPEG с настройками качества 0.85,
  4. где имена файлов взяты из оригинала с добавлением thumbnail. в начало

В переводе на Thumbnailator, мы сможем выполнить вышеизложенное со следующим:

Thumbnails.of(new File("path/to/directory").listFiles())
    .size(100, 100)
    .outputFormat("JPEG")
    .outputQuality(0.85)
    .toFiles(Rename.PREFIX_DOT_THUMBNAIL);

Примечание о качестве изображения и скорости

В этой библиотеке также используется метод прогрессивного билинейного масштабирования , выделенный в Filthy Rich Clients Chet Haase и Romain Guy для создания высококачественных миниатюр при обеспечении приемлемой производительности во время выполнения.

11 голосов
/ 10 февраля 2009

Вам не нужна библиотека для этого. Вы можете сделать это с самой Java.

У Криса Кэмпбелла отличная и подробная информация о масштабировании изображений - см. эту статью .

Чет Хааз и Ромэн Гай также подробно и очень информативно описывают масштабирование изображений в своей книге Грязные богатые клиенты .

10 голосов
/ 28 октября 2008

Java Advanced Imaging теперь с открытым исходным кодом и предоставляет необходимые операции.

9 голосов
/ 10 февраля 2009

Если вы имеете дело с большими изображениями или хотите получить красивый результат, в Java это не тривиальная задача. Простое выполнение с помощью операции изменения масштаба через Graphics2D не приведет к созданию высококачественного эскиза. Вы можете сделать это, используя JAI, но это требует больше работы, чем вы думаете, чтобы получить что-то, что выглядит хорошо, и у JAI есть неприятная привычка задевать вашу JVM ошибками OutOfMemory.

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

4 голосов
/ 29 июля 2009

Если на вашем компьютере установлена ​​опция imagemagick, я рекомендую im4java . Это очень тонкий уровень абстракции в интерфейсе командной строки, но он отлично справляется со своей задачей.

3 голосов
/ 18 апреля 2013

Java API не предоставляет стандартную функцию масштабирования для изображений и снижения качества изображения.

Из-за этого я пытался использовать cvResize из JavaCV, но, похоже, это вызывает проблемы.

Я нашел хорошую библиотеку для масштабирования изображения: просто добавьте зависимость для "java-image-scaling" в ваш pom.xml.

<dependency>
    <groupId>com.mortennobel</groupId>
    <artifactId>java-image-scaling</artifactId>
    <version>0.8.6</version>
</dependency>

В репозитории maven вы получите последнюю версию для этого.

Ex. В вашей Java-программе

ResampleOp resamOp = new ResampleOp(50, 40);
BufferedImage modifiedImage = resamOp.filter(originalBufferedImage, null);
2 голосов
/ 11 апреля 2011

Можно попробовать использовать Система обработки изображений GraphicsMagick с im4java в качестве интерфейса командной строки для Java.

Есть много преимуществ GraphicsMagick, но один для всех:

  • ГМ используется для обработки миллиардов файлы на самой большой в мире фотографии сайты (например, Flickr и Etsy).
1 голос
/ 15 января 2018

Оказывается, что написание полноценного скалера не тривиально. Я сделал это один раз для проекта с открытым исходным кодом: ImageScaler .

В принципе, 'java.awt.Image # getScaledInstance (int, int, int)' также справился бы с этой задачей, но с этим есть неприятная ошибка - подробности см. В моей ссылке.

...