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

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

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

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

Глава 404 · После переменных, объектов и первого PNG

Gmagick: полный каталог констант и понятные рецепты обработки

Имена режимов вместо случайных чисел; фильтры, смешивание, глубина PNG, interlace, проверка настроек и собственная мини-галерея.

Именованный режим: сделать серую версию карточки

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

Исходная цветная карточка: сетка, круг и шкала
Исходная цветная карточка: сетка, круг и шкала
Серая карточка: структура осталась, цветовые различия исчезли
Серая карточка: структура осталась, цветовые различия исчезли
Как имя режима превращается в результат
  1. constants-target.ppm: цветная сетка и круг, 360 × 240.
  2. Gmagick::IMGTYPE_GRAYSCALE выбирает преобразование в серое.
  3. setImageType меняет пиксельное представление объекта.
  4. 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 19Alpha: степень покрытия, противоположная 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 15Sinc-ядро; резкие переходы могут сопровождаться колебаниями.
Тип пиксельного изображения — 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 2BZip-сжатие при поддержке формата/сборки.
Gmagick::COMPRESSION_FAXОпределена; int 3CCITT Group 3 для двоичных факсимильных изображений.
Gmagick::COMPRESSION_GROUP4Определена; int 4CCITT Group 4 для двоичных изображений.
Gmagick::COMPRESSION_JPEGОпределена; int 5JPEG-сжатие с потерями.
Gmagick::COMPRESSION_JPEG2000Не определена в проверенной сборкеJPEG 2000; требует соответствующей поддержки.
Gmagick::COMPRESSION_LOSSLESSJPEGОпределена; int 6Lossless JPEG; поддержка зависит от кодировщика.
Gmagick::COMPRESSION_LZWОпределена; int 7LZW-сжатие без потерь.
Gmagick::COMPRESSION_RLEОпределена; int 8Сжатие серий одинаковых значений, RLE.
Gmagick::COMPRESSION_ZIPОпределена; int 9Deflate/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 7Opacity-канал с обратным направлением шкалы.
Gmagick::CHANNEL_MATTEОпределена; int 9Matte-канал прозрачности.
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 1RGB-модель; точную характеристику передачи не угадываем по одному имени.
Gmagick::COLORSPACE_GRAYОпределена; int 2Одноканальные оттенки серого.
Gmagick::COLORSPACE_TRANSPARENTОпределена; int 3Специальный Transparent-режим GraphicsMagick; не замена alpha-маске.
Gmagick::COLORSPACE_OHTAОпределена; int 4Координаты Ohta для обработки изображений.
Gmagick::COLORSPACE_LABОпределена; int 14CIE L*a*b*: светлота и две цветоразностные оси.
Gmagick::COLORSPACE_XYZОпределена; int 5CIE XYZ: трёхстимульные координаты.
Gmagick::COLORSPACE_YCBCRОпределена; int 17Яркостно-цветоразностные YCbCr.
Gmagick::COLORSPACE_YCCОпределена; int 6Photo 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 11sRGB-модель; константа не заменяет проверенный 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: рядом видно, какие пиксели появились из-за каждого фильтра.

Один исходник для честного сравнения фильтров
Один исходник для честного сравнения фильтров
Point: настоящее превью 90 × 60
Point: настоящее превью 90 × 60
Lanczos: настоящее превью 90 × 60
Lanczos: настоящее превью 90 × 60
Point: то же превью, увеличенное в 4 раза без сглаживания
Point: то же превью, увеличенное в 4 раза без сглаживания
Lanczos: то же превью, увеличенное в 4 раза без сглаживания
Lanczos: то же превью, увеличенное в 4 раза без сглаживания
$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 показывает непрозрачную золотую плашку сверху слева; второй — умножение цвета снизу справа, где просвечивает структура шкалы.

Исходник до добавления плашки
Исходник до добавления плашки
Over, верхний левый угол: непрозрачная плашка в (12, 12)
Over, верхний левый угол: непрозрачная плашка в (12, 12)
Multiply, нижний правый угол: цвет плашки смешан с нижней шкалой в (268, 188)
Multiply, нижний правый угол: цвет плашки смешан с нижней шкалой в (268, 188)
[$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 в заголовке.

Обычный PNG: 8 бит на компонент, без interlace
Обычный PNG: 8 бит на компонент, без interlace
PNG 16 бит: image-setter LINE не включил interlace в проверенной сборке
PNG 16 бит: image-setter LINE не включил interlace в проверенной сборке
PNG 16 бит: настройка записи LINE включает Adam7, пиксели сохраняются
PNG 16 бит: настройка записи LINE включает Adam7, пиксели сохраняются
$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.

Запросить 8/16 бит и interlace, затем прочитать реальный PNGСамостоятельный пример
<?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 с выбранным именем и разрешёнными числовыми значениями.

Разрешённый gray-card: серое превью 180 × 120
Разрешённый gray-card: серое превью 180 × 120
$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-галереи.

Мини-галерея: содержимое 120 × 80 и рамка по 8 пикселей — файл 136 × 96
Мини-галерея: содержимое 120 × 80 и рамка по 8 пикселей — файл 136 × 96
Тот же рецепт с масляным эффектом после рамки — 136 × 96
Тот же рецепт с масляным эффектом после рамки — 136 × 96
$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. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.