Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11468 глав6256 карточек справочника
Дерево руководства

Глава 317 · От первого изображения до production-границы

Imagick: от первого PNG до безопасной обработки изображений

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

Сначала результат: PHP создал файл изображения, который можно открыть

Imagick нужен, когда PHP должен не просто узнать размеры картинки, а декодировать её в пиксели, изменить, собрать несколько слоёв или кадров и снова закодировать результат. Первый пример делает минимальный PNG, сохраняет его на диск и отдельно печатает проверяемый результат.

Путь изображения через программу
  1. new Imagick() создаёт пустой объект-редактор
  2. newImage создаёт холст 320 × 180 и заполняет каждый пиксель цветом
  3. setImageFormat('png') выбирает кодировщик выходного файла
  4. writeImage превращает пиксели в PNG-байты и записывает card.png
  5. методы getImage* подтверждают, что получилось
Создать первый настоящий PNG-файлПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 180, new ImagickPixel('#0f4c5c'));
$image->setImageFormat('png');

$path = __DIR__ . '/card.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось записать card.png');
}

printf(
    "%s: %dx%d %s\n",
    basename($path),
    $image->getImageWidth(),
    $image->getImageHeight(),
    $image->getImageMimeType(),
);
Ожидаемый результат
card.png: 320x180 image/png

После запуска рядом с example.php появляется card.png размером 320 × 180 пикселей. Текстовая строка проверяет имя, размеры и MIME-тип; сам PNG должен быть показан рядом с примером после визуального прогона.

Результат: тёмно-бирюзовый холст 320 × 180
Результат: тёмно-бирюзовый холст 320 × 180. Иллюстрация результата создана ImageMagick CLI; выполнение PHP Imagick пока не подтверждено.
ЗаписьЧто она означает
$imageПеременная хранит объект Imagick: текущее изображение и настройки операций.
new Imagick()Конструктор создаёт объект. Скобки показывают вызов без аргументов.
->Стрелка вызывает метод конкретного объекта слева.
320, 180Ширина и высота в пикселях; последний пиксель имеет координаты 319, 179.
throwОстанавливает неверное продолжение, если файл не записался.

Что находится внутри: файл, кадр, пиксели и кодировщик — разные вещи

СлойЧто хранитсяПочему это важно
Исходный файлСжатые JPEG/PNG/WebP/PDF-байтыРасширение имени не гарантирует содержимое и не сообщает стоимость декодирования.
Объект ImagickОдин или несколько декодированных кадров, свойства и итераторМного кадров и огромные размеры расходуют память/диск даже при маленьком файле.
ImagickPixelЦвет или ссылка на пиксель в операцииИзменение через итератор требует синхронизации строки.
ImagickDrawКоманды рисования: линии, заливка, шрифт, контурыКоманды применяются к изображению через drawImage.
Выходной кодировщикФормат, качество, профили, interlaceСначала задают формат/политику, затем получают blob или записывают файл.

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

Три зависимости: PHP-расширение, библиотека ImageMagick и кодеки/делегаты

Imagick — PECL-расширение PHP и связка с нативной библиотекой ImageMagick. Успешная установка DLL/SO ещё не обещает чтение любого формата: реальный набор определяют сборка ImageMagick, её coders и внешние delegates. Официальный PHP Manual указывает ImageMagick 6.2.4 или новее для non-Windows и отдельно отмечает, что PDF обычно требует Ghostscript.

ПроверкаНормальный результатЕсли нет
extension_loaded('imagick')true в нужном SAPIПроверить php.ini, extension_dir, TS/NTS, архитектуру и перезапуск worker.
Imagick::getVersion()Версия связанной ImageMagickDLL/SO расширения не загрузила совместимую нативную библиотеку.
Imagick::queryFormats('PNG')Непустой массивCoder не собран, запрещён policy.xml или не загрузился.
Imagick::queryFormats('PDF')Непустой массивПроверить coder policy и Ghostscript; наличие имени ещё не доказывает успешную обработку конкретного PDF.
Проверить тот PHP-процесс, который действительно обрабатывает запросПример для указанного окружения
<?php
declare(strict_types=1);

if (!extension_loaded('imagick')) {
    throw new RuntimeException('Расширение imagick не загружено в этом SAPI');
}

$png = Imagick::queryFormats('PNG') !== [];
$jpeg = Imagick::queryFormats('JPEG') !== [];

echo 'sapi: ', PHP_SAPI, "\n";
echo 'extension: imagick', "\n";
echo 'PNG: ', $png ? 'yes' : 'no', "\n";
echo 'JPEG: ', $jpeg ? 'yes' : 'no', "\n";
Ожидаемый результат
sapi: fpm-fcgi
extension: imagick
PNG: yes
JPEG: yes

Строка sapi будет другой в CLI, Apache и FPM. Пример ожидает типичный FPM-сервер; его задача — обнаружить различие окружений, а не скрыть его.

Установка без догадок: версия PHP, SAPI, ABI и ImageMagick должны совпасть

ОкружениеМинимальный путьКонтроль
Linux/macOSУстановить ImageMagick и dev headers, затем PECL imagick и запись extension в ini нужного SAPI.php --ini, php -m, phpinfo/FPM endpoint, queryFormats.
WindowsВыбрать PECL DLL под точную ветку PHP, x64/x86 и TS/NTS; php_imagick.dll положить в extension_dir, совместимые ImageMagick DLL — в PATH.Dependency/loader errors, перезапуск сервера, extension_loaded и getVersion.
КонтейнерУстанавливать пакеты и PECL в образе, а не вручную в работающем контейнере.Версии и policy.xml фиксируются Dockerfile/lock-образом.

