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 (12Kb)


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

17 сентября 2002 12:30

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML: