Структура и формат файла Photoshop. Часть 3: Image Resources Section

2012-02-14 papirosnik Photoshop

Продолжая описывать внутреннее устройство psd файла, едва успев начать, мы вдруг подобрались к самой его середине, к третьей секции (напомню, всего их пять). Этот блок хотя и носит многообещающее название (Image Resources), самой картинки всё ещё не содержит. Здесь содержится различная информация, относящаяся как к psd в целом, так и к отдельным слоям. Финальная картинка целиком содержится в пятой секции, при условии, что файл сохранялся в режиме максимальной совместимости. Но гораздо больший интерес представляет четвёртый блок, в котором собственно и хранятся изображения каждого канала в каждом слое. Но чтобы добраться до четвёртой части, надо пройти третью. Звучит банально, и выполнить это можно также банально.

Итак, третья секция в psd файле имеет такой же простой формат, как и две предыдущих. Первые четыре байта указывают на её длину (не забывайте пр BigEndian!). Ну и следующие N-байт — собственно сам блок данных, размер которого мы только что прочитали. Причём в документации утверждается, что и эта секция может быть опущена, т.е. состоять только из 4-х нулевых байт длины. И даже если там есть данные, то всё-равно их можно безболезненно игнорировать. Лично я не стал рисковать, и разобрал каждый блок в этой секции, но практической пользы мне в будущем это не дало. Эта информация для получения изображения и  экспорта слоёв не понадобилась. Но описать, как и что здесь хранится, стоит.
После того, как мы прочитали длину этой секции, имеет смысл запомнить то место, где начинается следующая, четвёртая секция. Т.е., если мы мы прочитали длину в переменную Len, и наша текущая позиция чтения сейчас есть CurPos, то следующая секция начнётся по адресу: TargetPos = CurPos + Len.
Чтобы целиком пропустить эту секцию, делаем CurPos = TargetPos, если же мы хотим её разбирать, то углубляемся далее.
Сразу же после четырёх байт длины начинаются данные, которые имеют  такую структуру.

Блок ресурсов изображения
Длина Описание
4 Сигнатура: ‘8BIM’
2 Уникальный идентификатор ресурса.
Перемен. Имя: Pascal строка, расширенная так, чтобы её размер был чётным. Пустая строка будет состоять из двух нулевых байт.
4 Актуальный размер данных, которые следуют сразу же ниже
Перемен. Данные ресурса. Для каждого ресурса данные имеют свой формат. Размер этого блока выровнен на границу чётного адреса.

Это примерный перевод из официального документа. Значит, читаем первые 4 байта, сравниваем их с 0x4D494238 (8BIM); если не совпали символы — материмся и крушим программу, иначе всё ок, идём дальше.
Читаем след. два байта (BigEndian!) — это будет ID ресурса. Сохраняем его в структуре ImageResource и читаем следующий байт — это будет длина имени  (хорошо что биты хоть не надо переводить в LittleEndian).
Назовём это число N. Далее читаем N символов строки. И если наша позиция в файле (или индекс в буфере) откуда мы читаем, получилась нечётная, то сдвигаем её на один байт вперёд. Это и есть выравнивание на чётную границу. У меня в коде это сделано так: index += index & 1;
Когда мы получили имя ресурса, то следующие четыре прочитанных байта составят его длину (Тут я напоминаю про BigEndian в последний раз). Прочитав длину и затем блок данных заданного размера, мы выйдем на след. ресурсный блок, который снова начинается с сигнатуры 8BIM. Если мы дочитались до конца блока (CurPos == TargetPos, см. выше), всё — секция закончена.
Повторюсь, практической пользы эта секция лично мне не принесла никакой. По ID каждого ресурсного блока я установил, какая здесь информация хранится и не нашёл куда её применять. Приводить здесь все возможные значения ID  не стану. Можно лишь отметить, что этот номер лежит в диапазоне от 1000 (Dec) до 10000 (опять же Dec). Поэтому, если Вы не педант (в плохом смысле этого слова) и не пишите свой фотошоп, можете целиком пропускать эту секцию и приступать к самой информативной и полезной,  четвёртой секции  psd, котороая носит название «Layer and Mask Information Section«.

О ней — в следующей статье этого цикла.

psd,

One Response to “Структура и формат файла Photoshop. Часть 3: Image Resources Section”


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

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

Powered by WordPress. Designed by elogi.