Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Сжатие картинок

Вчера попробовал натравить инструменты для оптимизации картинок на свой каталог с картинками этого блога. Результат следующий: выигрыш составил около 10 процентов (больше всего у меня JPEG-файлов). Немного, но и не мало в некоторых ситуациях. Я использовал только утилиты для командной строки.

PNG. Для сжатия PNG использовался известнейший pngcrush. Интересен в режиме «brute force» (перебора), где перебираются комбинации фильтров (фильтры — это специализированные методы сжатия, например, для градиента и т. д.). Я запускал сделующим образом: «pngcrush -brute -fix -e .png1 *.png». В итоге, все файлы png у меня в папке получают свою оптимизированную копию с расширением png1. Есть опасный момент — если у вас есть файлы APNG, pngcrush их превратит в файл без анимации. Экономия получилась порядка 7%.

JPEG. В JPEG’e особо оптимизировать нечего, формат сжатия с потерями, поэтому оптимизацию без участия человека не произвести — трудно просчитать насколько критично изменился рисунок. Оптимизировать тут нечего, но можно убрать мусор — многие программы записывают в файл комментарии, лишнюю информацию. Я использовал для чистки PureJPEG, после него прошёлся своим Photoshop Crap Remover, чтобы дочистить файл. Формат запуска PureJPEG следующий: «dir /B /S /A-D *.jpg | purejpeg», в итоге все файлы с расширением jpg будут вычищены. Моя утилита написана на PHP, так что я даже не буду упоминать как её запустить — кому надо разберётся, остальным объяснить очень трудно. Экономия — около 10%.

GIF. Несмотря на то, что утилите GIFLite уже около 12 лет, мне она кажется лидером по переупаковке GIF. Утилита написана White River Software, её разработка начата ещё в 1992 году и она рабоатет под DOS, т. е. должна запускаться даже в Linux из-под какого-нибудь DOSEmu. Утилита платная, но кому платить уже непонятно — никаких координат этой фирмы в сети нет. Поэтому ищем любой ключ, запускаем giflite с ключём /R и «регистрируемся».

Запускать её сложнее, чем предыдущие — в 1992-м году длинных имён не было, да и перебирать свои методы она не умеет. Поэтому я написал небольшую batch-программу. Она проходит по всем GIF-файлам в папке, применяет на каждый один из четырёх методов (видимо выбирается какая-то стратегия для выбора словаря в LZW-сжатии), после чего выбирает файл с наименьшим размером. Экономия составила около 8%.

giflite.cmd:

@ECHO OFF
REM Написал Евгений «BOLK» Степанищев. 2007.

MKDIR GIFLITE.$$$ 2>nul

REM Основной цикл обработки файлов GIF
FOR /R %%N IN (*.gif) DO @CALL :method %%N

REM Удаляем весь мусор, который мог остаться
DEL /Q giflite.tmp 2>nul
RMDIR /S /Q GIFLITE.$$$
EXIT

:method
REM Перебираем методы
FOR %%M IN (0 1 2 3) DO @CALL :giflite %%M %%~s1 %1

REM Сортируем полученное по размеру и забираем последний (наименьший) файл
FOR /F "usebackq skip=3" %%R IN (`DIR /B /O-S GIFLITE.$$$`) DO @CALL :getresult %%R %1
GOTO :EOF

:getresult
REM Переписываем файл на место прежнего, удаляем мусор
MOVE /Y GIFLITE.$$$%1 %2
DEL /Q GIFLITE.$$$*.*
GOTO :EOF

:giflite
REM Запускаем преобразование
GIFLITE.EXE -t -h -m%1 -o %2 GIFLITE.$$$%1 >nul 2>nul

12 комментариев
victorgr.livejournal.com 2007

Есть ещё optipng. Давно пользуюсь им вместо pngcrush.

Делает то же самое, только параметры так: optipng -full filename.png (то есть, пишет оптимизированную версию в тот же файл).

Не знаю, есть ли для Win32.

А вот PureJPEG хочу найти под Linux.

Евгений Степанищев (bolknote.ru) 2007

Под Linux возьми мой PCR, там же PHP запускается, а делают они примерно то же самое. OptiPNG — fork от pngcrush, надо его посмотреть, версия для Windows есть.

Евгений Степанищев (bolknote.ru) 2007

Оказывается, даже форк. Посмотрю.

Евгений Степанищев (bolknote.ru) 2007

Тьфу :) «Даже не форк» конечно же :)

Евгений Степанищев (bolknote.ru) 2007

Да, смотрю оно как-то покруче работает, по крайней мере, на трёх файлах, что я ему скормил. Но ключ не -full, а -o7.

maksim-nayman.moikrug.ru 2007

а как же pngout?

Евгений Степанищев (bolknote.ru) 2007

А чем оно лучше аналогов?

Евгений Степанищев (bolknote.ru) 2007

Сравнение программа сжатия PNG:

http://www.twilightuniverse.com/articles/2003/09/ping/

Евгений Степанищев (bolknote.ru) 2007

А тут вообще предлагают пользоваться сразу двумя:

http://cssing.org.ua/2004/08/14/pngcrush-pngout/

indeyets.livejournal.com 2007

как минимум, есть ещё jpeg2000 и jpeg-progressive… а на самом деле встречаются и вариации кодировщиков дающие несколько разное качество сжатия на выходе

Евгений Степанищев (bolknote.ru) 2007

JPEG2000 не показывается ни одним браузером, кроме тех, что на движке WebCore >= 412 (т. е. Safari, например). Так что его нет.

Кроме того, если взять сжатие с потерями и сжать снова, то получим новые потери.

aduchi.livejournal.com 2007