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

Дерево руководства
Глава 404 · После переменных, объектов и первого PNG
Gmagick: полный каталог констант и понятные рецепты обработки
Имена режимов вместо случайных чисел; фильтры, смешивание, глубина PNG, interlace, проверка настроек и собственная мини-галерея.
Именованный режим: сделать серую версию карточки
Для сайта нужна серая версия цветной карточки: например, показать товар в неактивном состоянии и отдельно сравнить читаемость без цвета. На выходе будет настоящий PNG 360 × 240: мелкая сетка, круг и градиент сохранят форму, но станут серыми. Начнём с одной настройки изображения; проверки и служебные функции появляются только в полном примере ниже.


- constants-target.ppm: цветная сетка и круг, 360 × 240.
- Gmagick::IMGTYPE_GRAYSCALE выбирает преобразование в серое.
- setImageType меняет пиксельное представление объекта.
- writeImage создаёт отдельный PNG; исходник остаётся цветным.
$image = new Gmagick(__DIR__ . '/constants-target.ppm');
$image->setImageType(Gmagick::IMGTYPE_GRAYSCALE);
$image->setImageFormat('PNG');
$image->setImageDepth(8);
$image->writeImage(__DIR__ . '/gm104-constants-named-gray.png');new Gmagick читает подготовленный входной файл; $image хранит объект с пикселями. -> вызывает его метод. В круглых скобках передаётся выбранный режим. Gmagick::IMGTYPE_GRAYSCALE — именованная константа класса: после :: стоит имя неизменяемого значения, кавычки и $ не нужны. Она обозначает оттенки серого, а не имя метода. Вызывать её отдельно нечего: это аргумент setImageType. В сравнении с голой цифрой имя позволяет понять намерение кода. setImageFormat выбирает PNG-кодировщик, setImageDepth — 8 бит на компонент, writeImage записывает файл рядом с программой. __DIR__ обозначает каталог текущего PHP-файла; исходник не перезаписывается. Setter возвращает объект, но здесь цепочка разбита на строки, чтобы видеть порядок.
<?php
declare(strict_types=1);
require __DIR__ . '/gm104-constants-fixture.php';
gmRestore();
$image = new Gmagick(__DIR__ . '/constants-target.ppm');
gmPng($image, 'gm104-constants-named-source.png');
$image->setImageType(Gmagick::IMGTYPE_GRAYSCALE);
$image->setImageFormat('PNG');
$image->setImageDepth(8);
$image->writeImage(__DIR__ . '/gm104-constants-named-gray.png');
$gray = new Gmagick(__DIR__ . '/gm104-constants-named-gray.png');
$allGray = true;
foreach ($gray->getImageHistogram() as $pixel) {
$r = $pixel->getColorValue(Gmagick::COLOR_RED);
$g = $pixel->getColorValue(Gmagick::COLOR_GREEN);
$b = $pixel->getColorValue(Gmagick::COLOR_BLUE);
$allGray = $allGray && abs($r - $g) < 0.00001 && abs($g - $b) < 0.00001;
}
$checks = [
'gray_channels_equal' => $allGray,
'image_size_preserved' => $gray->getImageWidth() === 360 && $gray->getImageHeight() === 240
];
gmReport('gm104-constants-named', ["gmagick.setimagetype", "gmagick.getimagehistogram", "gmagick.writeimage"], ["gm104-constants-named-source.png", "gm104-constants-named-gray.png"], $checks, $errors ?? [], ['constant' => 'Gmagick::IMGTYPE_GRAYSCALE', 'value' => Gmagick::IMGTYPE_GRAYSCALE]);
echo "gm104-constants-named-gray.png: 360x240; all RGB channels equal\n";
Ожидаемый результат
gm104-constants-named-gray.png: 360x240; all RGB channels equal
Самостоятельный запуск: распакуйте архив и выполните php example.php с Gmagick. Включены собственный 16-битный PPM в base64, SHA256 и gm104-constants-fixture.php. Helper восстанавливает вход, сохраняет копии PNG и metrics.json; он не относится к стандартному API PHP. Короткий фрагмент операции показан выше, полный код создаёт все перечисленные результаты. Настройки подтверждаются сохранёнными файлами.
Перед кодом показаны оба реально сохранённых изображения. Полный пример дополнительно читает серый PNG, проверяет равенство R/G/B у всех цветов гистограммы и прежние размеры. Это проверяет действие, а не только успешный вызов. Серая версия сама по себе не объясняет статус товара людям, которые не различают цвет: добавьте текст «недоступен». Для настоящего управления цветом и печати нужна работа с профилями, а не одно название Gray. Упражнение: заменить IMGTYPE_GRAYSCALE на IMGTYPE_TRUECOLOR. Тогда получится полноцветный вариант, и проверка равенства каналов перестанет быть подходящим ожиданием — требование и проверка должны измениться вместе.
Опорные понятия: объект и метод, константы PHP, аргументы и return, независимая копия через clone.
Все константы по 28 категориям: смысл, значение и доступность
Ниже сохранены все 28 групп и 274 имени официальной страницы. Для каждого — назначение и значение именно нашей проверенной сборки PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16. Из официального перечня 238 имён определены и 36 отсутствуют. Это снимок доступности, а не обещание всех функций на любом сервере. Числа показываются для диагностики; в рабочих рецептах используйте имена.
if (defined("Gmagick::FILTER_LANCZOS")) {
$filter = constant("Gmagick::FILTER_LANCZOS");
}defined получает строку с полным именем и безопасно возвращает bool. constant читает значение только после проверки. Прямое Gmagick::НЕСУЩЕСТВУЮЩЕЕ_ИМЯ вызовет Error. Одинаковое число в двух группах не разрешает подменять аргумент одного назначения другим. Цветовой канал, правило смешивания и фильтр масштабирования решают разные задачи.
Компоненты цвета — 10 констант
GmagickPixel::getColorValue и setColorValue выбирают одну компоненту; это не битовая маска CHANNEL_*. Alpha и opacity направлены противоположно; нужную шкалу уточняйте у конкретного метода.
Связанный разбор: Компоненты GmagickPixel.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::COLOR_BLACK | Определена; int 11 | Чёрная компонента K модели CMYK. |
Gmagick::COLOR_BLUE | Определена; int 12 | Синяя компонента RGB. |
Gmagick::COLOR_CYAN | Определена; int 13 | Голубая компонента C модели CMYK. |
Gmagick::COLOR_GREEN | Определена; int 14 | Зелёная компонента RGB. |
Gmagick::COLOR_RED | Определена; int 15 | Красная компонента RGB. |
Gmagick::COLOR_YELLOW | Определена; int 16 | Жёлтая компонента Y модели CMYK. |
Gmagick::COLOR_MAGENTA | Определена; int 17 | Пурпурная компонента M модели CMYK. |
Gmagick::COLOR_OPACITY | Определена; int 18 | Непрозрачность в шкале opacity GraphicsMagick; направление отличается от alpha. |
Gmagick::COLOR_ALPHA | Определена; int 19 | Alpha: степень покрытия, противоположная opacity. |
Gmagick::COLOR_FUZZ | Определена; int 20 | Допуск сходства цветов, а не ещё один видимый цветовой канал. |
Смешивание слоёв — 54 констант
compositeImage получает источник, оператор и x/y. Режим не меняет позицию слоя. Доступность редкого оператора проверяйте до прямого обращения; расширенные параметры не следуют из одного имени константы.
Связанный разбор: Наложение и позиция.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::COMPOSITE_DEFAULT | Определена; int 1 | Выбор обычного режима по умолчанию; для определённого рецепта называйте OVER явно. |
Gmagick::COMPOSITE_UNDEFINED | Определена; int 0 | Неопределённый оператор; не полезный готовый эффект. |
Gmagick::COMPOSITE_NO | Определена; int 23 | Не выполнять композицию. |
Gmagick::COMPOSITE_ADD | Определена; int 8 | Сложение компонент с циклическим переполнением по правилам Add. |
Gmagick::COMPOSITE_ATOP | Определена; int 4 | Источник поверх назначения только внутри покрытия назначения. |
Gmagick::COMPOSITE_BLEND | Не определена в проверенной сборке | Смешивание слоёв с весами; наличие имени не гарантирует поддержку параметров. |
Gmagick::COMPOSITE_BUMPMAP | Определена; int 12 | Яркость источника используется как рельеф для освещения назначения. |
Gmagick::COMPOSITE_CLEAR | Определена; int 18 | Очистить область композиции. |
Gmagick::COMPOSITE_COLORBURN | Не определена в проверенной сборке | Затемнение цветовым прожигом. |
Gmagick::COMPOSITE_COLORDODGE | Не определена в проверенной сборке | Осветление цветовым осветлением. |
Gmagick::COMPOSITE_COLORIZE | Определена; int 28 | Перенести цветовой тон и насыщенность источника, сохранив яркостную составляющую назначения. |
Gmagick::COMPOSITE_COPYBLACK | Определена; int 35 | Скопировать чёрную CMYK-компоненту источника. |
Gmagick::COMPOSITE_COPYBLUE | Определена; int 16 | Скопировать синюю компоненту источника. |
Gmagick::COMPOSITE_COPY | Определена; int 13 | Скопировать источник, заменяя назначение в области. |
Gmagick::COMPOSITE_COPYCYAN | Определена; int 32 | Скопировать голубую CMYK-компоненту источника. |
Gmagick::COMPOSITE_COPYGREEN | Определена; int 15 | Скопировать зелёную компоненту источника. |
Gmagick::COMPOSITE_COPYMAGENTA | Определена; int 33 | Скопировать пурпурную CMYK-компоненту источника. |
Gmagick::COMPOSITE_COPYOPACITY | Определена; int 17 | Скопировать opacity; трактовка входа зависит от наличия канала прозрачности. |
Gmagick::COMPOSITE_COPYRED | Определена; int 14 | Скопировать красную компоненту источника. |
Gmagick::COMPOSITE_COPYYELLOW | Определена; int 34 | Скопировать жёлтую CMYK-компоненту источника. |
Gmagick::COMPOSITE_DARKEN | Определена; int 24 | Выбрать более тёмные значения компонент. |
Gmagick::COMPOSITE_DSTATOP | Не определена в проверенной сборке | Назначение поверх источника внутри покрытия источника. |
Gmagick::COMPOSITE_DST | Не определена в проверенной сборке | Оставить назначение. |
Gmagick::COMPOSITE_DSTIN | Не определена в проверенной сборке | Оставить назначение внутри покрытия источника. |
Gmagick::COMPOSITE_DSTOUT | Не определена в проверенной сборке | Оставить назначение за пределами покрытия источника. |
Gmagick::COMPOSITE_DSTOVER | Не определена в проверенной сборке | Назначение поверх источника. |
Gmagick::COMPOSITE_DIFFERENCE | Определена; int 10 | Модуль разности компонент: пригоден для поиска изменений. |
Gmagick::COMPOSITE_DISPLACE | Определена; int 20 | Сместить пиксели назначения по значениям карты источника; нужны параметры смещения. |
Gmagick::COMPOSITE_DISSOLVE | Определена; int 19 | Растворение слоёв с заданной долей; не то же самое, что их размер. |
Gmagick::COMPOSITE_EXCLUSION | Не определена в проверенной сборке | Контрастное исключение; мягче Difference. |
Gmagick::COMPOSITE_HARDLIGHT | Не определена в проверенной сборке | Комбинация Multiply/Screen в зависимости от яркости источника. |
Gmagick::COMPOSITE_HUE | Определена; int 26 | Перенести цветовой тон источника. |
Gmagick::COMPOSITE_IN | Определена; int 2 | Оставить источник внутри покрытия назначения. |
Gmagick::COMPOSITE_LIGHTEN | Определена; int 25 | Выбрать более светлые значения компонент. |
Gmagick::COMPOSITE_LUMINIZE | Определена; int 29 | Перенести яркостную составляющую источника. |
Gmagick::COMPOSITE_MINUS | Определена; int 7 | Вычитание компонент с ограничением диапазона по правилам Minus. |
Gmagick::COMPOSITE_MODULATE | Определена; int 21 | Модулировать изображение компонентами источника; это специальный оператор. |
Gmagick::COMPOSITE_MULTIPLY | Определена; int 11 | Умножение нормированных компонент; белое сохраняет цвет, чёрное затемняет. |
Gmagick::COMPOSITE_OUT | Определена; int 3 | Оставить источник вне покрытия назначения. |
Gmagick::COMPOSITE_OVER | Определена; int 1 | Источник поверх назначения с учётом прозрачности. |
Gmagick::COMPOSITE_OVERLAY | Определена; int 31 | Смешивание с усилением контраста относительно яркости назначения. |
Gmagick::COMPOSITE_PLUS | Определена; int 6 | Сложение с ограничением допустимого диапазона. |
Gmagick::COMPOSITE_REPLACE | Определена; int 13 | Заменить соответствующую область источником. |
Gmagick::COMPOSITE_SATURATE | Определена; int 27 | Перенести насыщенность источника. |
Gmagick::COMPOSITE_SCREEN | Определена; int 30 | Осветляющее умножение инверсий компонент. |
Gmagick::COMPOSITE_SOFTLIGHT | Не определена в проверенной сборке | Мягкое изменение контраста источником. |
Gmagick::COMPOSITE_SRCATOP | Не определена в проверенной сборке | Источник поверх назначения внутри покрытия назначения. |
Gmagick::COMPOSITE_SRC | Не определена в проверенной сборке | Оставить источник. |
Gmagick::COMPOSITE_SRCIN | Не определена в проверенной сборке | Источник внутри покрытия назначения. |
Gmagick::COMPOSITE_SRCOUT | Не определена в проверенной сборке | Источник за пределами покрытия назначения. |
Gmagick::COMPOSITE_SRCOVER | Не определена в проверенной сборке | Источник поверх назначения. |
Gmagick::COMPOSITE_SUBTRACT | Определена; int 9 | Вычитание с циклическим переполнением по правилам Subtract. |
Gmagick::COMPOSITE_THRESHOLD | Определена; int 22 | Пороговая композиция: параметры порога задаются отдельно. |
Gmagick::COMPOSITE_XOR | Определена; int 5 | Оставить неперекрывающиеся части источника и назначения. |
Сборка монтажа — 3 констант
В Reflection этой сборки есть montageImage. Режим влияет на оформление ячеек монтажа; не заменяет размеры превью, tile и geometry. Эта таблица перечисляет режимы, но не утверждает, что каждый выполнен отдельным примером.
Связанный разбор: Мини-галерея из готовых файлов.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::MONTAGEMODE_FRAME | Определена; int 1 | Монтаж с оформлением рамкой. |
Gmagick::MONTAGEMODE_UNFRAME | Определена; int 2 | Монтаж без оформляющей рамки. |
Gmagick::MONTAGEMODE_CONCATENATE | Определена; int 3 | Склеить изображения плотнее, без обычного оформления ячеек. |
Начертание шрифта — 4 констант
GmagickDraw::setFontStyle выбирает стиль; доступное семейство и файл шрифта определяют, существует ли нужное начертание. Italic не обещает найти шрифт, которого нет на сервере.
Связанный разбор: Шрифты и метрики.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::STYLE_NORMAL | Определена; int 0 | Обычное прямое начертание. |
Gmagick::STYLE_ITALIC | Определена; int 1 | Курсивное начертание из семейства шрифта. |
Gmagick::STYLE_OBLIQUE | Определена; int 2 | Наклонное начертание. |
Gmagick::STYLE_ANY | Определена; int 3 | Допустить любой стиль при выборе шрифта; это не отдельный визуальный эффект. |
Фильтр изменения размера — 16 констант
resizeImage(width,height,filter,blur,fit) пересчитывает пиксели; blur=1.0 оставляет стандартную ширину ядра. У фильтров разные сглаживание и ореолы, универсального победителя нет.
Связанный разбор: Сравнить Point и Lanczos.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::FILTER_UNDEFINED | Определена; int 0 | Фильтр явно не выбран; выбор зависит от операции. |
Gmagick::FILTER_POINT | Определена; int 1 | Ближайший отсчёт: жёсткие клетки без усреднения соседей. |
Gmagick::FILTER_BOX | Определена; int 2 | Прямоугольное окно усреднения. |
Gmagick::FILTER_TRIANGLE | Определена; int 3 | Треугольное ядро; линейное сглаживание. |
Gmagick::FILTER_HERMITE | Определена; int 4 | Кубическое ядро Hermite с плавным переходом. |
Gmagick::FILTER_HANNING | Определена; int 5 | Оконная функция Hann для сглаживания. |
Gmagick::FILTER_HAMMING | Определена; int 6 | Оконная функция Hamming. |
Gmagick::FILTER_BLACKMAN | Определена; int 7 | Оконная функция Blackman. |
Gmagick::FILTER_GAUSSIAN | Определена; int 8 | Гауссово сглаживание; может смягчать мелкие детали. |
Gmagick::FILTER_QUADRATIC | Определена; int 9 | Квадратичное ядро пересчёта. |
Gmagick::FILTER_CUBIC | Определена; int 10 | Кубическое сглаживающее ядро. |
Gmagick::FILTER_CATROM | Определена; int 11 | Интерполирующее кубическое ядро Catmull–Rom. |
Gmagick::FILTER_MITCHELL | Определена; int 12 | Кубический компромисс Mitchell между резкостью и артефактами. |
Gmagick::FILTER_LANCZOS | Определена; int 13 | Оконный sinc-фильтр Lanczos; детали резкие, возможны ореолы. |
Gmagick::FILTER_BESSEL | Определена; int 14 | Ядро на основе функции Бесселя. |
Gmagick::FILTER_SINC | Определена; int 15 | Sinc-ядро; резкие переходы могут сопровождаться колебаниями. |
Тип пиксельного изображения — 11 констант
setImageType меняет представление изображения; сохранение может дополнительно оптимизировать его. Matte здесь историческое имя канала прозрачности. Тип не выбирает расширение выходного файла.
Связанный разбор: Первое преобразование в серый.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::IMGTYPE_UNDEFINED | Определена; int 0 | Тип явно не выбран. |
Gmagick::IMGTYPE_BILEVEL | Определена; int 1 | Два уровня: чёрный и белый. |
Gmagick::IMGTYPE_GRAYSCALE | Определена; int 2 | Оттенки серого без matte. |
Gmagick::IMGTYPE_GRAYSCALEMATTE | Определена; int 3 | Оттенки серого с matte-каналом прозрачности. |
Gmagick::IMGTYPE_PALETTE | Определена; int 4 | Индексированная палитра. |
Gmagick::IMGTYPE_PALETTEMATTE | Определена; int 5 | Палитра с прозрачностью. |
Gmagick::IMGTYPE_TRUECOLOR | Определена; int 6 | Полноцветные RGB-пиксели. |
Gmagick::IMGTYPE_TRUECOLORMATTE | Определена; int 7 | Полноцветные пиксели с matte-каналом. |
Gmagick::IMGTYPE_COLORSEPARATION | Определена; int 8 | Цветоделение, обычно CMYK. |
Gmagick::IMGTYPE_COLORSEPARATIONMATTE | Определена; int 9 | Цветоделение с matte-каналом. |
Gmagick::IMGTYPE_OPTIMIZE | Определена; int 10 | Разрешить оптимизировать тип по содержимому; не обещает конкретный тип файла. |
Единицы печатной плотности — 3 констант
setImageUnits задаёт единицы для resolution. Плотность и размер в пикселях — разные величины: изменение PPI само по себе не добавляет деталей.
Связанный разбор: Плотность и печатный размер.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::RESOLUTION_UNDEFINED | Определена; int 0 | Единицы плотности не определены. |
Gmagick::RESOLUTION_PIXELSPERINCH | Определена; int 1 | Пиксели на дюйм: PPI. |
Gmagick::RESOLUTION_PIXELSPERCENTIMETER | Определена; int 2 | Пиксели на сантиметр. |
Сжатие — 11 констант
Доступный enum не устанавливает внешний кодировщик и не делает PNG JPEG-файлом. Формат, compression и quality согласуют по возможностям кодировщика; здесь битность и interlace показаны отдельно от качества JPEG.
Связанный разбор: Проверка фактического PNG.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::COMPRESSION_UNDEFINED | Определена; int 0 | Схема не выбрана. |
Gmagick::COMPRESSION_NO | Определена; int 1 | Без сжатия, если формат допускает. |
Gmagick::COMPRESSION_BZIP | Определена; int 2 | BZip-сжатие при поддержке формата/сборки. |
Gmagick::COMPRESSION_FAX | Определена; int 3 | CCITT Group 3 для двоичных факсимильных изображений. |
Gmagick::COMPRESSION_GROUP4 | Определена; int 4 | CCITT Group 4 для двоичных изображений. |
Gmagick::COMPRESSION_JPEG | Определена; int 5 | JPEG-сжатие с потерями. |
Gmagick::COMPRESSION_JPEG2000 | Не определена в проверенной сборке | JPEG 2000; требует соответствующей поддержки. |
Gmagick::COMPRESSION_LOSSLESSJPEG | Определена; int 6 | Lossless JPEG; поддержка зависит от кодировщика. |
Gmagick::COMPRESSION_LZW | Определена; int 7 | LZW-сжатие без потерь. |
Gmagick::COMPRESSION_RLE | Определена; int 8 | Сжатие серий одинаковых значений, RLE. |
Gmagick::COMPRESSION_ZIP | Определена; int 9 | Deflate/Zip-сжатие без потерь. |
Способы заливки — 5 констант
В этой сборке GmagickDraw::color принимает способ рисования; отдельные floodfill-методы имеют свой контракт. Нельзя подставлять PAINT_* в любой метод, где встречается слово fill.
Связанный разбор: Выбор константы по назначению аргумента.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::PAINT_POINT | Определена; int 0 | Изменить выбранную точку. |
Gmagick::PAINT_REPLACE | Определена; int 1 | Заменить совпадающие по цвету пиксели. |
Gmagick::PAINT_FLOODFILL | Определена; int 2 | Залить связанную область подходящих пикселей. |
Gmagick::PAINT_FILLTOBORDER | Определена; int 3 | Заливать до заданного граничного цвета. |
Gmagick::PAINT_RESET | Определена; int 4 | Сбросить/закрасить всю область изображения. |
Точки привязки — 9 констант
Gravity относится к операции, которая её поддерживает. Наш cornerPosition сам переводит две gravity-константы в x/y; compositeImage получает именно эти координаты. Это не обещание автоматической привязки любого слоя.
Связанный разбор: Правый нижний угол без догадок.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::GRAVITY_NORTHWEST | Определена; int 1 | Верхний левый угол. |
Gmagick::GRAVITY_NORTH | Определена; int 2 | Середина верхнего края. |
Gmagick::GRAVITY_NORTHEAST | Определена; int 3 | Верхний правый угол. |
Gmagick::GRAVITY_WEST | Определена; int 4 | Середина левого края. |
Gmagick::GRAVITY_CENTER | Определена; int 5 | Центр. |
Gmagick::GRAVITY_EAST | Определена; int 6 | Середина правого края. |
Gmagick::GRAVITY_SOUTHWEST | Определена; int 7 | Нижний левый угол. |
Gmagick::GRAVITY_SOUTH | Определена; int 8 | Середина нижнего края. |
Gmagick::GRAVITY_SOUTHEAST | Определена; int 9 | Нижний правый угол. |
Ширина начертания — 9 констант
GmagickDraw::setFontStretch найден в Reflection. Он выбирает вариант шрифта, а не растягивает уже готовые пиксели изображения; результат зависит от доступных начертаний.
Связанный разбор: Выбор шрифта и измерение текста.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::STRETCH_NORMAL | Определена; int 0 | Нормальная ширина начертания. |
Gmagick::STRETCH_ULTRACONDENSED | Определена; int 1 | Предельно узкое начертание. |
Gmagick::STRETCH_CONDENSED | Определена; int 3 | Узкое начертание. |
Gmagick::STRETCH_SEMICONDENSED | Определена; int 4 | Умеренно узкое начертание. |
Gmagick::STRETCH_SEMIEXPANDED | Определена; int 5 | Умеренно широкое начертание. |
Gmagick::STRETCH_EXPANDED | Определена; int 6 | Широкое начертание. |
Gmagick::STRETCH_EXTRAEXPANDED | Определена; int 7 | Очень широкое начертание. |
Gmagick::STRETCH_ULTRAEXPANDED | Определена; int 8 | Предельно широкое начертание. |
Gmagick::STRETCH_ANY | Определена; int 9 | Любая ширина при подборе доступного начертания. |
Выравнивание текста — 4 констант
ALIGN_* определены, но методов setTextAlignment/getTextAlignment в проверенной GmagickDraw нет. Не переносите вызов из Imagick автоматически. Для конкретного размещения используйте координаты и метрики текста.
Связанный разбор: Метрики для позиционирования текста.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::ALIGN_UNDEFINED | Определена; int 0 | Выравнивание явно не задано. |
Gmagick::ALIGN_LEFT | Определена; int 1 | Выравнивание по левому краю. |
Gmagick::ALIGN_CENTER | Определена; int 2 | Выравнивание по центру. |
Gmagick::ALIGN_RIGHT | Определена; int 3 | Выравнивание по правому краю. |
Линии оформления текста — 4 констант
GmagickDraw::setTextDecoration задаёт оформление будущего текста. LINETROUGH — точное имя API, хотя английское слово обычно пишут иначе; самостоятельное исправление имени вызовет ошибку.
Связанный разбор: Подпись и её оформление.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::DECORATION_NO | Определена; int 0 | Без линии оформления. |
Gmagick::DECORATION_UNDERLINE | Определена; int 1 | Подчёркивание. |
Gmagick::DECORATION_OVERLINE | Определена; int 2 | Линия над текстом. |
Gmagick::DECORATION_LINETROUGH | Определена; int 3 | Перечёркивание; официальное имя содержит LINETROUGH. |
Модели шума — 6 констант
В Reflection есть addNoiseImage. Случайный шум не гарантирует одинаковые пиксели при повторном запуске; он не является настройкой шумоподавления для любого изображения.
Связанный разбор: От режима к проверяемому рецепту.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::NOISE_UNIFORM | Определена; int 0 | Равномерно распределённый шум. |
Gmagick::NOISE_GAUSSIAN | Определена; int 1 | Аддитивный гауссов шум. |
Gmagick::NOISE_MULTIPLICATIVEGAUSSIAN | Определена; int 2 | Гауссов шум, зависящий от значения сигнала. |
Gmagick::NOISE_IMPULSE | Определена; int 3 | Импульсные светлые/тёмные выбросы. |
Gmagick::NOISE_LAPLACIAN | Определена; int 4 | Шум с распределением Лапласа. |
Gmagick::NOISE_POISSON | Определена; int 5 | Пуассонов шум, связанный со статистикой счёта. |
Каналы изображения — 14 констант
CHANNEL_* предназначены аргументу channel, а COLOR_* — компонентам GmagickPixel. Встречаются одинаковые числовые значения и алиасы; это не делает разные группы взаимозаменяемыми. Для некоторых методов разрешена маска, для других один канал.
Связанный разбор: Выделить канал.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::CHANNEL_UNDEFINED | Определена; int 0 | Канал явно не выбран. |
Gmagick::CHANNEL_RED | Определена; int 1 | Красный канал. |
Gmagick::CHANNEL_GRAY | Не определена в проверенной сборке | Серый канал. |
Gmagick::CHANNEL_CYAN | Определена; int 2 | Голубой канал CMYK. |
Gmagick::CHANNEL_GREEN | Определена; int 3 | Зелёный канал. |
Gmagick::CHANNEL_MAGENTA | Определена; int 4 | Пурпурный канал CMYK. |
Gmagick::CHANNEL_BLUE | Определена; int 5 | Синий канал. |
Gmagick::CHANNEL_YELLOW | Определена; int 6 | Жёлтый канал CMYK. |
Gmagick::CHANNEL_ALPHA | Не определена в проверенной сборке | Alpha-канал. |
Gmagick::CHANNEL_OPACITY | Определена; int 7 | Opacity-канал с обратным направлением шкалы. |
Gmagick::CHANNEL_MATTE | Определена; int 9 | Matte-канал прозрачности. |
Gmagick::CHANNEL_BLACK | Определена; int 8 | Чёрный канал CMYK. |
Gmagick::CHANNEL_INDEX | Определена; int 8 | Индекс палитры. |
Gmagick::CHANNEL_ALL | Определена; int 10 | Все применимые каналы; это не число каналов. |
Метрики различий — 6 констант
В Reflection есть compareImages и compareImageChannels. Метрика измеряет различие, но не объясняет его причину и не заменяет просмотр. Сравнивают согласованные размеры и представления; MSE, RMSE и PSNR имеют разные шкалы.
Связанный разбор: Одинаковые условия сравнения.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::METRIC_UNDEFINED | Определена; int 0 | Метрика не выбрана. |
Gmagick::METRIC_MEANABSOLUTEERROR | Определена; int 1 | Средняя абсолютная ошибка, MAE. |
Gmagick::METRIC_MEANSQUAREERROR | Определена; int 2 | Среднеквадратичная ошибка, MSE. |
Gmagick::METRIC_PEAKABSOLUTEERROR | Определена; int 3 | Наибольшая абсолютная ошибка одного сравнения. |
Gmagick::METRIC_PEAKSIGNALTONOISERATIO | Определена; int 4 | Пиковое отношение сигнал/шум, PSNR; больше обычно лучше. |
Gmagick::METRIC_ROOTMEANSQUAREDERROR | Определена; int 5 | Корень из средней квадратичной ошибки, RMSE. |
Тип хранения отсчёта — 7 констант
PIXEL_* обозначает C-тип отсчёта, а не порядок RGB. В проверенной Gmagick нет exportImagePixels/importImagePixels из Imagick; наличие enum не создаёт эти методы. Для доступа к компонентам используйте доступный GmagickPixel.
Связанный разбор: Чтение компонентов.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::PIXEL_CHAR | Определена; int 0 | Хранение отсчёта в unsigned char. |
Gmagick::PIXEL_DOUBLE | Определена; int 5 | Хранение отсчёта как double. |
Gmagick::PIXEL_FLOAT | Определена; int 4 | Хранение отсчёта как float. |
Gmagick::PIXEL_INTEGER | Определена; int 2 | Хранение отсчёта в unsigned int. |
Gmagick::PIXEL_LONG | Определена; int 3 | Хранение отсчёта в unsigned long. |
Gmagick::PIXEL_QUANTUM | Не определена в проверенной сборке | Внутренний тип Quantum данной сборки. |
Gmagick::PIXEL_SHORT | Определена; int 1 | Хранение отсчёта в unsigned short. |
Цветовые модели — 20 констант
Модель RGB/CMYK/Gray не заменяет ICC-профиль с характеристиками цвета. setImageColorspace имеет собственное действие; имя sRGB не является доказательством правильной ICC-конверсии неизвестного источника.
Связанный разбор: Цветовое пространство и тип.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::COLORSPACE_UNDEFINED | Определена; int 0 | Пространство явно не выбрано. |
Gmagick::COLORSPACE_RGB | Определена; int 1 | RGB-модель; точную характеристику передачи не угадываем по одному имени. |
Gmagick::COLORSPACE_GRAY | Определена; int 2 | Одноканальные оттенки серого. |
Gmagick::COLORSPACE_TRANSPARENT | Определена; int 3 | Специальный Transparent-режим GraphicsMagick; не замена alpha-маске. |
Gmagick::COLORSPACE_OHTA | Определена; int 4 | Координаты Ohta для обработки изображений. |
Gmagick::COLORSPACE_LAB | Определена; int 14 | CIE L*a*b*: светлота и две цветоразностные оси. |
Gmagick::COLORSPACE_XYZ | Определена; int 5 | CIE XYZ: трёхстимульные координаты. |
Gmagick::COLORSPACE_YCBCR | Определена; int 17 | Яркостно-цветоразностные YCbCr. |
Gmagick::COLORSPACE_YCC | Определена; int 6 | Photo YCC. |
Gmagick::COLORSPACE_YIQ | Определена; int 7 | Яркость и цветоразностные координаты YIQ. |
Gmagick::COLORSPACE_YPBPR | Определена; int 8 | Яркость и цветоразностные координаты YPbPr. |
Gmagick::COLORSPACE_YUV | Определена; int 9 | Яркость и цветоразностные координаты YUV. |
Gmagick::COLORSPACE_CMYK | Определена; int 10 | Четыре компоненты печатной модели CMYK. |
Gmagick::COLORSPACE_SRGB | Определена; int 11 | sRGB-модель; константа не заменяет проверенный ICC-профиль. |
Gmagick::COLORSPACE_HSB | Не определена в проверенной сборке | Тон, насыщенность и яркость HSB. |
Gmagick::COLORSPACE_HSL | Определена; int 12 | Тон, насыщенность и светлота HSL. |
Gmagick::COLORSPACE_HWB | Определена; int 13 | Тон, доля белого и доля чёрного HWB. |
Gmagick::COLORSPACE_REC601LUMA | Не определена в проверенной сборке | Яркостная компонента по семейству Rec.601. |
Gmagick::COLORSPACE_REC709LUMA | Не определена в проверенной сборке | Яркостная компонента по семейству Rec.709. |
Gmagick::COLORSPACE_LOG | Не определена в проверенной сборке | Логарифмическое представление компонентов. |
Отсчёты за границей — 7 констант
В Reflection есть setImageVirtualPixelMethod. Эти значения влияют на операции, запрашивающие пиксели вне холста, а не добавляют постоянную рамку к файлу. Рамку создают отдельным borderImage.
Связанный разбор: Реальная рамка вокруг превью.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::VIRTUALPIXELMETHOD_UNDEFINED | Определена; int 0 | Поведение за границами явно не выбрано. |
Gmagick::VIRTUALPIXELMETHOD_BACKGROUND | Не определена в проверенной сборке | Использовать заданный фоновый цвет. |
Gmagick::VIRTUALPIXELMETHOD_CONSTANT | Определена; int 1 | Использовать постоянный цвет за границами. |
Gmagick::VIRTUALPIXELMETHOD_EDGE | Определена; int 2 | Продолжать крайний пиксель изображения. |
Gmagick::VIRTUALPIXELMETHOD_MIRROR | Определена; int 3 | Зеркально отражать изображение на границе. |
Gmagick::VIRTUALPIXELMETHOD_TILE | Определена; int 4 | Повторять изображение плиткой. |
Gmagick::VIRTUALPIXELMETHOD_TRANSPARENT | Не определена в проверенной сборке | Считать внешнюю область прозрачной. |
Режимы предварительного просмотра — 30 констант
Имена перечислены официально и определены в данной сборке, но Gmagick::previewImages/previewImage в Reflection отсутствуют. Не вызывайте несуществующий метод; создайте собственные копии с нужными поддерживаемыми операциями, как в нашей галерее.
Связанный разбор: Своя галерея вариантов.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::PREVIEW_UNDEFINED | Определена; int 0 | Вид предварительного эффекта не выбран. |
Gmagick::PREVIEW_ROTATE | Определена; int 1 | Предпросмотр поворота. |
Gmagick::PREVIEW_SHEAR | Определена; int 2 | Предпросмотр сдвига/скоса. |
Gmagick::PREVIEW_ROLL | Определена; int 3 | Предпросмотр циклического смещения. |
Gmagick::PREVIEW_HUE | Определена; int 4 | Предпросмотр цветового тона. |
Gmagick::PREVIEW_SATURATION | Определена; int 5 | Предпросмотр насыщенности. |
Gmagick::PREVIEW_BRIGHTNESS | Определена; int 6 | Предпросмотр яркости. |
Gmagick::PREVIEW_GAMMA | Определена; int 7 | Предпросмотр гаммы. |
Gmagick::PREVIEW_SPIFF | Определена; int 8 | Предпросмотр усиления контраста. |
Gmagick::PREVIEW_DULL | Определена; int 9 | Предпросмотр ослабления контраста. |
Gmagick::PREVIEW_GRAYSCALE | Определена; int 10 | Предпросмотр оттенков серого. |
Gmagick::PREVIEW_QUANTIZE | Определена; int 11 | Предпросмотр уменьшения числа цветов. |
Gmagick::PREVIEW_DESPECKLE | Определена; int 12 | Предпросмотр удаления одиночных шумовых точек. |
Gmagick::PREVIEW_REDUCENOISE | Определена; int 13 | Предпросмотр подавления шума. |
Gmagick::PREVIEW_ADDNOISE | Определена; int 14 | Предпросмотр добавления шума. |
Gmagick::PREVIEW_SHARPEN | Определена; int 15 | Предпросмотр резкости. |
Gmagick::PREVIEW_BLUR | Определена; int 16 | Предпросмотр размытия. |
Gmagick::PREVIEW_THRESHOLD | Определена; int 17 | Предпросмотр порога. |
Gmagick::PREVIEW_EDGEDETECT | Определена; int 18 | Предпросмотр выделения границ. |
Gmagick::PREVIEW_SPREAD | Определена; int 19 | Предпросмотр случайного разбрасывания пикселей. |
Gmagick::PREVIEW_SOLARIZE | Определена; int 20 | Предпросмотр соляризации. |
Gmagick::PREVIEW_SHADE | Определена; int 21 | Предпросмотр рельефного освещения. |
Gmagick::PREVIEW_RAISE | Определена; int 22 | Предпросмотр приподнятой рамки. |
Gmagick::PREVIEW_SEGMENT | Определена; int 23 | Предпросмотр сегментации цветов. |
Gmagick::PREVIEW_SWIRL | Определена; int 24 | Предпросмотр закручивания. |
Gmagick::PREVIEW_IMPLODE | Определена; int 25 | Предпросмотр втягивания к центру. |
Gmagick::PREVIEW_WAVE | Определена; int 26 | Предпросмотр волны. |
Gmagick::PREVIEW_OILPAINT | Определена; int 27 | Предпросмотр масляной живописи. |
Gmagick::PREVIEW_CHARCOALDRAWING | Определена; int 28 | Предпросмотр угольного рисунка. |
Gmagick::PREVIEW_JPEG | Определена; int 29 | Предпросмотр JPEG-сжатия. |
Намерение цветопередачи — 5 констант
Intent выбирают перед преобразованием ICC. Один setter не преобразует RGB; разные намерения могут дать одинаковые числа на матричных профилях.
Связанный разбор: Правило и реальные результаты.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::RENDERINGINTENT_UNDEFINED | Определена; int 0 | Намерение явно не выбрано. |
Gmagick::RENDERINGINTENT_SATURATION | Определена; int 1 | Приоритет насыщенности. |
Gmagick::RENDERINGINTENT_PERCEPTUAL | Определена; int 2 | Сохранение воспринимаемых отношений цветов. |
Gmagick::RENDERINGINTENT_ABSOLUTE | Определена; int 3 | Абсолютное колориметрическое сопоставление. |
Gmagick::RENDERINGINTENT_RELATIVE | Определена; int 4 | Относительное колориметрическое сопоставление. |
Внутренняя область контура — 3 констант
GmagickDraw::setFillRule выбирает правило заливки пересекающегося/вложенного пути. EvenOdd считает чётность, NonZero учитывает направление обхода; это не цвет заливки.
Связанный разбор: Разделять выбор режима и данные.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::FILLRULE_UNDEFINED | Определена; int 0 | Правило заполнения явно не выбрано. |
Gmagick::FILLRULE_EVENODD | Определена; int 1 | Внутри, если число пересечений луча с контуром нечётное. |
Gmagick::FILLRULE_NONZERO | Определена; int 2 | Внутри, если ориентированное число обходов контура ненулевое. |
Единицы пути/обрезки — 4 констант
В Reflection есть GmagickDraw::setClipUnits. User-space и object-bounding-box меняют систему координат клипа, а не единицы печатной плотности. Не переносите значения в setImageUnits.
Связанный разбор: Группы констант и назначение.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::PATHUNITS_UNDEFINED | Не определена в проверенной сборке | Система координат явно не задана. |
Gmagick::PATHUNITS_USERSPACE | Определена; int 0 | Пользовательская система координат. |
Gmagick::PATHUNITS_USERSPACEONUSE | Определена; int 1 | Пользовательская система в месте использования. |
Gmagick::PATHUNITS_OBJECTBOUNDINGBOX | Определена; int 2 | Координаты относительно ограничивающего прямоугольника объекта. |
Окончания линии — 4 констант
GmagickDraw::setStrokeLineCap задаёт форму окончания будущей линии. При ненулевой толщине Round/Square выходят за математическую конечную точку; учитывайте это при размещении.
Связанный разбор: Каталог режимов рисования.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::LINECAP_UNDEFINED | Определена; int 0 | Форма конца линии явно не задана. |
Gmagick::LINECAP_BUTT | Определена; int 1 | Плоский срез точно в конечной точке. |
Gmagick::LINECAP_ROUND | Определена; int 2 | Полукруглый конец линии. |
Gmagick::LINECAP_SQUARE | Определена; int 3 | Квадратный конец, выступающий за конечную точку. |
Соединения линии — 4 констант
GmagickDraw::setStrokeLineJoin управляет внешним углом; Miter дополнительно ограничен setStrokeMiterLimit. Это отличается от формы свободного конца линии.
Связанный разбор: Каталог режимов рисования.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::LINEJOIN_UNDEFINED | Определена; int 0 | Соединение явно не выбрано. |
Gmagick::LINEJOIN_MITER | Определена; int 1 | Продлить края до острого угла с учётом miter limit. |
Gmagick::LINEJOIN_ROUND | Определена; int 2 | Скруглить внешний угол. |
Gmagick::LINEJOIN_BEVEL | Определена; int 3 | Срезать внешний угол фаской. |
Ресурсы обработки — 6 констант
В Reflection есть getResourceLimit/setResourceLimit. Значение enum выбирает ресурс, а не величину лимита. Единицы и действие сверяйте с контрактом конкретной версии; память PHP и кэш GraphicsMagick — не один счётчик. Не устанавливайте произвольные большие лимиты по входу пользователя.
Связанный разбор: Разрешённые настройки приложения.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::RESOURCETYPE_UNDEFINED | Определена; int 0 | Тип ресурса не выбран. |
Gmagick::RESOURCETYPE_AREA | Определена; int 0 | Площадь изображения в политике размещения кэша. |
Gmagick::RESOURCETYPE_DISK | Определена; int 1 | Дисковое пространство для кэша пикселей. |
Gmagick::RESOURCETYPE_FILE | Определена; int 2 | Количество открываемых файлов. |
Gmagick::RESOURCETYPE_MAP | Определена; int 3 | Отображаемая в память область кэша. |
Gmagick::RESOURCETYPE_MEMORY | Определена; int 4 | Оперативная память для кэша пикселей. |
Ориентация изображения — 9 констант
Все девять имён этой группы отсутствуют в проверенном Gmagick 2.0.6RC1. Их наличие на PHP.net не позволяет обращаться к ним напрямую. EXIF-метка и реально повёрнутые пиксели — разные состояния; не выдаём этот каталог за рабочий autoOrientImage.
Связанный разбор: Проверять defined до использования.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::ORIENTATION_UNDEFINED | Не определена в проверенной сборке | Ориентация не задана. |
Gmagick::ORIENTATION_TOPLEFT | Не определена в проверенной сборке | Верх слева: обычное расположение. |
Gmagick::ORIENTATION_TOPRIGHT | Не определена в проверенной сборке | Верх справа: горизонтальное отражение. |
Gmagick::ORIENTATION_BOTTOMRIGHT | Не определена в проверенной сборке | Низ справа: поворот на 180°. |
Gmagick::ORIENTATION_BOTTOMLEFT | Не определена в проверенной сборке | Низ слева: вертикальное отражение. |
Gmagick::ORIENTATION_LEFTTOP | Не определена в проверенной сборке | Лево сверху: транспонирование. |
Gmagick::ORIENTATION_RIGHTTOP | Не определена в проверенной сборке | Право сверху: поворот на 90° по часовой стрелке. |
Gmagick::ORIENTATION_RIGHTBOTTOM | Не определена в проверенной сборке | Право снизу: отражение относительно обратной диагонали. |
Gmagick::ORIENTATION_LEFTBOTTOM | Не определена в проверенной сборке | Лево снизу: поворот на 90° против часовой стрелки. |
Схема записи — 6 констант
Interlace меняет порядок передачи отсчётов, а не разрешение или глубину. INTERLACE_NONE и NO в нашем runtime равны. Для PNG проверяйте IHDR: 0 — обычный, 1 — Adam7; числовое значение Gmagick::INTERLACE_LINE не равно байту PNG.
Связанный разбор: Image-параметр и параметр кодировщика.
| Официальное имя | Доступность и значение | Что выбирает |
|---|---|---|
Gmagick::INTERLACE_UNDEFINED | Определена; int 0 | Схема явно не выбрана. |
Gmagick::INTERLACE_NO | Определена; int 1 | Без interlace. |
Gmagick::INTERLACE_NONE | Определена; int 1 | Альтернативное имя режима без interlace. |
Gmagick::INTERLACE_LINE | Определена; int 2 | Чередование по строкам; кодировщик PNG трактует как Adam7. |
Gmagick::INTERLACE_PLANE | Определена; int 3 | Разделение по плоскостям для поддерживающих форматов. |
Gmagick::INTERLACE_PARTITION | Определена; int 4 | Разделение по отдельным файлам/частям для поддерживающих сырых форматов. |
Выбрать фильтр: чёткие клетки или сглаженные контуры
У маленького каталожного превью зубчатая окружность, а у схемы после уменьшения появилась лишняя серость. Обе задачи используют resizeImage, но не обязаны выбирать один фильтр. Здесь два уменьшения одного исходника до 90 × 60 и два увеличения этих маленьких результатов до 360 × 240: рядом видно, какие пиксели появились из-за каждого фильтра.





