Photoshop's Crap Remover

Хочу сказать «спасибо» Спектатору — именно с его подачи я вчера попал на сайт «ПОтребитель», где прочёл статью «Куда ведёт нас Photoshop…». Статью рекомендую прочитать, хотя кое-что из того, что в ней изложено спорно, тем не менее, она мне показалась интересной.

Более всего меня заинтересовали эксперименты автора с картинками в формате JPEG/JFIF, сохранёнными из Photoshop’а. Автор утверждает, что после нехитрых манипуляций, ему удавалось сократить размер картинки на 4-6КБ — якобы Photoshop сохраняет в файле кучу никому, кроме него, ненужной информации.

Мне захотелось выяснить так ли это, попытаться автоматизировать процесс избавления от мусора и, заодно, разобраться в природе «нехитрых манипуляций». Более всего они походили на шаманство, ибо, по моему убеждению (почитайте статью), относительно бинарного формата нельзя давать такие рекомендации — «искать текстовую строку, это вырезать, а вот это нужно приклеить сюда».

В считанные секунды я нашел то, что меня интересовало — предельно сжатое описание формата JPEG/JFIF и занялся изучением.

Небольшое отступление касаемо аббревиатуры «JFIF». JPEG — очень широкий стандарт, JFIF же является одной из его реализаций. Честно говоря, я вообще ничего не знаю о других реализациях, но уверен, что они существуют. Как бы то ни было, Photoshop сохраняет файлы именно в формате JFIF.

Дополнение: JPEG является алгоритмом сжатия, формат файлов, сжатых по алгоритму JPEG принято называть JFIF (JPEG File Interchange Format). Есть, например, TIFF/JPEG (TIFF 6.0) — формат TIFF, сжатие по алгоритму JPEG.

Узнать JFIF-файлы очень просто — они всегда начинаются с сигнатуры JFIF в секции APP0, что следует за секцией SOI (Start Of Image), т. е. сразу после сигнатуры JPEG-файла. Все эти магические слова означают следующее — JFIF-файл всегда начинается с сигнатуры 0xFF, 0xD8, 0xFF, 0xE0, <два байта длины>, JFIF, 0x00.

JPEG, как контейнер, устроен достаточно просто — секции, называемые сегментами, их длины и содержимое. Помимо всего прочего, среди сегментов определены 16 «сегментов приложения» (APPx) и один сегмент комментария (COM). Сегмент APP0 занят форматом JFIF, как служебный, остальные 15 разрешено использовать приложениям для своих целей.

Вот именно в них Photoshop (и другие программы тоже) помещает свои данные. Например, в сегменте APP2 Photoshop хранит собственный цветовой профиль, в APP13 — некоторые установки, например, установки печати. Кажется в сегменте JFIF (APP0) может хранится пиктограмма предварительного просмотра, но мне не удалось найти ни одного файла с такой пиктограммой, чтобы произвести эксперименты по очистке файла от неё, если вам попадется файл с длинной секции APP0 хотя бы в пару сотен байт, не поленитесь, пришлите его мне.

Итак сама программа. Назвал я её незатейливо — «Photoshop’s Crap Remover» (PCR). Написана она на PHP и должна, в принципе, работать и под Unix-like и под Windows-системами. Скачать её можно у меня — 1,5КБ в архиве. Программа распространяется бесплатно для жителей России и территории бывшего СССР. Естественно запрещается использовать программу в коммерческих целях.

Если запустить программу без параметров, она даст краткие сведения о себе и своих параметрах, которых у неё негусто — при запуске с одним параметром программа в качестве выходного файла использует местный null, при запуске с двумя она обрабатывает первый файл, вычищает из него мусор и помещает результат во второй файл.

Проще говоря, программу следует запускать с двумя параметрами, если вы хотите насладиться результатом её работы — в качестве первого параметра указывается имя файла, который нужно подвергнуть обработки, в качестве второго — имя файла, куда будет помещен результат. Одно и тоже имя файла два раза указать нельзя — файл просто затрётся.

Терминал: скрипт pcr.php удаляет метаданные из JPEG (APP13, APP2, COM, APP14), копирует ffdb, ffc0, ffc4, fffa, удалено 6722 байта.
Photoshop’s crap remover

Опыт показывает, что более всего ненужной простому пользователю информации помещает в файл Photoshop 5.0 — после обработки его детищ детища эти действительно уменьшаются на 4—7КБ, Photoshop 7.0, для сравнения, помещает в файл всего 30—50 байт.

Под занавес две простенькие программки на Shell, облегчающие жизнь. Под Windows, естественно, работать не будут, но и под ними несложно придумать что-нибудь подобное.

# Посмотреть как изменится размер файлов в текущем каталоге, если обработать их PCR.
for file in *.jpg ; do ./pcr.php $file /dev/null; done

# Обработать все JPEG'и в текущем каталоге.
for file in *.jpg
do
    ./pcr.php $file /tmp/tmp_delete_me.jpg&gt;/dev/null
    mv -f /tmp/tmp_delete_me.jpg $file
done

Photoshop’s Crap Remover … Скачать … . 1,5КБ в архиве.

Дополнение (от 17:46): Вышла версия 1.10, исправлена текстовая опечатка в названии сегмента, PCR научился вырезать preview, если он расположен в отдельном сегменте APP0.

Дополнение (от 18:07): Вышла версия 1.20, теперь я полностью вычищаю еще и сегмент APP0, как оказалось от этого совершенно никто не страдает — ни программы просмотра, ни браузеры, а кроме того, теперь PCR работает, как с JPEG/JFIF, так и JPEG/EXIF.

Дополнение (от 5/10/2002): Вышла версия 1.22, исправлены опечатки. Спасибо alexander (ap at mail.kuzbass.net).