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

Дерево руководства
Глава 317 · От первого изображения до production-границы
Imagick: от первого PNG до безопасной обработки изображений
Начальный маршрут полного справочника Imagick: реальный выходной файл, устройство объекта, установка, форматы, конфигурация, все семейства констант, основные сценарии и точные границы исключений.
Сначала результат: PHP создал файл изображения, который можно открыть
Imagick нужен, когда PHP должен не просто узнать размеры картинки, а декодировать её в пиксели, изменить, собрать несколько слоёв или кадров и снова закодировать результат. Первый пример делает минимальный PNG, сохраняет его на диск и отдельно печатает проверяемый результат.
new Imagick()создаёт пустой объект-редакторnewImageсоздаёт холст 320 × 180 и заполняет каждый пиксель цветомsetImageFormat('png')выбирает кодировщик выходного файлаwriteImageпревращает пиксели в PNG-байты и записывает card.png- методы
getImage*подтверждают, что получилось
<?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 должен быть показан рядом с примером после визуального прогона.

| Запись | Что она означает |
|---|---|
$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() | Версия связанной ImageMagick | DLL/SO расширения не загрузила совместимую нативную библиотеку. |
Imagick::queryFormats('PNG') | Непустой массив | Coder не собран, запрещён policy.xml или не загрузился. |
Imagick::queryFormats('PDF') | Непустой массив | Проверить coder policy и Ghostscript; наличие имени ещё не доказывает успешную обработку конкретного PDF. |
<?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_fix | false, INI_ALL | Обход старой проблемы рисования в locale, где десятичный разделитель — запятая. |
imagick.progress_monitor | false, INI_SYSTEM | Разрешает механизм progress monitor; сам callback и его стоимость задаёт код. |
imagick.skip_version_check | false, 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 пока не подтверждено.

Скачать проверочный 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 товара или хешем, а не молча перезаписывают файл. Ошибки пишут в журнал с идентификатором задания.
<?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 всё равно ограничивают число кадров, размеры, память, диск и время.

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-карточек, ссылки на них, архивы примеров и визуальные продукты проходят собственные точные проверки.
- Эта глава не публикуется отдельно и не меняет общий статус готовности руководства.
Источники и обсуждения
- PHP Manual: Image Processing (ImageMagick)
- PHP Manual: The ImagickDrawException class
- PHP Manual: The ImagickException class
- PHP Manual: The ImagickKernelException class
- PHP Manual: The ImagickPixelException class
- PHP Manual: The ImagickPixelIteratorException class
- PHP Manual: Runtime Configuration
- PHP Manual: Predefined Constants
- PHP Manual: Examples
- PHP Manual: Basic usage
- PHP Manual: Installation
- PHP Manual: Requirements
- PHP Manual: Installing/Configuring
- ImageMagick: Security Policy
- ImageMagick: supported formats and delegates
- ImageMagick: resource limits
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