$small = clone $source;
$small->resizeImage(90, 60, Gmagick::FILTER_POINT, 1.0);
gmPng($small, 'gm104-constants-filters-point-small.png');clone создаёт независимую рабочую копию: оба маршрута начинают с одного источника. Аргументы resizeImage — ширина, высота, фильтр и blur. Здесь размеры задают ту же пропорцию 3:2, поэтому нет растяжения. FILTER_POINT выбирает ближайшие отсчёты: это полезно для пиксельной графики и условных цветных клеток. FILTER_LANCZOS учитывает соседние значения и лучше сглаживает многие контуры, но на контрастных линиях может давать ореолы. 1.0 — стандартная ширина ядра, а не процент качества или степень JPEG-сжатия. Пятый необязательный fit здесь не используется. Уменьшение до 90 × 60 теряет детали в обоих случаях; последующее увеличение их не восстановит.
<?php
declare(strict_types=1);
require __DIR__ . '/gm104-constants-fixture.php';
gmRestore();
$source = new Gmagick(__DIR__ . '/constants-target.ppm');
gmPng($source, 'gm104-constants-filters-source.png');
$filters = ['point' => Gmagick::FILTER_POINT, 'lanczos' => Gmagick::FILTER_LANCZOS];
foreach ($filters as $name => $filter) {
$small = clone $source;
$small->resizeImage(90, 60, $filter, 1.0);
gmPng($small, 'gm104-constants-filters-' . $name . '-small.png');
// Одинаковое увеличение обоих вариантов только для рассмотрения пикселей.
$zoom = clone $small;
$zoom->resizeImage(360, 240, Gmagick::FILTER_POINT, 1.0);
gmPng($zoom, 'gm104-constants-filters-' . $name . '-zoom.png');
}
$checks = [
'different_small_pixels' => !gmSamePixels('gm104-constants-filters-point-small.png', 'gm104-constants-filters-lanczos-small.png'),
'source_dimensions_unchanged' => $source->getImageWidth() === 360 && $source->getImageHeight() === 240
];
gmReport('gm104-constants-filters', ["gmagick.resizeimage", "gmagick.writeimage"], ["gm104-constants-filters-source.png", "gm104-constants-filters-point-small.png", "gm104-constants-filters-lanczos-small.png", "gm104-constants-filters-point-zoom.png", "gm104-constants-filters-lanczos-zoom.png"], $checks, $errors ?? [], ['filters' => $filters, 'blur' => 1.0, 'zoom_filter' => 'FILTER_POINT']);
echo "2 previews: 90x60; 2 pixel zooms: 360x240\n";
Ожидаемый результат
2 previews: 90x60; 2 pixel zooms: 360x240
Самостоятельный запуск: распакуйте архив и выполните php example.php с Gmagick. Включены собственный 16-битный PPM в base64, SHA256 и gm104-constants-fixture.php. Helper восстанавливает вход, сохраняет копии PNG и metrics.json; он не относится к стандартному API PHP. Короткий фрагмент операции показан выше, полный код создаёт все перечисленные результаты. Настройки подтверждаются сохранёнными файлами.
gmPng — короткий helper нашего архива, который сохраняет PNG-копию; это не метод Gmagick. Для наглядного увеличения оба маленьких результата масштабируются одним Point, чтобы не подмешивать второе сглаживание. Полная программа действительно сохраняет все пять PNG и проверяет различие маленьких результатов. Цифровая разница сама по себе не означает, что один вариант лучше. Упражнение: для товарной фотографии сравните Lanczos и Mitchell в равных размерах, оцените края и текст; для QR-кода не рассчитывайте на произвольный resize — генерируйте его в нужном масштабе с целым числом пикселей на модуль.
Опорные понятия: объект и метод, константы PHP, аргументы и return, независимая копия через clone.
Проблема из реальной разработки
ImageMagick Antia-aliasing: После уменьшения чёрно-белой графики появились серые пиксели; отключение antialias не объяснило выбор фильтра. Показываем один и тот же исходник через Point и Lanczos, затем одинаково увеличиваем оба результата для сравнения: фильтр масштабирования выбирается по задаче. Обсуждение помогает выбрать задачу; контракт Gmagick и результат берём из первичных источников и выполненного кода, а не переносим API Imagick автоматически.
Наложить плашку: координаты отдельно от смешивания
Нужно поместить знак акции в угол карточки. Вопросов два: где окажется плашка и как её цвет взаимодействует с фоном. Эти параметры независимы. Первый PNG показывает непрозрачную золотую плашку сверху слева; второй — умножение цвета снизу справа, где просвечивает структура шкалы.



