Оптимизация изображений без потерь
Smush.IT™ на локальном компьютере
Внимание: в данной статье описывается скрипт оптимизации изображений для Linux. Если вы ищите программу для оптимизации изображений для 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.
Весь этот зоопарк в дистрибутивах Linux, основанных на Debian, устанавливается так:
Затем загружаем этот скрипт:
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).
Пример использования:
Внимание, перед использованием скрипта не забываем о необходимости резервного копирования! Хотя скрипт и тестировался в боевых условиях, осторожность никто не отменял.
Связанные записи
Автор: Vladimir; опубликовано в: Linux; метки: Linux, оптимизация, сжатиеНоя
2009


Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.






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