Начиная с Imagick 3.6.0 Windows-пакеты также содержат XML-конфигурацию. Официальная инструкция предлагает %USERPROFILE%/.config/ImageMagick либо путь из MAGICK_CONFIGURE_PATH. Не переносите policy.xml вслепую: ограничения должны соответствовать тому, какие форматы, каталоги и ресурсы разрешены сервису.

Настройки php.ini: что они меняют и почему skip_version_check не лечит несовместимость

ДирективаПо умолчанию / режимПрактический смысл
imagick.locale_fixfalse, INI_ALLОбход старой проблемы рисования в locale, где десятичный разделитель — запятая.
imagick.progress_monitorfalse, INI_SYSTEMРазрешает механизм progress monitor; сам callback и его стоимость задаёт код.
imagick.skip_version_checkfalse, INI_SYSTEMТолько подавляет предупреждение о несовпадении compile/runtime ImageMagick.
Увидеть три директивы и место, где они реально прочитаныПример для указанного окружения
<?php
declare(strict_types=1);

foreach ([
    'imagick.locale_fix',
    'imagick.progress_monitor',
    'imagick.skip_version_check',
] as $name) {
    $value = ini_get($name);
    printf("%s=%s\n", $name, $value === '' ? '(empty/false)' : $value);
}

echo 'ini: ', php_ini_loaded_file() ?: '(none)', "\n";
Ожидаемый результат
imagick.locale_fix=(empty/false)
imagick.progress_monitor=(empty/false)
imagick.skip_version_check=(empty/false)
ini: /etc/php/8.5/fpm/php.ini

Путь зависит от сервера. Три false — официальные значения по умолчанию; это не рекомендация автоматически включать или выключать директиву для любого проекта.

Константы Imagick: 37 официальных семейств и 392 символа без магических чисел

Константа — подписанный вариант режима. Она не выполняет действие сама: метод читает её как фильтр, цветовое пространство, канал, правило смешивания или другой enum/flag. Ниже перечислены все символы из зафиксированной официальной страницы; числовые значения намеренно не копируются между серверами — код использует имя константы.

Выбрать фильтр и привязку по смыслу, а не по случайному числуПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick(__DIR__ . '/photo.ppm');
$image->thumbnailImage(320, 180, true, true);

$watermark = new Imagick(__DIR__ . '/watermark.ppm');
$image->compositeImage(
    $watermark,
    Imagick::COMPOSITE_OVER,
    $image->getImageWidth() - $watermark->getImageWidth() - 16,
    $image->getImageHeight() - $watermark->getImageHeight() - 16,
);

$image->setImageFormat('webp');
$image->writeImage(__DIR__ . '/preview.webp');
echo "preview.webp created\n";
Ожидаемый результат
preview.webp created

В архиве примера уже лежат маленькие текстовые photo.ppm и watermark.ppm, поэтому пример не зависит от неизвестных внешних изображений. COMPOSITE_OVER — часть публичного контракта. Целое значение константы может зависеть от версии ImageMagick, поэтому сохранять в бизнес-данных число вместо имени нельзя.

COLOR_* constants — 10 имён

Канал или компонент цвета в операциях с ImagickPixel.

Imagick::COLOR_BLACK Imagick::COLOR_BLUE Imagick::COLOR_CYAN Imagick::COLOR_GREEN Imagick::COLOR_RED Imagick::COLOR_YELLOW Imagick::COLOR_MAGENTA Imagick::COLOR_OPACITY Imagick::COLOR_ALPHA Imagick::COLOR_FUZZ

DISPOSE_* constants — 5 имён

Что делать с кадром анимации перед показом следующего.

Imagick::DISPOSE_UNRECOGNIZED Imagick::DISPOSE_UNDEFINED Imagick::DISPOSE_NONE Imagick::DISPOSE_BACKGROUND Imagick::DISPOSE_PREVIOUS

COMPOSITE_* constants — 54 имён

Как смешивать исходное изображение с холстом назначения.