[$x, $y] = cornerPosition($result, $badge, Gmagick::GRAVITY_SOUTHEAST, 12);
$result->compositeImage($badge, Gmagick::COMPOSITE_MULTIPLY, $x, $y);cornerPosition — наша функция из полного примера, не скрытый API библиотеки. Она получает холст, слой, одно из двух разрешённых мест и отступ. Для нижнего правого угла x = 360 − 80 − 12 = 268, y = 240 − 40 − 12 = 188. Эти числа задают левый верхний угол самого слоя. В записи [$x, $y] два элемента возвращённого массива попадают в две переменные. GRAVITY_SOUTHEAST используется как понятное имя выбора внутри нашей функции. Метод compositeImage получает уже готовые x/y: мы не обещаем, что произвольный setter gravity сам поменяет его координаты.
<?php
declare(strict_types=1);
require __DIR__ . '/gm104-constants-fixture.php';
gmRestore();
function cornerPosition(Gmagick $base, Gmagick $layer, int $gravity, int $margin): array {
$right = $base->getImageWidth() - $layer->getImageWidth() - $margin;
$bottom = $base->getImageHeight() - $layer->getImageHeight() - $margin;
if ($margin < 0 || $right < $margin || $bottom < $margin) {
throw new InvalidArgumentException('Layer does not fit with this margin');
}
return match ($gravity) {
Gmagick::GRAVITY_NORTHWEST => [$margin, $margin],
Gmagick::GRAVITY_SOUTHEAST => [$right, $bottom],
default => throw new InvalidArgumentException('Only two corners are allowed'),
};
}
$source = new Gmagick(__DIR__ . '/constants-target.ppm');
$badge = new Gmagick();
$badge->newImage(80, 40, '#f2b84b');
gmPng($source, 'gm104-constants-placement-source.png');
$positions = [];
foreach (['over-nw' => [Gmagick::COMPOSITE_OVER, Gmagick::GRAVITY_NORTHWEST],
'multiply-se' => [Gmagick::COMPOSITE_MULTIPLY, Gmagick::GRAVITY_SOUTHEAST]] as $name => [$blend, $gravity]) {
$result = clone $source;
[$x, $y] = cornerPosition($result, $badge, $gravity, 12);
$result->compositeImage($badge, $blend, $x, $y);
gmPng($result, 'gm104-constants-placement-' . $name . '.png');
$positions[$name] = [$x, $y];
}
$errors['unsupported_corner'] = gmTry(fn() => cornerPosition($source, $badge, Gmagick::GRAVITY_CENTER, 12));
$checks = [
'positions_are_explicit' => $positions === ['over-nw' => [12, 12], 'multiply-se' => [268, 188]],
'unknown_gravity_rejected' => ($errors['unsupported_corner']['class'] ?? '') === InvalidArgumentException::class
];
gmReport('gm104-constants-placement', ["gmagick.newimage", "gmagick.compositeimage", "gmagick.writeimage"], ["gm104-constants-placement-source.png", "gm104-constants-placement-over-nw.png", "gm104-constants-placement-multiply-se.png"], $checks, $errors ?? [], ['positions' => $positions, 'badge_size' => [80, 40], 'margin' => 12]);
echo "over-nw: 12,12; multiply-se: 268,188; unknown corner rejected\n";
Ожидаемый результат
over-nw: 12,12; multiply-se: 268,188; unknown corner rejected
Самостоятельный запуск: распакуйте архив и выполните php example.php с Gmagick. Включены собственный 16-битный PPM в base64, SHA256 и gm104-constants-fixture.php. Helper восстанавливает вход, сохраняет копии PNG и metrics.json; он не относится к стандартному API PHP. Короткий фрагмент операции показан выше, полный код создаёт все перечисленные результаты. Настройки подтверждаются сохранёнными файлами.
COMPOSITE_OVER размещает источник поверх фона с учётом прозрачности. Здесь источник непрозрачен, поэтому плашка закрывает рисунок. COMPOSITE_MULTIPLY перемножает нормированные компоненты: на белом фоновой шкалы виден исходный цвет плашки, на тёмном он темнее. Плашка не обязана иметь тот же размер, что фон. Функция заранее отклоняет неумещающийся слой и неподдерживаемый CENTER через InvalidArgumentException; эта ошибка относится к нашей политике двух углов, а не ко всем возможностям GraphicsMagick. Упражнение: добавить третий разрешённый угол NORTHEAST. Решение: вернуть [$right, $margin], оставив режим смешивания отдельным аргументом.
Опорные понятия: объект и метод, константы PHP, аргументы и return, независимая копия через clone.
Проблема из реальной разработки
How to position watermark on right side in Imagick PHP?: Автор передаёт координаты 20,20 и хочет переместить водяной знак в нижний правый угол. Явно вычисляем x=W-w-margin и y=H-h-margin; собственная функция переводит разрешённую gravity в координаты, а режим смешивания задаётся отдельно. Обсуждение помогает выбрать задачу; контракт Gmagick и результат берём из первичных источников и выполненного кода, а не переносим API Imagick автоматически.
Запросить 8/16 бит и interlace, затем прочитать реальный PNG
Выгрузка для дизайнера должна сохранить 16-битный градиент, а web-файл — иметь определённый порядок загрузки. Успешного setter недостаточно: проверяем то, что записал PNG-кодировщик. Три настоящих файла могут выглядеть почти одинаково в браузере, но различаются глубиной отсчётов и полем interlace в заголовке.



