Структура и формат файла Photoshop или Что внутри psd?

2011-03-24 papirosnik Photoshop

Этим стулом мастер Гамбс начинает новую коллекцию… Нет, не так.
Эта статья открывает новый цикл статей, призванных раскрыть внутренности формата фотошоповского документа, разобрать его структуру, научиться парсить и экспортировать данные. Для чего это может понадобиться — вам решать. Мне понадобилось, и, нарушая главный принцип программирования «Откопал сам — передай лопату другому», передаю не лопату, а сразу откопанное. Основным источником знаний служил оригинальный документ Photoshop File Format.pdf. Оригинальность его заключается главным образом не в том, что он добыт из недр самого Adobe, но в том, каким оригинальным способом пришлось это делать.

На удивление, на просторах рунета оказалось мизер информации о внутренней структуре файла формата psd. Тот мизер, котрый удавалось добыть, носил весьма поверхностный характер и при малейшем затрудненнии отпрвлял к оригинальной документации, которую можно было там же и скачать по давно умершим ссылкам.

Основная же ценность той информации заключалась в том, что она утверждала о существовании официального документа от Adobe, описывающего формат psd. Но даже официальный сайт Adobe на первый взгляд помогает мало. Там  тоже этого файла в досутпном для скачивания виде не наблюдается. Не буду лишать вас этого удовольствия  и раскрывать сразу весь интресный процесс получения файла, скажу только что зарегистрировавшись и послав заявку на файл, обосновав его необходимость для вас, клятвенно пообещав не использовать его в интересах мирового терроризма, вы его в конце концов получите. Но радости испытаете при этом мало, так как оказывается этот формат дико запутанный, весь в каких-то заплатках, затычках и прочих хаках, нагроможденных за время его эволюции (по крайней мере так показалось мне) — и описание его соответствующее. Поэтому без опытного гида погружение в дебри внутренностей psd может оказать пагубное влияние на ваш мозг. С целью спасти несколько индивидов рода человеческого (в т.ч.  и лично вас, dear reader) от поломки головного мозга и пишется этот цикл статей. Так что миссия посерьёзнее, чем у мастера Гамбса.

На первый взгляд всё не так страшно. Есть файл. Подразумевается что данные в нём как-то упорядочены. Порядок есть  организации в соответствии с некоторой структурой (согласие есть продут при полном непротивлении сторон.. 🙂  цитата, кто не помнит, из «12-ти стульев»). Что же касается наших стульев (файлов формата psd), которые мы тоже будем, как Остап с Кисой, препарировать… то раз есть структура, конечно же её можно описать. Из описания для меня лично удивителным оказалось то, что форматов файла фотошопа на самом деле два. Первый, известный всем — psd. Как расшифровывается эта аббревиатура — официальный документ не раскрывает, поэтому остаётся только догадываться и/или гуглить. Гугл предложит вам на выбор несколько тысяч страниц вариантов, среди которых: Спектральная плотность мощности, Позиционно-чувствительный детектор, Партия Социалистическо-демократическая, Портативные устройства хранения, Секретные Данные о Пестицидах и т.п.,  а также много разъяснений, что также называется и формат файлов фотошопа:).  Из всего многообразия лично мне понравился вариант на странице №стопицот: PSD означает просто PhotoShop Document. Правда пока я к этой странице, содержащей такую страшную тайну, добрался, то и так уже чётко знал, что означает эта аббревиатура. Потому как других варинатов просто не оставалось.

Второй вариант формата файла фотошопа носит в официальном документе название Large Document Format, но имеет при этом расширение не .LDF, а .PSB (на OC Windows) или 8BPS (Mac OS). Пытаться расшифровывать эти аббревиатуры при помощи гугла — дело гиблое, поэтому просто заметьте в этой аббревиатуре те же буквы PS, а насчёт B… — для меня слова Big и Large — синонимы. Да фик с ними, с аббревиатурами, справделиво заметите вы, и я соглашусь. Обсуждаем мы всё таки внутреннне устройство, а не внешнеее наименование фотошоповских файлов. Поэтому запомните только одну вещь, которую нагло утверждает официальный документ от Adobe. Файлы формата .PSB (или 8BPS) имеют такую же структуру, как и .PSD, но призваны хранить данные большого объёма. Поэтому разница в них выражается только в разрядности некотороых полей.  То есть там, где для .PSD хватает и двух байт, большой .BPS и его яблочный брат требуют четыре, где обычный .PSD обходится байтом — те обжоры требуют два и т.д. Но это утверждение справедливо не для всех полей, а для избранных. По ходу объяснения я их буду отмечать особо. И от себя хочу добавить, что различие между форматами состоит не только в разрядности. Есть ещё ряд моментов, о которых позже.