Imagick::COMPOSITE_DEFAULT Imagick::COMPOSITE_UNDEFINED Imagick::COMPOSITE_NO Imagick::COMPOSITE_ADD Imagick::COMPOSITE_ATOP Imagick::COMPOSITE_BLEND Imagick::COMPOSITE_BUMPMAP Imagick::COMPOSITE_CLEAR Imagick::COMPOSITE_COLORBURN Imagick::COMPOSITE_COLORDODGE Imagick::COMPOSITE_COLORIZE Imagick::COMPOSITE_COPYBLACK Imagick::COMPOSITE_COPYBLUE Imagick::COMPOSITE_COPY Imagick::COMPOSITE_COPYCYAN Imagick::COMPOSITE_COPYGREEN Imagick::COMPOSITE_COPYMAGENTA Imagick::COMPOSITE_COPYOPACITY Imagick::COMPOSITE_COPYRED Imagick::COMPOSITE_COPYYELLOW Imagick::COMPOSITE_DARKEN Imagick::COMPOSITE_DSTATOP Imagick::COMPOSITE_DST Imagick::COMPOSITE_DSTIN Imagick::COMPOSITE_DSTOUT Imagick::COMPOSITE_DSTOVER Imagick::COMPOSITE_DIFFERENCE Imagick::COMPOSITE_DISPLACE Imagick::COMPOSITE_DISSOLVE Imagick::COMPOSITE_EXCLUSION Imagick::COMPOSITE_HARDLIGHT Imagick::COMPOSITE_HUE Imagick::COMPOSITE_IN Imagick::COMPOSITE_LIGHTEN Imagick::COMPOSITE_LUMINIZE Imagick::COMPOSITE_MINUS Imagick::COMPOSITE_MODULATE Imagick::COMPOSITE_MULTIPLY Imagick::COMPOSITE_OUT Imagick::COMPOSITE_OVER Imagick::COMPOSITE_OVERLAY Imagick::COMPOSITE_PLUS Imagick::COMPOSITE_REPLACE Imagick::COMPOSITE_SATURATE Imagick::COMPOSITE_SCREEN Imagick::COMPOSITE_SOFTLIGHT Imagick::COMPOSITE_SRCATOP Imagick::COMPOSITE_SRC Imagick::COMPOSITE_SRCIN Imagick::COMPOSITE_SRCOUT Imagick::COMPOSITE_SRCOVER Imagick::COMPOSITE_SUBTRACT Imagick::COMPOSITE_THRESHOLD Imagick::COMPOSITE_XOR

MONTAGEMODE_* constants — 3 имён

Режим сборки нескольких изображений в монтаж.

Imagick::MONTAGEMODE_FRAME Imagick::MONTAGEMODE_UNFRAME Imagick::MONTAGEMODE_CONCATENATE

STYLE_* constants — 4 имён

Стиль начертания шрифта.

Imagick::STYLE_NORMAL Imagick::STYLE_ITALIC Imagick::STYLE_OBLIQUE Imagick::STYLE_ANY

FILTER_* constants — 16 имён

Алгоритм интерполяции при изменении размера и геометрии.

Imagick::FILTER_UNDEFINED Imagick::FILTER_POINT Imagick::FILTER_BOX Imagick::FILTER_TRIANGLE Imagick::FILTER_HERMITE Imagick::FILTER_HANNING Imagick::FILTER_HAMMING Imagick::FILTER_BLACKMAN Imagick::FILTER_GAUSSIAN Imagick::FILTER_QUADRATIC Imagick::FILTER_CUBIC Imagick::FILTER_CATROM Imagick::FILTER_MITCHELL Imagick::FILTER_LANCZOS Imagick::FILTER_BESSEL Imagick::FILTER_SINC

IMGTYPE_* constants — 12 имён

Модель пикселей: bilevel, grayscale, palette, truecolor и alpha-варианты.

Imagick::IMGTYPE_UNDEFINED Imagick::IMGTYPE_BILEVEL Imagick::IMGTYPE_GRAYSCALE Imagick::IMGTYPE_GRAYSCALEMATTE Imagick::IMGTYPE_PALETTE Imagick::IMGTYPE_PALETTEMATTE Imagick::IMGTYPE_TRUECOLOR Imagick::IMGTYPE_TRUECOLORMATTE Imagick::IMGTYPE_COLORSEPARATION Imagick::IMGTYPE_COLORSEPARATIONMATTE Imagick::IMGTYPE_PALETTEBILEVELMATTE Imagick::IMGTYPE_OPTIMIZE

RESOLUTION_* constants — 3 имён

Единицы разрешения изображения.

Imagick::RESOLUTION_UNDEFINED Imagick::RESOLUTION_PIXELSPERINCH Imagick::RESOLUTION_PIXELSPERCENTIMETER

COMPRESSION_* constants — 14 имён

Кодек или схема сжатия.

Imagick::COMPRESSION_UNDEFINED Imagick::COMPRESSION_NO Imagick::COMPRESSION_BZIP Imagick::COMPRESSION_FAX Imagick::COMPRESSION_GROUP4 Imagick::COMPRESSION_JPEG Imagick::COMPRESSION_JPEG2000 Imagick::COMPRESSION_LOSSLESSJPEG Imagick::COMPRESSION_LZW Imagick::COMPRESSION_RLE Imagick::COMPRESSION_ZIP Imagick::COMPRESSION_DXT1 Imagick::COMPRESSION_DXT3 Imagick::COMPRESSION_DXT5

PAINT_* constants — 5 имён

Исторические режимы заливки и замены пикселей.

Imagick::PAINT_POINT Imagick::PAINT_REPLACE Imagick::PAINT_FLOODFILL Imagick::PAINT_FILLTOBORDER Imagick::PAINT_RESET

GRAVITY_* constants — 9 имён

Точка привязки текста, изображения или геометрии.

Imagick::GRAVITY_NORTHWEST Imagick::GRAVITY_NORTH Imagick::GRAVITY_NORTHEAST Imagick::GRAVITY_WEST Imagick::GRAVITY_CENTER Imagick::GRAVITY_EAST Imagick::GRAVITY_SOUTHWEST Imagick::GRAVITY_SOUTH Imagick::GRAVITY_SOUTHEAST

STRETCH_* constants — 9 имён

Степень растяжения шрифта.

Imagick::STRETCH_NORMAL Imagick::STRETCH_ULTRACONDENSED Imagick::STRETCH_CONDENSED Imagick::STRETCH_SEMICONDENSED Imagick::STRETCH_SEMIEXPANDED Imagick::STRETCH_EXPANDED Imagick::STRETCH_EXTRAEXPANDED Imagick::STRETCH_ULTRAEXPANDED Imagick::STRETCH_ANY

