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

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

Ответы [ 16 ]

1 голос
/ 04 августа 2016

Просто используйте ответ Буркхарда, но добавьте эту строку после создания графики:

    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

Вы также можете установить значение BICUBIC, оно будет производить изображение лучшего качества, но это более дорогая операция. Есть и другие подсказки рендеринга, которые вы можете установить, но я обнаружил, что интерполяция дает наиболее заметный эффект. Имейте в виду, что если вы хотите увеличить масштаб, java-код, скорее всего, будет очень медленным. Я считаю, что большие изображения начинают давать задержку около 300%, даже если все подсказки рендеринга настроены для оптимизации скорости и качества.

1 голос
/ 12 марта 2012

Вы можете использовать Marvin (чистая среда обработки изображений Java) для таких операций: http://marvinproject.sourceforge.net

Плагин Scale: http://marvinproject.sourceforge.net/en/plugins/scale.html

1 голос
/ 02 сентября 2011

Image Magick уже упоминалось. Существует интерфейсный проект JNI под названием JMagick. Это не особо стабильный проект (а сама Image Magick, как известно, сильно менялась и даже нарушала совместимость). Тем не менее, у нас был хороший опыт использования JMagick и совместимой версии Image Magick в производственной среде для выполнения масштабирования с высокой пропускной способностью и низкой задержкой. Скорость была значительно выше, чем у всей библиотеки Java-графики, которую мы ранее пробовали.

http://www.jmagick.org/index.html

0 голосов
/ 14 мая 2016

Если вы не хотите импортировать imgScalr , как @Riyad Kalla ответ выше, который я проверял, тоже отлично работает, вы можете сделать это взято из Ответ Питера Уолсера @Peter Walser по другому вопросу:

 /**
     * utility method to get an icon from the resources of this class
     * @param name the name of the icon
     * @return the icon, or null if the icon wasn't found.
     */
    public Icon getIcon(String name) {
        Icon icon = null;
        URL url = null;
        ImageIcon imgicon = null;
        BufferedImage scaledImage = null;
        try {
            url = getClass().getResource(name);

            icon = new ImageIcon(url);
            if (icon == null) {
                System.out.println("Couldn't find " + url);
            }

            BufferedImage bi = new BufferedImage(
                    icon.getIconWidth(),
                    icon.getIconHeight(),
                    BufferedImage.TYPE_INT_RGB);
            Graphics g = bi.createGraphics();
            // paint the Icon to the BufferedImage.
            icon.paintIcon(null, g, 0,0);
            g.dispose();

            bi = resizeImage(bi,30,30);
            scaledImage = bi;// or replace with this line Scalr.resize(bi, 30,30);
            imgicon = new ImageIcon(scaledImage);

        } catch (Exception e) {
            System.out.println("Couldn't find " + getClass().getName() + "/" + name);
            e.printStackTrace();
        }
        return imgicon;
    }

 public static BufferedImage resizeImage (BufferedImage image, int areaWidth, int areaHeight) {
        float scaleX = (float) areaWidth / image.getWidth();
        float scaleY = (float) areaHeight / image.getHeight();
        float scale = Math.min(scaleX, scaleY);
        int w = Math.round(image.getWidth() * scale);
        int h = Math.round(image.getHeight() * scale);

        int type = image.getTransparency() == Transparency.OPAQUE ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;

        boolean scaleDown = scale < 1;

        if (scaleDown) {
            // multi-pass bilinear div 2
            int currentW = image.getWidth();
            int currentH = image.getHeight();
            BufferedImage resized = image;
            while (currentW > w || currentH > h) {
                currentW = Math.max(w, currentW / 2);
                currentH = Math.max(h, currentH / 2);

                BufferedImage temp = new BufferedImage(currentW, currentH, type);
                Graphics2D g2 = temp.createGraphics();
                g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                g2.drawImage(resized, 0, 0, currentW, currentH, null);
                g2.dispose();
                resized = temp;
            }
            return resized;
        } else {
            Object hint = scale > 2 ? RenderingHints.VALUE_INTERPOLATION_BICUBIC : RenderingHints.VALUE_INTERPOLATION_BILINEAR;

            BufferedImage resized = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = resized.createGraphics();
            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
            g2.drawImage(image, 0, 0, w, h, null);
            g2.dispose();
            return resized;
        }
    }
0 голосов
/ 04 декабря 2014

Вы можете использовать следующий популярный продукт: thumbnailator

0 голосов
/ 26 февраля 2012

Я разработал решение со свободно доступными классами (AnimatedGifEncoder, GifDecoder и LWZEncoder), доступными для обработки анимации GIF.
Вы можете скачать jgifcode jar и запустить класс GifImageUtil. Ссылка: http://www.jgifcode.com

...