PHP для полиграфии: автоматическая подготовка фото к печати

Как с помощью PHP и Imagick обработать сотни товарных фото для каталога: поворот по EXIF, конвертация в CMYK, обрезка под формат и условная обработка снимков. Примеры и подводные камни.

Когда в типографию приходит заказ на каталог из двухсот товаров, каждый предмет нужно сфотографировать, обрезать, перевести в CMYK, выставить резкость и вписать в единый шаблон. Ручная обработка такого объёма занимает дни — и неизбежно плывут поля, съезжают цветовые профили. PHP с расширениями GD и Imagick позволяет написать скрипт, который выполнит все эти операции за несколько минут, причём с учётом разных условий: для глянцевой бумаги — один профиль, для матовой — другой, для круглых наклеек — обтравка по контуру, для еврофлаеров — обрезка под формат A6.

Зачем вообще PHP в подготовке фото к печати

Большинство дизайнеров сидят в Photoshop или Capture One, но пакетная обработка в этих программах требует однотипных действий. Если у вас сто снимков с разным фоном, разной ориентацией и разным разрешением, вручную настраивать экшены для каждого — тот же ручной труд. PHP-скрипт, запущенный из командной строки или через веб-интерфейс, может сам проверить размеры, ориентацию, наличие цветового профиля и принять решение: повернуть, обрезать, конвертировать, наложить метки. Это и есть «условное фото» (conditional photo) — когда программа анализирует исходник и выбирает алгоритм обработки в зависимости от его свойств.

Что нужно для работы: библиотеки и окружение

На сервере или локальной машине должны быть установлены:

  • PHP 7.4+ (рекомендуется 8.x для производительности);
  • GD — встроенная библиотека для базовых операций (изменение размера, обрезка, наложение текста);
  • Imagick — обёртка над ImageMagick, даёт полноценную работу с цветовыми профилями, ICC, CMYK, высоким битрейтом;
  • Exif — для чтения метаданных (ориентация камеры, дата, фокусное расстояние).

Установка через composer обычно не требуется, достаточно подключить соответствующие модули в php.ini. В среде Linux это делается командами apt install php-gd php-imagick.

Типовые задачи, которые решает скрипт

Рассмотрим несколько сценариев, актуальных именно для полиграфии.

1. Автоматический поворот по EXIF

Современные камеры и смартфоны записывают ориентацию в метаданные, но не поворачивают сам пиксельный массив. При открытии в браузере фото выглядит нормально, а при печати — перевёрнутым. Скрипт читает тег Orientation и доворачивает изображение средствами Imagick:

$image = new Imagick($source);
$orientation = $image->getImageOrientation();
switch($orientation) {
    case Imagick::ORIENTATION_ROTATE_90:
        $image->rotateImage('#000', 90);
        break;
    // ... остальные случаи
}
$image->setImageOrientation(Imagick::ORIENTATION_TOPLEFT);
$image->writeImage($output);

2. Конвертация в CMYK с правильным профилем

Для офсетной печати фото должно быть в CMYK. Но не все исходники содержат встроенный профиль. PHP может проверить наличие ICC и, если профиля нет, назначить sRGB, а затем конвертировать в выбранный профиль (например, ISO Coated v2). При этом нужно учесть, что для разных видов бумаги используются разные профили. Скрипт может брать название заказа из имени папки и подставлять соответствующий профиль.

3. Обрезка под формат с учётом полей вылета

Для листовок евроформата (210×99 мм) или круглых наклеек часто требуется задать размер с выпусками. Скрипт вычисляет соотношение сторон, центрирует изображение и добавляет поля заданного цвета (обычно белого). Если исходник уже близок к нужному кадрированию, программа может не обрезать, а только добавить выпуски — это и есть условное ветвление.

Пример: подготовка фото для каталога сувенирной продукции

Представьте, что вы получили 150 снимков кружек, ручек и блокнотов. Каждый снят на белом фоне, но размеры разные. Требуется:

  1. Удалить фон (или заменить на чисто белый, если фон серый);
  2. Привести все изображения к ширине 800 px (высота пропорционально);
  3. Добавить тень (drop shadow) для объёма;
  4. Сохранить в CMYK с профилем FOGRA39.

PHP-скрипт с Imagick может выполнить всё это за один проход. Ключевой момент — проверка, является ли фон уже белым (по гистограмме угловых пикселей). Если да — пропускаем удаление фона, чтобы не внести артефакты. Это и есть «условное фото».

скрипт обрабатывает снимки кружек для каталога, автоматически удаляя фон

Важные ограничения и подводные камни

PHP не умеет «понимать» изображение — он работает с пикселями. Любая автоматическая обтравка сложных объектов (волосы, прозрачные предметы) даёт посредственный результат. Для такой задачи лучше использовать специализированные инструменты (например, remove.bg API), а PHP-скрипт только интегрирует их. Кроме того, не стоит забывать про кэш: если скрипт запускается многократно, нужно проверять, не обработано ли уже фото, иначе вы рискуете перезаписать готовый файл.

Ещё один момент — управление памятью. Imagick по умолчанию загружает всё изображение в RAM. Для фото с разрешением 600 DPI и размером 40×60 см это может превысить лимит. Стоит установить $image->setResourceLimit(Imagick::RESOURCETYPE_MEMORY, 256) и использовать временные файлы на диске.

Интеграция с рабочим процессом типографии

Готовый PHP-скрипт можно повесить на веб-форму, куда дизайнер загружает архив с фото, а на выходе получает готовые файлы для вёрстки. Либо использовать его как часть конвейера при подготовке макетов наклеек — например, перед тем как отправить файл на резку, скрипт проверяет соответствие DPI и цветовой модели. Подробнее о том, как учесть технологию печати при подготовке макетов, мы разбирали в статье «Дизайн наклеек: как учесть технологию печати и не получить брак».

Практический совет напоследок

Прежде чем запускать скрипт на всём тираже, возьмите пять-семь репрезентативных снимков — с разным освещением, разной ориентацией и разным фоном. Прогоните их через PHP и проверьте каждый результат в Adobe Acrobat или на пробной печати. Только после этого обрабатывайте весь массив. Это сэкономит вам часы, а не сломает тираж.