ALIGN_* constants — 4 имён

Горизонтальное выравнивание текста.

Imagick::ALIGN_UNDEFINED Imagick::ALIGN_LEFT Imagick::ALIGN_CENTER Imagick::ALIGN_RIGHT

DECORATION_* constants — 4 имён

Декорирование текста: подчёркивание, надчёркивание и зачёркивание.

Imagick::DECORATION_NO Imagick::DECORATION_UNDERLINE Imagick::DECORATION_OVERLINE Imagick::DECORATION_LINETROUGH

NOISE_* constants — 7 имён

Модель шума для добавления или подавления.

Imagick::NOISE_UNIFORM Imagick::NOISE_GAUSSIAN Imagick::NOISE_MULTIPLICATIVEGAUSSIAN Imagick::NOISE_IMPULSE Imagick::NOISE_LAPLACIAN Imagick::NOISE_POISSON Imagick::NOISE_RANDOM

CHANNEL_* constants — 15 имён

Один или несколько цветовых/alpha-каналов; многие значения образуют битовую маску.

Imagick::CHANNEL_UNDEFINED Imagick::CHANNEL_RED Imagick::CHANNEL_GRAY Imagick::CHANNEL_CYAN Imagick::CHANNEL_GREEN Imagick::CHANNEL_MAGENTA Imagick::CHANNEL_BLUE Imagick::CHANNEL_YELLOW Imagick::CHANNEL_ALPHA Imagick::CHANNEL_OPACITY Imagick::CHANNEL_MATTE Imagick::CHANNEL_BLACK Imagick::CHANNEL_INDEX Imagick::CHANNEL_ALL Imagick::CHANNEL_DEFAULT

METRIC_* constants — 6 имён

Метрика сравнения двух изображений.

Imagick::METRIC_UNDEFINED Imagick::METRIC_MEANABSOLUTEERROR Imagick::METRIC_MEANSQUAREERROR Imagick::METRIC_PEAKABSOLUTEERROR Imagick::METRIC_PEAKSIGNALTONOISERATIO Imagick::METRIC_ROOTMEANSQUAREDERROR

PIXEL_* constants — 7 имён

Порядок компонентов при импорте и экспорте массива пикселей.

Imagick::PIXEL_CHAR Imagick::PIXEL_DOUBLE Imagick::PIXEL_FLOAT Imagick::PIXEL_INTEGER Imagick::PIXEL_LONG Imagick::PIXEL_QUANTUM Imagick::PIXEL_SHORT

EVALUATE_* constants — 27 имён

Математическая операция над значениями пикселей.

Imagick::EVALUATE_UNDEFINED Imagick::EVALUATE_ADD Imagick::EVALUATE_AND Imagick::EVALUATE_DIVIDE Imagick::EVALUATE_LEFTSHIFT Imagick::EVALUATE_MAX Imagick::EVALUATE_MIN Imagick::EVALUATE_MULTIPLY Imagick::EVALUATE_OR Imagick::EVALUATE_RIGHTSHIFT Imagick::EVALUATE_SET Imagick::EVALUATE_SUBTRACT Imagick::EVALUATE_XOR Imagick::EVALUATE_POW Imagick::EVALUATE_LOG Imagick::EVALUATE_THRESHOLD Imagick::EVALUATE_THRESHOLDBLACK Imagick::EVALUATE_THRESHOLDWHITE Imagick::EVALUATE_GAUSSIANNOISE Imagick::EVALUATE_IMPULSENOISE Imagick::EVALUATE_LAPLACIANNOISE Imagick::EVALUATE_MULTIPLICATIVENOISE Imagick::EVALUATE_POISSONNOISE Imagick::EVALUATE_UNIFORMNOISE Imagick::EVALUATE_COSINE Imagick::EVALUATE_SINE Imagick::EVALUATE_ADDMODULUS

COLORSPACE_* constants — 21 имён

Цветовое пространство данных и преобразований.

Imagick::COLORSPACE_UNDEFINED Imagick::COLORSPACE_RGB Imagick::COLORSPACE_GRAY Imagick::COLORSPACE_TRANSPARENT Imagick::COLORSPACE_OHTA Imagick::COLORSPACE_LAB Imagick::COLORSPACE_XYZ Imagick::COLORSPACE_YCBCR Imagick::COLORSPACE_YCC Imagick::COLORSPACE_YIQ Imagick::COLORSPACE_YPBPR Imagick::COLORSPACE_YUV Imagick::COLORSPACE_CMYK Imagick::COLORSPACE_SRGB Imagick::COLORSPACE_HSB Imagick::COLORSPACE_HSL Imagick::COLORSPACE_HWB Imagick::COLORSPACE_REC601LUMA Imagick::COLORSPACE_REC709LUMA Imagick::COLORSPACE_LOG Imagick::COLORSPACE_CMY

VIRTUALPIXELMETHOD_* constants — 13 имён

Что считать пикселем за границей исходного холста.