Следующий нюанс, котрый надо выжечь автогеном в подкорке головного мозга тому, кто будет парсить псд-файл, заключается в том,  что все числа хранятся в BigEndian формате. Может для кого-то это и обычное дело, а мне, родившемуся вместе с Intel (шутка) и взрослевшему вместе с MS DOS и Windows, пришлось туго, привыкая к чужим порядкам. Это всё равно как правше сейчас привыкать писать левой рукой. Ладно, муки привыкания отставим в стороону. По существу, в psd-файле все числа хранятся так: от старшего по значимости  байта к младшему. Это кардинальным образом отличается о той религии, которую исповедует Intel. Те парни утверждают, что по младшему адресу должен находится наименее значащий байт, а чем старше — тем значительнее он становится. Их холивар — это их дело, мы должны безропотно принимать всё как есть и просто  помнить об этом.

Псд-файл состоит из пяти секций. Первая, как это ни удивительно, носит название File Header, что можно перевести как набалдашник файла. Следующая — Color Mode Data (не мудрствуя лукаво давайте будем считать что это — данные цветовых режимов). Треться часть — Image Resources. Четвёртая секция: — Layer and Mask Information, и последняя — Image Data.

Первая секция (File Header) имеет фиксированную длину, остальные — переменную. Загловок начинается сразу же с 1-го (нулевого) байта. Знаете, разобрав этот запутанный формат, я теперь удивляюсь этому факту. Достаточно изучив логику создателей фромата, я больше готов теперь к тому, что заголовк должен состоять из двух частей, причём одна должна быть в середине, а другая как раз в конце файла. Это вполне  бы соответствовало духу формата.
Ладно, проехали. Заголовок имееет длину в 26 байт,  каждый последующий раздел (а равно и подраздел) имеет поле, указывающее на его размер. То есть, для того чтобы прочитать какую-либо секцию, вы уже будете иметь предварительно считанный её размер в байтах. Таким образом, встертив где-либо в описании поле Length (длина), знайте, что оно показывает число байт к чтению, а не штук, записей, метров или ещё чего-то. Ещё одно соглашение, оговоренное сразу же в официальном документе гласит, что все поля, объявленные как Unicode String, предваряются 4-х байтовых полем длины строки, а сами её элементы состоят из двух байт на символ. Хотя не уверен, что это заявление соответствует действительности, так как там достаточно намешано строк разных стилей: тут тебе и Pascal-строки, и Z-buffered строки — и просто массивы символов, длину которых надо вычислять по каким-то косвенным признакам. Но не отчаивайтесь. Я прошёл этот путь от первого до последнего байта — и вы сможете.

Думается, что для затравки (т.е. в рамках введения в цикл статей) общей информации достаточно, конкрентые детали будут последовательно раскрываться в последующих статьях на эту тему. А пока просто опишу те 26 байт, котрые гордо носят своё название: File Header. Чтобы вы начинали привыкать к философии разработчиков формата, привожу точный перевод описания заголовка, без комментариев.

Длина Описание
4 Сигнатура, всегда должна быть ‘8BPS‘. Не пытайтесь читать файл, если сигнатура не соответствует этому значению.
2 Версия: всегда равна 1. Не пыьайтесь читать файл, если версия не соответсвует этому значению
(в ***PSB*** версия равна 2).
6 Зарезервировано: должно быть 0.
2 Число каналов в изображении., включая альфа-каналы. Поддерживается диапазон от 1 до 56.
4 Высота изображения в пикселах. Поддерживается диапазон от 1 до 30 тыщ.
(в ***PSB*** максимум триста тыщ).
4 Ширна изображения в пикселах. Поддерживается диапазон от 1 до 30 000
(в ***PSB*** максимум 300 000).
2 Глубина: число бит на канал. Допустимые значения — 1, 8, 16, 32.
2 Цветовой режим файла: Допустимые значения для Bitmap = 0, для Grayscale = 1, для Indexed = 2, RGB = 3, CMYK = 4, Multichannel = 7, Duotone = 8, Lab = 9.

Хоть и обещал не комментировать, но не могу сдержаться. Про первые две строчки таблицы действительно промолчу. А вот на 5-ю и 6-ю хочу обратить внимание. Я не опечатался. В отличие от всех остальных файлов, форматов, описаний, традиций, принципов и т.п., где сперва идёт ширина, а затем высота, в Adobe решили что это не правильно и самое время ломать стереотипы. Здесь вначале указана высота, затем ширина. Этот пример хорошо демонстрирует, что бдительность при парсинге psd файла нельзя терять ни на секунду, полагаться на имеющиеся опыт и здравый смысл не следует.

Это только преамбула. Амбула впереди.

psd,

2 комментария to “Структура и формат файла Photoshop или Что внутри psd?”


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Powered by WordPress. Designed by elogi.