$source->setInterlaceScheme(Gmagick::INTERLACE_LINE);
gmPng($source, 'gm104-constants-encoding-writer-line16.png', 16);Входная мишень действительно содержит 16-битные компоненты, не просто 8-битную картинку с ярлыком «16». gmPng принимает третий аргумент — глубину записи копии. INTERLACE_LINE принадлежит Gmagick; в PNG ему соответствует режим Adam7, но это разные числовые перечисления. Функция pngHeader читает байты уже записанного файла: depth — по смещению 24, color_type — 25, interlace — 28, после проверки сигнатуры PNG и IHDR. 0 в PNG означает обычную запись, 1 — Adam7. Проверка заголовка маленькая и привязана именно к PNG, а не к JPEG.
<?php
declare(strict_types=1);
require __DIR__ . '/gm104-constants-fixture.php';
gmRestore();
function pngHeader(string $filename): array {
$bytes = file_get_contents(__DIR__ . '/' . $filename);
if (substr($bytes, 0, 8) !== "\x89PNG\r\n\x1a\n" || substr($bytes, 12, 4) !== 'IHDR') {
throw new RuntimeException('PNG header expected');
}
return ['depth' => ord($bytes[24]), 'color_type' => ord($bytes[25]), 'interlace' => ord($bytes[28])];
}
$source = new Gmagick(__DIR__ . '/constants-target.ppm');
$source->setImageInterlaceScheme(Gmagick::INTERLACE_NO);
gmPng($source, 'gm104-constants-encoding-plain8.png', 8);
$source->setImageInterlaceScheme(Gmagick::INTERLACE_LINE);
gmPng($source, 'gm104-constants-encoding-image-line16.png', 16);
// Настройка кодировщика — другой метод, проверенный отдельно по выходному файлу.
$source->setInterlaceScheme(Gmagick::INTERLACE_LINE);
gmPng($source, 'gm104-constants-encoding-writer-line16.png', 16);
$headers = [];
foreach (['plain8', 'image-line16', 'writer-line16'] as $name) {
$headers[$name] = pngHeader('gm104-constants-encoding-' . $name . '.png');
}
file_put_contents(__DIR__ . '/gm104-constants-encoding-encoding.json', json_encode($headers, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR));
$checks = [
'depths_are_in_file' => $headers['plain8']['depth'] === 8 && $headers['image-line16']['depth'] === 16 && $headers['writer-line16']['depth'] === 16,
'image_setting_not_writer_setting' => $headers['image-line16']['interlace'] === 0 && $headers['writer-line16']['interlace'] === 1,
'interlace_preserves_pixels' => gmSamePixels('gm104-constants-encoding-image-line16.png', 'gm104-constants-encoding-writer-line16.png')
];
gmReport('gm104-constants-encoding', ["gmagick.setimageinterlacescheme", "gmagick.setinterlacescheme", "gmagick.setimagedepth", "gmagick.writeimage"], ["gm104-constants-encoding-plain8.png", "gm104-constants-encoding-image-line16.png", "gm104-constants-encoding-writer-line16.png"], $checks, $errors ?? [], ['png_IHDR' => $headers]);
echo "PNG depth: 8,16,16; interlace: 0,0,1\n";
Ожидаемый результат
PNG depth: 8,16,16; interlace: 0,0,1
Самостоятельный запуск: распакуйте архив и выполните php example.php с Gmagick. Включены собственный 16-битный PPM в base64, SHA256 и gm104-constants-fixture.php. Helper восстанавливает вход, сохраняет копии PNG и metrics.json; он не относится к стандартному API PHP. Короткий фрагмент операции показан выше, полный код создаёт все перечисленные результаты. Настройки подтверждаются сохранёнными файлами.
Первый файл: 8 бит, interlace 0. Второй: 16 бит и снова 0 — setImageInterlaceScheme(LINE) в нашей сборке не настроил кодировщик. Третий использует отдельный setInterlaceScheme(LINE): ожидаемый и проверяемый результат 16 бит, Adam7. В C-реализации методы вызывают разные функции Wand. Сравнение двух 16-битных файлов проверяет прежние пиксели, хотя их бинарные файлы разные. Поле interlace не гарантирует, что конкретный браузер покажет промежуточные проходы. На обычном 8-битном экране дополнительная точность может быть невидима; 16 бит полезны для последующей обработки, но увеличивают данные. Упражнение: принять PNG от стороннего оптимизатора. Решение — прочитать его новый IHDR, а не считать старую настройку PHP гарантией. Ошибка чтения или неверная сигнатура вызывает RuntimeException с объяснением.
Опорные понятия: объект и метод, константы PHP, аргументы и return, независимая копия через clone.
Проблема из реальной разработки
Why doesn't setImageInterlaceScheme() make a jpeg progressive?: Gmagick принимает interlace-параметр, getter подтверждает его, но сохранённый JPEG не становится прогрессивным. Разделяем настройку изображения и настройку записи; результат подтверждаем байтом IHDR реального PNG, а не успешным setter. Формат результата и версия указаны, JPEG не подменяем PNG. Обсуждение помогает выбрать задачу; контракт Gmagick и результат берём из первичных источников и выполненного кода, а не переносим API Imagick автоматически.
Принять режим из формы: разрешённые имена вместо случайных чисел
Редактор сайта выбирает «пиксельная карточка» или «серая карточка» в форме. Сервер должен получить понятный рецепт и отвергнуть опечатку, число или массив вместо одного значения. Этот пример создаёт серое превью 180 × 120 и сохраняет JSON с выбранным именем и разрешёнными числовыми значениями.