Imagick::VIRTUALPIXELMETHOD_UNDEFINED Imagick::VIRTUALPIXELMETHOD_BACKGROUND Imagick::VIRTUALPIXELMETHOD_CONSTANT Imagick::VIRTUALPIXELMETHOD_EDGE Imagick::VIRTUALPIXELMETHOD_MIRROR Imagick::VIRTUALPIXELMETHOD_TILE Imagick::VIRTUALPIXELMETHOD_TRANSPARENT Imagick::VIRTUALPIXELMETHOD_MASK Imagick::VIRTUALPIXELMETHOD_BLACK Imagick::VIRTUALPIXELMETHOD_GRAY Imagick::VIRTUALPIXELMETHOD_WHITE Imagick::VIRTUALPIXELMETHOD_HORIZONTALTILE Imagick::VIRTUALPIXELMETHOD_VERTICALTILE

PREVIEW_* constants — 30 имён

Какой вариант предпросмотра эффекта сгенерировать.

Imagick::PREVIEW_UNDEFINED Imagick::PREVIEW_ROTATE Imagick::PREVIEW_SHEAR Imagick::PREVIEW_ROLL Imagick::PREVIEW_HUE Imagick::PREVIEW_SATURATION Imagick::PREVIEW_BRIGHTNESS Imagick::PREVIEW_GAMMA Imagick::PREVIEW_SPIFF Imagick::PREVIEW_DULL Imagick::PREVIEW_GRAYSCALE Imagick::PREVIEW_QUANTIZE Imagick::PREVIEW_DESPECKLE Imagick::PREVIEW_REDUCENOISE Imagick::PREVIEW_ADDNOISE Imagick::PREVIEW_SHARPEN Imagick::PREVIEW_BLUR Imagick::PREVIEW_THRESHOLD Imagick::PREVIEW_EDGEDETECT Imagick::PREVIEW_SPREAD Imagick::PREVIEW_SOLARIZE Imagick::PREVIEW_SHADE Imagick::PREVIEW_RAISE Imagick::PREVIEW_SEGMENT Imagick::PREVIEW_SWIRL Imagick::PREVIEW_IMPLODE Imagick::PREVIEW_WAVE Imagick::PREVIEW_OILPAINT Imagick::PREVIEW_CHARCOALDRAWING Imagick::PREVIEW_JPEG

RENDERINGINTENT_* constants — 5 имён

Цель преобразования между цветовыми пространствами.

Imagick::RENDERINGINTENT_UNDEFINED Imagick::RENDERINGINTENT_SATURATION Imagick::RENDERINGINTENT_PERCEPTUAL Imagick::RENDERINGINTENT_ABSOLUTE Imagick::RENDERINGINTENT_RELATIVE

INTERLACE_* constants — 8 имён

Схема чересстрочной или прогрессивной записи.

Imagick::INTERLACE_UNDEFINED Imagick::INTERLACE_NO Imagick::INTERLACE_LINE Imagick::INTERLACE_PLANE Imagick::INTERLACE_PARTITION Imagick::INTERLACE_GIF Imagick::INTERLACE_JPEG Imagick::INTERLACE_PNG

FILLRULE_* constants — 3 имён

Правило определения внутренней области пересекающегося контура.

Imagick::FILLRULE_UNDEFINED Imagick::FILLRULE_EVENODD Imagick::FILLRULE_NONZERO

PATHUNITS_* constants — 4 имён

Система координат SVG-пути и clip path.

Imagick::PATHUNITS_UNDEFINED Imagick::PATHUNITS_USERSPACE Imagick::PATHUNITS_USERSPACEONUSE Imagick::PATHUNITS_OBJECTBOUNDINGBOX

LINECAP_* constants — 4 имён

Форма окончания линии.

Imagick::LINECAP_UNDEFINED Imagick::LINECAP_BUTT Imagick::LINECAP_ROUND Imagick::LINECAP_SQUARE

LINEJOIN_* constants — 4 имён

Форма соединения двух сегментов линии.

Imagick::LINEJOIN_UNDEFINED Imagick::LINEJOIN_MITER Imagick::LINEJOIN_ROUND Imagick::LINEJOIN_BEVEL

RESOURCETYPE_* constants — 7 имён

Тип ограничиваемого ресурса ImageMagick: память, диск, время и другие.

Imagick::RESOURCETYPE_UNDEFINED Imagick::RESOURCETYPE_AREA Imagick::RESOURCETYPE_DISK Imagick::RESOURCETYPE_FILE Imagick::RESOURCETYPE_MAP Imagick::RESOURCETYPE_MEMORY Imagick::RESOURCETYPE_THREAD

LAYERMETHOD_* constants — 16 имён

Операция над слоями или кадрами последовательности.

Imagick::LAYERMETHOD_UNDEFINED Imagick::LAYERMETHOD_COALESCE Imagick::LAYERMETHOD_COMPAREANY Imagick::LAYERMETHOD_COMPARECLEAR Imagick::LAYERMETHOD_COMPAREOVERLAY Imagick::LAYERMETHOD_DISPOSE Imagick::LAYERMETHOD_OPTIMIZE Imagick::LAYERMETHOD_OPTIMIZEPLUS Imagick::LAYERMETHOD_OPTIMIZEIMAGE Imagick::LAYERMETHOD_OPTIMIZETRANS Imagick::LAYERMETHOD_REMOVEDUPS Imagick::LAYERMETHOD_REMOVEZERO Imagick::LAYERMETHOD_COMPOSITE Imagick::LAYERMETHOD_MERGE Imagick::LAYERMETHOD_FLATTEN Imagick::LAYERMETHOD_MOSAIC

ORIENTATION_* constants — 9 имён

Ориентация камеры/страницы относительно строк и столбцов.

