Метка: image

  • Уменьшение изображения на Java

    Довольно рутинная операция. Есть несколько способов.
    Возьмём исходное изображение:

    1. Самый простой.

    Первый на stackoverflow.
    Суть метода очень проста – создаем BufferedImage меньшего размера, затем прорисовываем в него исходное изображение.
    Далее сохраняем обычным ImageIO.write()

            BufferedImage scaled = new BufferedImage(scaledWidth, scaledHeight,
                    BufferedImage.TYPE_INT_RGB);
            Graphics2D g = scaled.createGraphics();
            g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);
            g.dispose();
    
            ImageIO.write(scaled, "JPEG", new File("1.jpg"));

    Результат:

    Недостатки:
    – Алгоритм сжатия хоть и быстрый, но результат неприятный.
    – Реализация сохранения JPEG ImageIO по-умолчанию не радует.

    2. Улучшаем качество JPEG-картинки.

    Для этого делаем так:

       /* код приведён только в учебных целях! не использовать в продакшн */
       public static void saveAsJPEG(BufferedImage scaledImage, OutputStream out) throws IOException {
    
            ImageTypeSpecifier type = ImageTypeSpecifier.createFromRenderedImage(scaledImage);
            Iterator iter = ImageIO.getImageWriters(type, "JPEG");
            // берем первый попавшийся для JPEG
            ImageWriter writer = (ImageWriter) iter.next();
            ImageOutputStream ios = ImageIO.createImageOutputStream(out);
            writer.setOutput(ios);
    
            JPEGImageWriteParam iwparam = new JPEGImageWriteParam(Locale.getDefault());
            iwparam.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
            // Вот здесь выкручиваем качество на максимум!
            iwparam.setCompressionQuality(1.0F);
            IIOImage iioimage = new IIOImage(scaledImage, null, null);
            writer.write(null, iioimage, iwparam);
            ios.flush();
            writer.dispose();
            ios.close();
        }

    Результат:

    Недостатки:
    – Сильно вырастает размер файла. Это известный баг. Подробности здесь: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5028259.
    – Алгоритм уменьшения картинки всё равно оставляет желать лучшего.

    3. Используем хинты.

    У Graphics2D есть так называемые RenderingHints, которые позволяют улучшить качество относительно настроек по умолчанию:

    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
    RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    g.setRenderingHint(RenderingHints.KEY_RENDERING,
    RenderingHints.VALUE_RENDER_QUALITY);
    

    Результат:

    Недостатки:
    Качество стало лучше, но не сильно.

    4. Уменьшаем постепенно.

    Суть алгоритма – сжимать не сразу, а в несколько итераций.
    Код можно посмотреть здесь: http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html (очень позновательная и интересная статья, подробно расписано про уменьшение размера картинок).

    Результат:

    5. Метод из JDK 1.1.

    Впринципе также можно воспользоваться методом из JDK 1.1:
    Image.getScaledInstance(width,height, Image.SCALE_SMOOTH)

    Image scaled = originalImage.getScaledInstance(scaledWidth,
                    scaledHeight, Image.SCALE_SMOOTH);
    g.drawImage(scaled, 0, 0, null);
    g.dispose();

    Результат:

    Недостатки:
    Реализация метода может различаться на конкретных платформах.

  • Desktop wallpaper в качестве инструмента проверки браузера под различным разрешением

    Используем обои для рабочего стола

    У моего монитора разрешение 1680×1050, а в работе иногда нужно время от времени смотреть как будет выглядеть содержимое браузер например под разрешением 1024×768 или 1280×800.

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

    Инструмент готов к использованию. Конечно это не так радует глаз как какая-нибудь супрематическая конструкция, но зато вполне утилитарно. Теперь для того, чтобы быстро проверить верстку в 1024×768 — подгоняем размер браузера под нужный прямоугольник и смотрим.

    При желании можно поместить в свободное пространство какую-нибудь приятную вам картинку. Я поместил Дюка (жавный маскот с красным носом). Он сейчас стал опенсорснутым, то есть вы его можете свободно (т.е. на халяву и безболезненно) использовать в различных целях. Например выкладывать в блогах и на своих веб страничках. Подробнее можно прочитать в “Open Source Duke”.

    Сами картинки с Дюком можно взять здесь.

  • изменение размера картинок

    mogrify -resize 640 *.jpg
    mogrify -resize x768 *.jpg
    mogrify -resize 30% *.jpg

    P.S.: Про изменение размеров картин в Java.