$choice = 'gray-card';
$recipe = resolveRecipe($choice);
$image->resizeImage(180, 120, $recipe['filter'], 1.0);
$image->setImageType($recipe['type']);Сначала разрешается короткое пользовательское имя, затем внутреннее имя константы переводится в int. resolveRecipe — собственная функция: словарь фиксирует допустимые комбинации и не выполняет произвольную строку пользователя. is_string отвергает массив из поля вида recipe[], array_key_exists отвергает неизвестный ключ. defined защищает от отсутствующей константы конкретного расширения; constant вызывается только для внутренней строки из allowlist. Это не способ обходить отсутствие API: если режим недоступен, программа сообщает RuntimeException, а не незаметно выбирает случайный запасной. Полная программа демонстрирует три отклонённых входа: greay-card, строку 13 и массив.
<?php
declare(strict_types=1);
require __DIR__ . '/gm104-constants-fixture.php';
gmRestore();
function resolveRecipe(mixed $choice): array {
$recipes = [
'pixel-card' => ['filter' => 'Gmagick::FILTER_POINT', 'type' => 'Gmagick::IMGTYPE_TRUECOLOR'],
'gray-card' => ['filter' => 'Gmagick::FILTER_LANCZOS', 'type' => 'Gmagick::IMGTYPE_GRAYSCALE'],
];
if (!is_string($choice) || !array_key_exists($choice, $recipes)) {
throw new InvalidArgumentException('Unknown recipe');
}
$resolved = [];
foreach ($recipes[$choice] as $key => $constantName) {
if (!defined($constantName)) {
throw new RuntimeException('Required constant is unavailable: ' . $constantName);
}
$resolved[$key] = constant($constantName);
}
return $resolved;
}
$choice = 'gray-card'; // Здесь окажется уже извлечённое значение поля формы.
$recipe = resolveRecipe($choice);
$image = new Gmagick(__DIR__ . '/constants-target.ppm');
$image->resizeImage(180, 120, $recipe['filter'], 1.0);
$image->setImageType($recipe['type']);
gmPng($image, 'gm104-constants-config-card.png');
foreach (['typo' => 'greay-card', 'numeric_string' => '13', 'array_field' => ['gray-card']] as $name => $bad) {
$errors[$name] = gmTry(fn() => resolveRecipe($bad));
}
$availability = ['Gmagick::COMPOSITE_BLEND' => defined('Gmagick::COMPOSITE_BLEND')];
file_put_contents(__DIR__ . '/gm104-constants-config-recipe.json', json_encode(['selected' => $choice, 'resolved' => $recipe, 'availability' => $availability], JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR));
$checks = [
'typo_rejected' => ($errors['typo']['class'] ?? '') === InvalidArgumentException::class,
'numeric_string_rejected' => ($errors['numeric_string']['class'] ?? '') === InvalidArgumentException::class,
'array_field_rejected' => ($errors['array_field']['class'] ?? '') === InvalidArgumentException::class,
'output_size' => $image->getImageWidth() === 180 && $image->getImageHeight() === 120
];
gmReport('gm104-constants-config', ["gmagick.resizeimage", "gmagick.setimagetype", "gmagick.writeimage"], ["gm104-constants-config-card.png"], $checks, $errors ?? [], ['choice' => $choice, 'recipe' => $recipe, 'availability' => $availability]);
echo "gray-card: 180x120; 3 invalid choices rejected\n";
Ожидаемый результат
gray-card: 180x120; 3 invalid choices rejected
Самостоятельный запуск: распакуйте архив и выполните php example.php с Gmagick. Включены собственный 16-битный PPM в base64, SHA256 и gm104-constants-fixture.php. Helper восстанавливает вход, сохраняет копии PNG и metrics.json; он не относится к стандартному API PHP. Короткий фрагмент операции показан выше, полный код создаёт все перечисленные результаты. Настройки подтверждаются сохранёнными файлами.
Названия pixel-card/gray-card — интерфейс нашего сервиса, а не встроенные пресеты PHP. COMPOSITE_BLEND в официальном каталоге есть, а в проверенной сборке нет; в квитанции безопасно записывается false, без обращения к несуществующей константе. До обработки загрузки дополнительно нужны проверки файла и ограничений, которые разбираются отдельно. Упражнение: добавить параметр ширины из формы. Не передавайте произвольное число в resizeImage: сначала задайте разумный диапазон, проверьте целое значение и определите политику пропорций. В этом примере размеры намеренно фиксированы, поэтому одна настройка не превращается в неограниченный расход памяти.
Опорные понятия: объект и метод, константы PHP, аргументы и return, независимая копия через clone.
Продолжение: HTML-поле и $_POST, проверка загружаемого файла.
Повторяемый рецепт мини-галереи: превью, рамка и эффект
Теперь соберём маленькую галерею вариантов из одного исходника. Официальный первый пример Gmagick связывает чтение, thumbnail, рамку, масляный эффект и запись. Здесь этот маршрут разобран на функцию, создающую два реальных файла: чистое превью и оформленный вариант, плюс JSON с именами и размерами для HTML-галереи.