Imagick::ORIENTATION_UNDEFINED Imagick::ORIENTATION_TOPLEFT Imagick::ORIENTATION_TOPRIGHT Imagick::ORIENTATION_BOTTOMRIGHT Imagick::ORIENTATION_BOTTOMLEFT Imagick::ORIENTATION_LEFTTOP Imagick::ORIENTATION_RIGHTTOP Imagick::ORIENTATION_RIGHTBOTTOM Imagick::ORIENTATION_LEFTBOTTOM

DISTORTION_* constants — 15 имён

Модель геометрического искажения.

Imagick::DISTORTION_UNDEFINED Imagick::DISTORTION_AFFINE Imagick::DISTORTION_AFFINEPROJECTION Imagick::DISTORTION_ARC Imagick::DISTORTION_BILINEAR Imagick::DISTORTION_PERSPECTIVE Imagick::DISTORTION_PERSPECTIVEPROJECTION Imagick::DISTORTION_SCALEROTATETRANSLATE Imagick::DISTORTION_POLYNOMIAL Imagick::DISTORTION_POLAR Imagick::DISTORTION_DEPOLAR Imagick::DISTORTION_BARREL Imagick::DISTORTION_BARRELINVERSE Imagick::DISTORTION_SHEPARDS Imagick::DISTORTION_SENTINEL

ALPHACHANNEL_* constants — 17 имён

Действие над alpha-каналом.

Imagick::ALPHACHANNEL_ACTIVATE Imagick::ALPHACHANNEL_DEACTIVATE Imagick::ALPHACHANNEL_RESET Imagick::ALPHACHANNEL_SET Imagick::ALPHACHANNEL_UNDEFINED Imagick::ALPHACHANNEL_COPY Imagick::ALPHACHANNEL_EXTRACT Imagick::ALPHACHANNEL_OPAQUE Imagick::ALPHACHANNEL_SHAPE Imagick::ALPHACHANNEL_TRANSPARENT Imagick::ALPHACHANNEL_BACKGROUND Imagick::ALPHACHANNEL_REMOVE Imagick::ALPHACHANNEL_ASSOCIATE Imagick::ALPHACHANNEL_DISSOCIATE Imagick::ALPHACHANNEL_ON Imagick::ALPHACHANNEL_OFF Imagick::ALPHACHANNEL_DISCRETE

SPARSECOLORMETHOD_* constants — 6 имён

Интерполяция цвета между разреженными контрольными точками.

Imagick::SPARSECOLORMETHOD_UNDEFINED Imagick::SPARSECOLORMETHOD_BARYCENTRIC Imagick::SPARSECOLORMETHOD_BILINEAR Imagick::SPARSECOLORMETHOD_POLYNOMIAL Imagick::SPARSECOLORMETHOD_SPEPARDS Imagick::SPARSECOLORMETHOD_VORONOI

FUNCTION_* constants — 3 имён

Функция, применяемая к значениям пикселей.

Imagick::FUNCTION_UNDEFINED Imagick::FUNCTION_POLYNOMIAL Imagick::FUNCTION_SINUSOID

INTERPOLATE_* constants — 9 имён

Интерполяция при чтении значения между соседними пикселями.

Imagick::INTERPOLATE_UNDEFINED Imagick::INTERPOLATE_AVERAGE Imagick::INTERPOLATE_BICUBIC Imagick::INTERPOLATE_BILINEAR Imagick::INTERPOLATE_FILTER Imagick::INTERPOLATE_INTEGER Imagick::INTERPOLATE_MESH Imagick::INTERPOLATE_NEARESTNEIGHBOR Imagick::INTERPOLATE_SPLINE

DITHERMETHOD_* constants — 4 имён

Алгоритм дизеринга при уменьшении числа цветов.

Imagick::DITHERMETHOD_UNDEFINED Imagick::DITHERMETHOD_NO Imagick::DITHERMETHOD_RIEMERSMA Imagick::DITHERMETHOD_FLOYDSTEINBERG

Пять реальных маршрутов: превью, пакет, отражение, текст и анимация

ЗадачаЧто меняетсяЧто обязательно проверить
Миниатюра товараОдин кадр уменьшается с сохранением пропорцийОриентация, итоговые размеры, формат, качество, размер файла.
Каталог фотографийОдинаковая операция применяется к набору файловОшибку одного файла не скрывать; уникальные имена и отдельный каталог результата.
Отражение/водяной знакКлон, flip/gradient и композиция слоёвAlpha, compose operator, позиции и освобождение временных изображений.
Текст/логотипImagickDraw хранит стиль и команды рисованияНаличие шрифта, кодировка, метрики, лицензия и fallback.
Анимированный GIFМеняется каждый кадр последовательностиcoalesce, delay/dispose, page geometry, writeImages(true), лимит кадров.

Официальная страница Basic usage показывает эти направления. Здесь они превращены в маршрут: сначала один проверяемый файл, затем коллекция, композиция и многокадровый формат. Подробные карточки методов будут ссылаться обратно на эти задачи.

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

У первого примера одна ответственность: из файла получить проверенное превью. Второй добавляет перебор и локальную обработку ошибки. Третий объясняет, почему многокадровое изображение нельзя обрабатывать как единственный PNG.

Сделать превью без искажения пропорций и проверить результатПример для указанного окружения
<?php
declare(strict_types=1);

$sourcePath = __DIR__ . '/product.jpg';
$targetPath = __DIR__ . '/product-preview.jpg';

