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

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, при запуске с двумя она обрабатывает первый файл, вычищает из него мусор и помещает результат во второй файл.

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

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).

Пишите!