$image->thumbnailImage(120, 0);
$image->borderImage(new GmagickPixel('#f2b84b'), 8, 8);
$image->oilPaintImage(0.3);
$image->setImageFormat('PNG');
$image->setImageDepth(8);
$image->writeImage($output);В thumbnailImage второй размер 0 разрешает рассчитать высоту по пропорции: 360 × 240 становится 120 × 80. Рамка добавляет по 8 пикселей с каждой стороны, поэтому файл получает 136 × 96. Цвет задаётся объектом GmagickPixel — это соответствует сигнатуре borderImage; обычная строка с именем цвета в старом вводном примере не заменяет изучение текущего типа аргумента. Радиус oilPaintImage 0.3 относится к алгоритму эффекта, а не к толщине рамки. Эффект применяется после рамки, как в официальной последовательности. Его видимость зависит от рисунка и масштаба; программа не обещает выразительную живопись на любом маленьком значке. Для превращения фотографии товара в художественную иллюстрацию сохраняйте обычный оригинал отдельно.
<?php
declare(strict_types=1);
require __DIR__ . '/gm104-constants-fixture.php';
gmRestore();
function makeGalleryCard(string $input, string $output, bool $paint): array {
$image = new Gmagick($input);
$image->thumbnailImage(120, 0);
$image->borderImage(new GmagickPixel('#f2b84b'), 8, 8);
if ($paint) {
$image->oilPaintImage(0.3);
}
$image->setImageFormat('PNG');
$image->setImageDepth(8);
$image->writeImage($output);
return ['width' => $image->getImageWidth(), 'height' => $image->getImageHeight(), 'paint' => $paint];
}
$input = __DIR__ . '/constants-target.ppm';
$manifest = [];
foreach (['clean' => false, 'paint' => true] as $name => $paint) {
$filename = 'gm104-constants-gallery-' . $name . '.png';
$manifest[$filename] = makeGalleryCard($input, __DIR__ . '/' . $filename, $paint);
}
file_put_contents(__DIR__ . '/gm104-constants-gallery-gallery.json', json_encode($manifest, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR));
$checks = [
'two_cards_same_canvas' => count($manifest) === 2 && array_reduce($manifest, fn($ok, $card) => $ok && $card['width'] === 136 && $card['height'] === 96, true),
'source_still_original' => hash_file('sha256', $input) === GM_INPUT_HASHES['constants-target.ppm']
];
gmReport('gm104-constants-gallery', ["gmagick.thumbnailimage", "gmagick.borderimage", "gmagick.oilpaintimage", "gmagick.writeimage"], ["gm104-constants-gallery-clean.png", "gm104-constants-gallery-paint.png"], $checks, $errors ?? [], ['gallery' => $manifest]);
echo "gallery: 2 PNG files, 136x96 each; original preserved\n";
Ожидаемый результат
gallery: 2 PNG files, 136x96 each; original preserved
Самостоятельный запуск: распакуйте архив и выполните php example.php с Gmagick. Включены собственный 16-битный PPM в base64, SHA256 и gm104-constants-fixture.php. Helper восстанавливает вход, сохраняет копии PNG и metrics.json; он не относится к стандартному API PHP. Короткий фрагмент операции показан выше, полный код создаёт все перечисленные результаты. Настройки подтверждаются сохранёнными файлами.
makeGalleryCard заново читает исходник при каждом вызове, поэтому вторая карточка не получает рамку поверх первой. Параметр $paint выбирает ветку if; return возвращает массив измерений, а сам PNG записывается через writeImage. Результат функции — информация для приложения, файл — для браузера. foreach применяет два заранее заданных варианта и записывает gallery.json. __DIR__ и входной base64 находятся в архиве, поэтому отсутствующие файлы не нужно угадывать. Если чтение, операция или запись не удалась, Gmagick выбросит исключение; реальному сервису нужен обработчик, который сообщит об ошибке и не опубликует неполную галерею. Упражнение: показывать только чистую карточку в магазине, а художественную — в редакторском просмотре. Решение: хранить обе записи, но выбирать соответствующее имя файла на уровне шаблона, не перегенерировать картинку на каждый просмотр.
Опорные понятия: объект и метод, константы PHP, аргументы и return, независимая копия через clone.
Дальше: пропорции превью, ICC и цвет web-изображения, обработка ошибки без ложного успешного результата.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