$image = new Imagick($sourcePath);
$image->setIteratorIndex(0);
$image->thumbnailImage(320, 180, true, true);
$image->setImageFormat('jpeg');
$image->setImageCompressionQuality(82);
$image->stripImage();

if (!$image->writeImage($targetPath)) {
    throw new RuntimeException('Превью не записано');
}

printf(
    "%dx%d, %d bytes\n",
    $image->getImageWidth(),
    $image->getImageHeight(),
    filesize($targetPath),
);

Перед запуском скачайте исходный product.jpg по ссылке ниже и положите рядом с example.php. Ожидаемая форма строки: 320x180, N bytes; N — фактически измеренный размер результата. Он зависит от исходных пикселей и версии кодировщика. Откройте product-preview.jpg: должна появиться копия товара 320 × 180. Нативное выполнение PHP Imagick пока не подтверждено.

Превью товара 320 × 180
Превью товара 320 × 180. Иллюстрация результата создана ImageMagick CLI; выполнение PHP Imagick пока не подтверждено.

Скачать проверочный product.jpg. Положите файл рядом с example.php под именем product.jpg перед запуском.

Обработать каталог так, чтобы один битый файл не скрыл остальные результатыПример для указанного окружения
<?php
declare(strict_types=1);

$sourceDir = __DIR__ . '/incoming';
$targetDir = __DIR__ . '/previews';
if (!is_dir($targetDir) && !mkdir($targetDir, 0775, true) && !is_dir($targetDir)) {
    throw new RuntimeException('Не удалось создать каталог previews');
}

foreach (glob($sourceDir . '/*.{jpg,jpeg,png,ppm}', GLOB_BRACE) ?: [] as $path) {
    try {
        $image = new Imagick($path);
        $image->setIteratorIndex(0);
        $image->thumbnailImage(320, 180, true, true);
        $image->setImageFormat('webp');
        $target = $targetDir . '/' . pathinfo($path, PATHINFO_FILENAME) . '.webp';
        $image->writeImage($target);
        echo basename($path), " -> ", basename($target), "\n";
    } catch (ImagickException $error) {
        fwrite(STDERR, basename($path) . ': ' . $error->getMessage() . "\n");
    }
}
Ожидаемый результат
chair.ppm -> chair.webp
lamp.ppm -> lamp.webp

В архиве примера каталог incoming уже содержит два небольших PPM-файла, поэтому перебор даёт показанные две строки. В production collision одинаковых имён из разных каталогов решают ID товара или хешем, а не молча перезаписывают файл. Ошибки пишут в журнал с идентификатором задания.

Уменьшить все кадры GIF, сохранив анимациюПример для указанного окружения
<?php
declare(strict_types=1);

$seed = new Imagick();
$colors = ['#0f4c5c', '#176373', '#1d7884', '#278d91', '#45a39b', '#69b3a2', '#92c7ad', '#f4b860'];
foreach ($colors as $color) {
    $frame = new Imagick();
    $frame->newImage(240, 240, new ImagickPixel($color), 'gif');
    $frame->setImageDelay(12);
    $frame->setImageDispose(Imagick::DISPOSE_BACKGROUND);
    if (!$seed->addImage($frame)) {
        throw new RuntimeException('Кадр не добавлен');
    }
    $frame->clear();
}
$seed->setFirstIterator();
$seed->setImageIterations(0);

$animation = $seed->coalesceImages();
$seed->clear();

foreach ($animation as $frame) {
    $frame->thumbnailImage(120, 120, true, true);
    $frame->setImagePage(120, 120, 0, 0);
    $frame->setImageFormat('gif');
}

$result = $animation->deconstructImages();
$animation->clear();
if (!$result->writeImages(__DIR__ . '/status-small.gif', true)) {
    throw new RuntimeException('Анимация не записана');
}

echo 'frames: ', $result->getNumberImages(), "\n";
$result->clear();
Ожидаемый результат
frames: 8

Восемь исходных кадров создаются в самом примере, поэтому внешний status.gif не нужен. coalesce разворачивает кадры, deconstruct снова ищет различия, а writeImages(..., true) записывает всю последовательность. До чтения пользовательского GIF всё равно ограничивают число кадров, размеры, память, диск и время.

Уменьшенная анимация, 8 кадров
Уменьшенная анимация, 8 кадров. Иллюстрация результата создана ImageMagick CLI; выполнение PHP Imagick пока не подтверждено.

ImagickException: чтение, преобразование, кодирование и запись основного изображения

ImagickException наследуется от Exception. Она относится к операциям основного объекта Imagick: декодированию, фильтрам, геометрии, кадрам и записи.

Перехватывайте этот тип там, где приложение действительно умеет восстановиться: пометить входной файл непригодным, выбрать разрешённый fallback или повторить отдельное задание после исправления зависимости. Сообщение исключения записывайте в журнал, а посетителю отдавайте безопасное объяснение без путей сервера.

Отличить понятную ошибку изображения от неожиданной ошибки приложенияПример для указанного окружения
<?php
declare(strict_types=1);

function makePreview(string $source, string $target): void
{
    try {
        $image = new Imagick($source);
        $image->thumbnailImage(320, 180, true, true);
        $image->setImageFormat('webp');

        if (!$image->writeImage($target)) {
            throw new RuntimeException('Файл результата не записан');
        }
    } catch (ImagickException $error) {
        throw new DomainException('Изображение не удалось прочитать или обработать', 0, $error);
    }
}

