Pull to refresh

PSD parser или как разобрать файл Photoshop на Java

Reading time2 min
Views8.3K
Как-то предложили сделать парсер psd файла. Вроде бы очень просто. Надо найти из каких слоёв состоит документ, вывести перечень слоёв. Если слой текстовый, вывести текст и параметры форматирования. Т.е. названия шрифтов, размеры, отступы и т.д.

С чего начать? Да поможет нам гугл. Море информации, куча подробностей как делать плагины для фотошопа. Но это всё не то. Нужна консольная программа, которая будет получать на вход psd файлы и выдавать на выходе текстовое описание его внутренностей. Установка фотошопа изначально не планировалась.

Самым полезным оказался вот этот документ: PhotoshopFileFormat — собственно спецификация структуры файла photoshop. Эдакий побайтный скелет .psd файла, как раз то, что доктор прописал.

Далее погуглил на предмет того, а делали ли что либо подобное коллеги на java? Да, оказывается и такое есть. Parser-psd — краткое описание + исходники там же. Их программа разбирает файл на слои, причём сохраняет их в отдельные файлы(!) плюс добывается информация по нарезке(slices). Для моей задачи немного не то, но как начальный пример очень даже помог.

Файл загоняется в обычный поток DataInputStream in = new DataInputStream(input) и далее работаем с этим потоком побайтно.

Сам файл состоит из пяти основных секций:
1. File header
2. Color mode data
3. Image resources
4. Layer and mask information
5. Image data

header имеет фиксированный размер, а вот остальные блоки могут иметь разный размер. С этим повнимательнее. Один байт мимо и всё дело накроется. Размер указывается в первых четырёх байтах блока, поэтому блоки можно проскакивать, если всё парсить не надо in.skipBytes(size).

Тут главное внимание и чёткое следование спецификации. Внимание! От версии к версии формат меняется, в спецификации эти различия указываются. Однако текущая спецификация, которую мне удалось найти от 2010 года, а мне пришлось пользоваться ещё более старым описанием за 2007й год. Поэтому при разборе самых свежих версий файлов можно промахнуться.
Tags:
Hubs:
Total votes 21: ↑4 and ↓17-13
Comments8

Articles