Оптимизация изображений без потерь

Smush.IT™ на локальном компьютере

Внимание: в данной статье описывается скрипт оптимизации изображений для . Если вы ищите программу для оптимизации изображений для Windows, то это PictureBeaver.

Один из советов по ускорению загрузки сайта, который даёт Yahoo! Exceptional Performance Team — это оптимизация изображений. Оптимизация без потерь (рассматриваться будет именно она) позволяет уменьшить размер изображений (временами очень даже значительно) и за счёт этого уменьшить общее время, требуемое для загрузки страницы.

Уменьшение размера изображения без потери качества достигается рядом способов:

  • использование другого алгоритма сжатия данных либо использование более агрессивных параметров (как правило, чем выше степень сжатия, тем больше времени уходит на сжатие);
  • удаление информационных блоков, наличие или отсутствие которых не влияет на декодирование изображения;
  • оптимизация цветов (например, если изображение сохранено в формате PNG32 — 4 байта на пиксель, но реально используются только 16 цветов — 4 бита на пиксель, то оптимизация цветов (color reduction) позволит значительно уменьшить размер файла).

Yahoo! предоставляет бесплатный сервис Yahoo! Smush.it™, который позволяет оптимизировать графику в онлайн-режиме, но его использование не всегда удобно. Гораздо удобнее, когда всё можно сделать на своём компьютере.

Нам понадобятся:

  • gifsicle для оптимизации GIF-изображений и анимаций;
  • optipng для оптимального сжатия PNG-файлов (что достигается путём перебора множества параметров, влияющих на работу алгоритма сжатия);
  • pngcrush для удаления лишних блоков из PNG-файла. Как и optipng, pngcrush умеет определять оптимальные параметры сжатия (optipng — это форк pngcrush), но, как показали тесты, у optipng это получается чуть лучше;
  • jpegtran позволяет выполнять преобразования без потерь над файлами JPEG (в частности, удаление лишних информационных блоков и перестраивание данных — коэффициентов дискретно-косинусного преобразования);
  • ImageMagick для определения формата изображений;
  • AdvanceCOMP позволяет достичь лучших результатов сжатия PNG-файлов, благодаря использованию реализации 7-Zip Defalte.

Весь этот зоопарк в дистрибутивах , основанных на Debian, устанавливается так:

[-]
View Code Bash
sudo apt-get install advancecomp gifsicle optipng libjpeg-progs imagemagick pngcrush

Затем загружаем этот скрипт:

[-]
#! /bin/sh

if [ -z "$1" ]; then
    echo "Usage: optimize-image.sh filename"
    exit 1;
fi

if [ ! -f "$1" ]; then
    echo "$1 is not a file"
    exit 1;
fi

TYPE=`identify "$1" | grep -E -o 'JPEG|GIF|PNG'`
OLD=`stat -c %s "$1"`

case "$TYPE" in
    JPEG)
        jpegtran -copy none -optimize -perfect -progressive -outfile "$1.tmp" "$1"
        jpegtran -copy none -optimize -perfect -outfile "$1.tmq" "$1"
        if [ -f "$1.tmp" -a -f "$1.tmq" ]; then
            S_PROG=`stat -c %s "$1.tmp"`
            S_NORM=`stat -c %s "$1.tmq"`
            if [ $S_PROG -ge $S_NORM ]; then
                mv -f "$1.tmq" "$1"
                rm -f "$1.tmp"
            else
                mv -f "$1.tmp" "$1"
                rm -f "$1.tmq"
            fi;
        fi
    ;;

    GIF)
        gifsicle -O2 -b "$1"
    ;;

    PNG)
        pngcrush -q -rem alla -fix "$1" "$1.tmp"
        if [ -f "$1.tmp" ]; then
            mv -f "$1.tmp" "$1"
        fi;
        optipng -zc6-9 -zm1-9 -zs0-3 -f0-5 -q -fix "$1"
        advpng -z -4 -q "$1"
    ;;
esac

NEW=`stat -c %s "$1"`
echo "$1, old size: $OLD, new size: $NEW"

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

Для JPEG-файлов пробуется два разных способа кодирования: Progressive (низкочастотные коэффициенты находятся в начале файла) и обычное кодирование. В зависимости от изображение, Progressive JPEG может быть меньшим по размеру, чем non-progressive JPEG и наоборот.

Из PNG-файлов удаляются все лишние информационные блоки, после чего выполняется поиск оптимального варианта сжатия. Файл, сжатый optipng, обрабатывается advpng, который, в ряде случаев, позволяет достичь еще большего коэффициента сжатия.

GIF-файлы обрабатываются только gifsicle, я не добавлял код, который бы преобразовывал GIF в PNG и проверял, что лучше (так как в этом случае пришлось бы руками исправлять все ссылки на GIF-файл и заменять их ссылками на PNG).

Пример использования:

[-]
View Code Bash
find -type f \( -name "*.png" -o -name "*.gif" -o -name "*.jpg" -o -name "*.JPG" \) -exec optimize-image.sh '{}' \;

Внимание, перед использованием скрипта не забываем о необходимости резервного копирования! Хотя скрипт и тестировался в боевых условиях, осторожность никто не отменял.

Добавить в закладки

Связанные записи

Автор: Vladimir; опубликовано в: Linux; метки: Linux, оптимизация, сжатие
28
Ноя
2009

RSS Комментарии к статье «Оптимизация изображений без потерь» (4)  »

  1. Много интересного :) У меня есть похожая (хотя и не настолько продвинутая) штука для винды.

  2. dvigatelpr

    Картинки реально быстрее грузятся

  3. Скрипт действительно работает! И качество оптимизации нисколько не хуже чем Smush.it, причем в отличие от последнего можно запускать на произвольное количество вложенных каталогов сразу. 1000 файлов обрабатывается ~ за 5 минут, на средненькой машинке с ubuntu 8.04

Оставить комментарий к записи «Оптимизация изображений без потерь»

Вы должны быть авторизованы, чтобы иметь возможность оставить комментарий.

Подписаться, не комментируя