try {
    makePreview(__DIR__ . '/broken.jpg', __DIR__ . '/preview.webp');
} catch (DomainException $error) {
    echo $error->getMessage(), "\n";
}
Ожидаемый результат
Изображение не удалось прочитать или обработать

Внешний слой получает понятную ошибку задачи, а previous сохраняет исходную ImagickException для журнала. Перехват Throwable вокруг всего сайта скрыл бы программные ошибки и не является заменой точной границы.

ImagickDrawException: ошибка команд рисования, шрифта, контура или стиля

ImagickDrawException наследуется от Exception. Она отделяет сбой команд ImagickDraw от декодирования исходного изображения.

Перехватывайте этот тип там, где приложение действительно умеет восстановиться: заменить отсутствующий шрифт, отклонить неверный путь/геометрию или построить упрощённый водяной знак. Сообщение исключения записывайте в журнал, а посетителю отдавайте безопасное объяснение без путей сервера.

Практический пример: товарное превью успешно прочиталось, но выбранный TTF отсутствует. Можно записать предупреждение и создать превью без подписи; повторно читать исходник и маскировать проблему пустым catch не нужно.

ImagickKernelException: неверная матрица свёртки или встроенное ядро

ImagickKernelException наследуется от Exception. Класс относится к ImagickKernel: матрицам для convolution/morphology и операциям над ядрами.

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

Матрицу из формы нельзя сразу передавать в fromMatrix: сначала проверяют прямоугольность, числовые значения, допустимый размер и бюджет вычислений. Даже корректная матрица может быть слишком дорогой для публичного сервиса.

ImagickPixelException: цвет нельзя разобрать или применить

ImagickPixelException наследуется от Exception. Она возникает на границе цвета и операций ImagickPixel.

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

Для поля цвета проще принять строгий формат #RRGGBB, проверить его до Imagick и только затем создавать ImagickPixel. Это делает сообщение понятным, но catch всё равно остаётся последней защитой от различий парсера цвета.

ImagickPixelIteratorException: ошибка обхода строк и области пикселей

ImagickPixelIteratorException наследуется от Exception. Она относится к созданию, позиционированию и синхронизации ImagickPixelIterator.

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

После изменения пикселей строки вызывают syncIterator(). Но ручной обход миллионов пикселей из PHP часто медленнее готовой операции ImageMagick; сначала ищите фильтр, evaluate, level, color matrix или morphology с тем же смыслом.

Публичная загрузка: маленький файл способен развернуться в огромные пиксели

Отсеять неподходящий файл до дорогой обработки пикселейПример для указанного окружения
<?php
declare(strict_types=1);

$path = __DIR__ . '/product.jpg';
$mime = (new finfo(FILEINFO_MIME_TYPE))->file($path);
$allowed = ['image/jpeg', 'image/png', 'image/webp'];
if (!in_array($mime, $allowed, true)) {
    throw new DomainException('Формат изображения не разрешён');
}

$probe = new Imagick();
$probe->pingImage($path);
$width = $probe->getImageWidth();
$height = $probe->getImageHeight();
$frames = $probe->getNumberImages();

if ($width < 1 || $height < 1 || $width > 8000 || $height > 8000 || $frames > 32) {
    throw new DomainException('Размер или число кадров превышает лимит');
}

printf("accepted: %dx%d, frames %d\n", $width, $height, $frames);
Ожидаемый результат
accepted: 1600x900, frames 1

Используется тот же проверочный product.jpg 1600 × 900, который можно скачать под примером. Это обычный локальный файл для воспроизводимой проверки, а не имитация успешной HTTP-загрузки: реальный обработчик отдельно проверяет upload error и is_uploaded_file/move_uploaded_file. pingImage читает метаданные дешевле полного decode, но не является полной защитой. Лимиты policy.xml продолжают действовать во время настоящего чтения и преобразования.

Скачать проверочный product.jpg. Положите файл рядом с example.php под именем product.jpg перед запуском.

До полного decodeВо время обработкиПеред публикацией
Лимит HTTP/файла; MIME по содержимому; ping размеров/кадров; allowlist форматов.ImageMagick policy.xml: width/height/area/list-length/memory/map/disk/time; отдельный worker и каталог.Явный формат; удаление опасных профилей по политике; размеры/байты; атомарное перемещение; права файла.
Не доверять расширению и пользовательскому пути.Не включать запрещённый coder только ради одного файла; диагностировать delegate/policy отдельно.Не отдавать неполный файл после исключения и не раскрывать системный путь в HTTP-ответе.

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

Что проверено сейчас и что нельзя выдавать за PHP Imagick runtime pass

Эта Stage 3-заготовка написана по зафиксированному официальному дереву и XML PHP Manual. Текущий локальный PHP 8.5.11 не загружает imagick, поэтому примеры этого пакета должны получить syntax/lint-статус, пока совместимое расширение не установлено в отдельном контролируемом runtime.

  • ImageMagick CLI может подтвердить конкретные выходные пиксели и пригоден для отдельного visual manifest.
  • CLI-проверка не доказывает, что тот же код выполнился через PHP Imagick.
  • До интеграции все 518 API-карточек, ссылки на них, архивы примеров и визуальные продукты проходят собственные точные проверки.
  • Эта глава не публикуется отдельно и не меняет общий статус готовности руководства.
Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.