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

Дерево руководства
Глава 341 · После первых фигур
ImagickDraw: залить область, наложить свой значок и сохранить прозрачность
Увидеть пять PAINT-режимов, встроить снимок собственного изображения и отделить alpha заливки/контура от готового PNG; перенести legacy matte и Alpha-alias на рабочие современные операции.
Поставить свой значок подтверждения на карточку
Сервису нужна готовая карточка с наглядной отметкой: бирюзовый предмет и золотистый круг с белой галочкой. Значок создадим кодом на прозрачном холсте и поместим поверх карточки. У прозрачных углов нет белой прямоугольной подложки, поэтому знак аккуратно лежит на существующем фоне.

Ключевой вызов ниже — поясняющая выдержка, не отдельная программа: $logo уже содержит изображение, $draw — очередь, $image — готовый холст. Полный самостоятельный исходник с их созданием находится сразу дальше.
$draw->composite(Imagick::COMPOSITE_OVER, 260, 20, 80, 80, $logo);
$image->drawImage($draw);
$image->writeImage(__DIR__ . '/card.png');Composite записывает снимок источника в очередь; COMPOSITE_OVER означает обычное наложение с alpha. Первые два числа — левый верхний угол, следующие два — размер вставки. DrawImage исполняет очередь на пикселях, writeImage сохраняет файл. Знак -> вызывает метод объекта, запятые разделяют аргументы; $logo — источник, а $image — получатель результата.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(360, 220, 'white');
$image->setImageFormat('png');
$card = new ImagickDraw();
$card->setStrokeColor('none');
$card->setFillColor('#e3f3ef');
$card->roundRectangle(10, 10, 350, 210, 16, 16);
$card->setFillColor('#146c74');
$card->rectangle(55, 70, 260, 180);
$image->drawImage($card);
$card->clear();
$logo = new Imagick();
$logo->newImage(80, 80, 'none');
$logo->setImageFormat('png');
$mark = new ImagickDraw();
$mark->setStrokeColor('none');
$mark->setFillColor('#ffe08a');
$mark->circle(40, 40, 70, 40);
$mark->setFillColor('none');
$mark->setStrokeColor('white');
$mark->setStrokeWidth(7);
$mark->polyline([['x' => 23, 'y' => 40], ['x' => 36, 'y' => 53], ['x' => 58, 'y' => 27]]);
$logo->drawImage($mark);
$mark->clear();
$draw = new ImagickDraw();
$draw->composite(Imagick::COMPOSITE_OVER, 260, 20, 80, 80, $logo);
$logo->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/first-card-with-own-mark.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'first-card-with-own-mark.png', "\n";
$image->clear();
Результат: first-card-with-own-mark.png 360×220. На мятной панели бирюзовый прямоугольный предмет, справа сверху золотистый круг с белой галочкой. Источник создан целиком кодом, очищен после записи composite и всё равно корректно воспроизведён из снимка очереди. Сохраните example.php в отдельной папке и выполните php example.php при PHP с imagick. PNG появится рядом; откройте его обычным просмотрщиком при 100%. Прозрачный PNG смотрите на светлом и тёмном фоне: белый фон просмотрщика не доказывает отсутствие alpha. Шрифты, входные файлы, интернет и shell-команды не нужны. Повторный запуск заменяет одноимённый учебный PNG.
Перед началом полезны простые фигуры и очередь Draw и настоящий холст Imagick. Здесь разберём саму покраску, вставку и прозрачность по шагам, а не будем считать их свойствами одного «цвета».
Разделить покраску пикселей, вставку изображения и alpha

| Задача | Инструмент | Что он не делает |
|---|---|---|
| Заполнить одну ячейку | Color + PAINT_FLOODFILL от точки внутри | Не ищет логический элемент по названию и не закрывает разрыв контура. |
| Поставить готовый знак | Draw::composite + источник Imagick + положение/размер | Не меняет размер конечного холста и не получает alpha из fill setter. |
| Сделать новую заливку/контур мягче | SetFillOpacity/SetStrokeOpacity; Alpha-alias только для миграции | Не стирает готовые пиксели и не задаёт alpha всем частям PNG. |
| Удалить фон у готового рисунка | Современная операция над alpha/цветом, с явной областью | Белый цвет не превращается в прозрачность сам по себе. |
Физическая модель: Color — кисть/заливка по выбранным пикселям, composite — наклейка отдельного рисунка, alpha — степень его видимости. Это аналогия ролей, а не обещание устройства памяти. Прозрачное место хранит alpha 0 и может иметь любые скрытые RGB-байты. При наложении на непрозрачный фон итог уже непрозрачен, хотя исходный слой был полупрозрачным.
Увидеть пять режимов на одном и том же контуре

<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(750, 180, 'white');
$image->setImageFormat('png');
$methods = [Imagick::PAINT_POINT, Imagick::PAINT_REPLACE, Imagick::PAINT_FLOODFILL, Imagick::PAINT_FILLTOBORDER, Imagick::PAINT_RESET];
foreach ($methods as $index => $method) {
$panel = new Imagick();
$panel->newImage(150, 180, 'white');
$panel->setImageFormat('png');
$outline = new ImagickDraw();
$outline->setFillColor('none');
$outline->setStrokeColor('black');
$outline->setStrokeWidth(4);
$outline->rectangle(10, 20, 60, 160);
$outline->rectangle(90, 20, 140, 160);
$panel->drawImage($outline);
$outline->clear();
$draw = new ImagickDraw();
$draw->setFillColor('#146c74');
$draw->setStrokeColor('black');
$draw->color(35, 90, $method);
$panel->drawImage($draw);
$image->compositeImage($panel, Imagick::COMPOSITE_OVER, 150 * $index, 0);
$draw->clear();
$panel->clear();
}
echo 'order=Point,Replace,Floodfill,FillToBorder,Reset', "\n";
$path = __DIR__ . '/five-actual-paint-methods.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'five-actual-paint-methods.png', "\n";
$image->clear();
Результат: five-actual-paint-methods.png 750×180. В каждой панели 150×180 сначала два чёрных замкнутых контура. Point изменил только один пиксель в (35,90), поэтому он крошечный; Replace перекрасил все совпадающие белые области, сохранив чёрные контуры; Floodfill — только внутренность левого. FillToBorder с native border_color по умолчанию и Reset дали сплошную бирюзовую панель, включая прежние чёрные линии. Консоль до имени файла: order=Point,Replace,Floodfill,FillToBorder,Reset. Сохраните example.php в отдельной папке и выполните php example.php при PHP с imagick. PNG появится рядом; откройте его обычным просмотрщиком при 100%. Прозрачный PNG смотрите на светлом и тёмном фоне: белый фон просмотрщика не доказывает отсутствие alpha. Шрифты, входные файлы, интернет и shell-команды не нужны. Повторный запуск заменяет одноимённый учебный PNG.
FillToBorder по смыслу останавливается на отдельном border_color в native DrawInfo, а не на текущем stroke. В этом PHP Draw нет вызова, которым мы в примере задали бы нужный border_color; установка чёрного stroke и даже border color самого Imagick не сделала его чёрным для этой команды. Поэтому не используйте картинку с контуром как доказательство правильной границы. Для явно чёрной границы современная проверенная альтернатива: floodFillPaintImage('#146c74', 0, 'black', 25, 40, true) на соответствующем маленьком растре. Target black и invert true выбирают заливку до заданного цвета; параметры отличаются от обычного совпадения seed-цвета. Подробнее — официальный floodFillPaintImage.
Point полезен для точного пиксельного исправления, но не закрашивает видимую большую ячейку. В схеме его можно увеличить/пометить стрелкой; это увеличение не должно выдаваться за сам PNG. Для фото с JPEG-шумом, полутоновых границ и теней этот однотонный пример не заменяет маску и обоснованный допуск цвета.
Связный внешний фон и белая внутренняя деталь — разные области



Для фона от точки нужен связный обход, для любого совпадающего цвета — глобальная замена. Белый круг внутри предмета в workflow matte отделён бирюзовой областью от белого наружного фона. Floodfill с seed (0,0) оставляет круг непрозрачным, тогда как глобальное transparentPaintImage по white могло бы удалить его тоже. Это выбор области, не особенность белого как цвета.
Сравнивайте alpha численно и на разных подложках. Прозрачный пиксель может хранить RGB white: это не ошибка и не видимый белый прямоугольник. У JPEG alpha нет; при сохранении в JPEG заранее выберите фон смешивания, иначе смысл «вырезанного» предмета потеряется.
Мигрировать старый вызов без сокрытия предупреждений


В архиве alias-примера handler принимает только E_DEPRECATED с именем именно ожидаемого метода. Счётчик подтверждает реальный вызов предупреждения, finally возвращает прежний handler. Это учебная диагностика миграции, а не рекомендуемая обвязка вокруг каждого нового рисунка. В новом коде используйте современное имя и обычную обработку ошибок; не оставляйте alias только ради сокрытия сообщения.
Стандартная alpha непрозрачности: 0 — ничего не видно, 1 — полностью видно. На прозрачном холсте полупрозрачная линия сохраняет свою alpha; поверх непрозрачной заливки или фона итоговый пиксель может стать alpha 1 и смешанным RGB. У штриха половина толщины лежит снаружи математического контура, поэтому для проверки его alpha выбрана наружная сторона. Эти различия показаны actual RGBA, а не белым фоном скриншота.
Собрать готовый макет с заливкой, мягкой подсветкой и знаком

<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(600, 360, 'white');
$image->setImageFormat('png');
$panel = new ImagickDraw();
$panel->setStrokeColor('none');
$panel->setFillColor('#e3f3ef');
$panel->roundRectangle(30, 30, 570, 330, 18, 18);
$panel->setFillColor('white');
$panel->setStrokeColor('black');
$panel->setStrokeWidth(4);
$panel->rectangle(60, 80, 250, 280);
$panel->rectangle(310, 80, 500, 280);
$image->drawImage($panel);
$panel->clear();
$fill = new ImagickDraw();
$fill->setFillColor('#146c74');
$fill->color(100, 150, Imagick::PAINT_FLOODFILL);
$image->drawImage($fill);
$fill->clear();
$highlight = new ImagickDraw();
$highlight->setStrokeColor('none');
$highlight->setFillColor('#ffe08a');
$highlight->setFillOpacity(0.5);
$highlight->rectangle(75, 95, 235, 125);
$image->drawImage($highlight);
$highlight->clear();
$outline = new ImagickDraw();
$outline->setFillColor('none');
$outline->setStrokeColor('#c25732');
$outline->setStrokeOpacity(0.5);
$outline->setStrokeWidth(8);
$outline->rectangle(300, 70, 510, 290);
$image->drawImage($outline);
$outline->clear();
$logo = new Imagick();
$logo->newImage(80, 80, 'none');
$logo->setImageFormat('png');
$mark = new ImagickDraw();
$mark->setStrokeColor('none');
$mark->setFillColor('#ffe08a');
$mark->circle(40, 40, 70, 40);
$mark->setFillColor('none');
$mark->setStrokeColor('white');
$mark->setStrokeWidth(7);
$mark->polyline([['x' => 23, 'y' => 40], ['x' => 36, 'y' => 53], ['x' => 58, 'y' => 27]]);
$logo->drawImage($mark);
$mark->clear();
$draw = new ImagickDraw();
$draw->composite(Imagick::COMPOSITE_OVER, 470, 230, 80, 80, $logo);
$logo->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/painted-layout-with-own-mark.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'painted-layout-with-own-mark.png', "\n";
$image->clear();
Результат: painted-layout-with-own-mark.png 600×360. На мятной панели две чёрные рамки. Внутренность левой бирюзовая после Floodfill; правая белая. Золотистая полоска слева смешана с бирюзовым при fill opacity 0.5, дополнительная рамка справа красноватая при stroke opacity 0.5. Внизу справа собственный золотистый круг с белой галочкой, вставленный COMPOSITE_OVER. В новом макете использованы современные opacity-имена, без legacy-предупреждений. Сохраните example.php в отдельной папке и выполните php example.php при PHP с imagick. PNG появится рядом; откройте его обычным просмотрщиком при 100%. Прозрачный PNG смотрите на светлом и тёмном фоне: белый фон просмотрщика не доказывает отсутствие alpha. Шрифты, входные файлы, интернет и shell-команды не нужны. Повторный запуск заменяет одноимённый учебный PNG.
Упражнение: перенесите знак в левый нижний угол с отступом 20 от краёв холста. Решение: для источника 80×80 на холсте 600×360 выберите composite x=20, y=260; проверьте, что знак не скрывает важную ячейку. Если нужен отступ от мятной панели, считайте её границы отдельно — это другая область. Следующий шаг: координаты фигур, заливка и правила областей, жизненный цикл очереди.
Выбрать операцию по нужному результату
- Для одной замкнутой однотонной области: Floodfill от проверенной точки; для всех совпадений цвета: Replace.
- Для готовой собственной картинки: composite с оператором, положением и согласованным размером; источник хранится снимком.
- Для новых фигур: отдельные setFillOpacity и setStrokeOpacity; устаревшие Alpha-имена нужны для чтения/миграции старого кода.
- Для удаления фона: рабочая современная операция с явной областью и проверкой alpha; matte не доступен в данной IM7-сборке.
- Для прозрачного файла сохраняйте PNG и проверяйте реальный alpha; шахматная подложка лишь помогает увидеть его.
Здесь раскрыты пять последних отдельных методов Draw из этого пакета, но это не заявление о завершении всего Imagick или PHP Manual. Продолжение по задаче: цвет/непрозрачность заливки, контур и alpha, добавить подпись.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
ImagickDraw::colorЗаполнить одну замкнутую ячейку макета или поменять фирменный цвет сразу в нескольких одинаковых областях.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::color(float $x, float $y, int $paint): boolЗаполнить одну замкнутую ячейку макета или поменять фирменный цвет сразу в нескольких одинаковых областях.
Color записывает покраску от координат x/y текущим fill и выбранным PAINT_*. Point меняет один пиксель, Replace ищет совпадения с цветом образца по всему изображению, Floodfill идёт по связным совпадающим соседям, Reset перекрашивает всё. FillToBorder использует отдельный native border_color; цвет stroke не задаёт эту границу автоматически.

Синтаксис, параметры и результат
ImagickDraw::color(float $x, float $y, int $paint): bool| Параметр | Что передать и зачем |
|---|---|
| $x | float, x стартовой/целевой точки в пиксельных координатах; в примерах положительное целое внутри нужной области. |
| $y | float, y стартовой/целевой точки; y растёт вниз. Точка на контуре, за холстом или внутри другого элемента выбирает другую область либо приводит к отказу во время рисования. |
| $paint | int, Imagick::PAINT_POINT, REPLACE, FLOODFILL, FILLTOBORDER или RESET с полным PAINT_ префиксом. Это режим выбора пикселей, не новый цвет; цвет передан setFillColor. |
bool по сигнатуре; официальный prose говорит об отсутствии результата. В текущем wrapper команда передаётся native DrawColor и возвращается true. Это постановка команды, не гарантия успешной растеризации; возможный отказ drawImage и запись PNG проверяются отдельно.
Официальная доступность: PECL imagick 2, PECL imagick 3. В замороженной записи нет отдельного changelog и отметок deprecated/removed; исходная отметка неполной документации сохранена. Это не отменяет реально обнаруженных native-ограничений: matte отсутствует при данной IM7-сборке, два Alpha-alias выдают E_DEPRECATED. Полные исходные поля сохранены в контракте; уточнения привязаны к PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46. Старую IM6-ветку здесь не выполняли.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(360, 220, 'white');
$image->setImageFormat('png');
$outline = new ImagickDraw();
$outline->setFillColor('none');
$outline->setStrokeColor('black');
$outline->setStrokeWidth(4);
$outline->rectangle(20, 40, 140, 180);
$outline->rectangle(220, 40, 340, 180);
$image->drawImage($outline);
$outline->clear();
$draw = new ImagickDraw();
$draw->setFillColor('#146c74');
$draw->color(60, 110, Imagick::PAINT_FLOODFILL);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/one-closed-region-filled.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'one-closed-region-filled.png', "\n";
$image->clear();
Результат: one-closed-region-filled.png 360×220. Левый замкнутый прямоугольник закрашен бирюзовым от точки (60,110); правая белая область и фон остаются белыми, чёрные границы сохранены. Цвет берётся из fill, а режим FLOODFILL ограничивает связную область исходного цвета. Сохраните example.php в отдельной папке и выполните php example.php при PHP с imagick. PNG появится рядом; откройте его обычным просмотрщиком при 100%. Прозрачный PNG смотрите на светлом и тёмном фоне: белый фон просмотрщика не доказывает отсутствие alpha. Шрифты, входные файлы, интернет и shell-команды не нужны. Повторный запуск заменяет одноимённый учебный PNG.
Практическая задача: Перекрасить все одинаковые элементы макета, даже раздельные
Две золотистые ячейки должны стать бирюзовыми при смене фирменного цвета. Они не соединены; REPLACE заменяет пиксели по цвету образца во всём изображении, а не ограничивается соседями первой ячейки.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(360, 220, 'white');
$image->setImageFormat('png');
$base = new ImagickDraw();
$base->setStrokeColor('none');
$base->setFillColor('#ffe08a');
$base->rectangle(20, 40, 140, 180);
$base->rectangle(220, 40, 340, 180);
$image->drawImage($base);
$base->clear();
$draw = new ImagickDraw();
$draw->setFillColor('#146c74');
$draw->color(60, 110, Imagick::PAINT_REPLACE);
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/rebrand-two-separated-cells.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'rebrand-two-separated-cells.png', "\n";
$image->clear();
Результат: rebrand-two-separated-cells.png 360×220. Обе бывшие золотистые ячейки стали бирюзовыми, разделяющее их белое поле осталось белым. Это глобальное совпадение цвета образца, а не распознавание логического элемента приложения. На фото и сглаженных краях близкие цвета требуют отдельной политики fuzz/маски. Сохраните example.php в отдельной папке и выполните php example.php при PHP с imagick. PNG появится рядом; откройте его обычным просмотрщиком при 100%. Прозрачный PNG смотрите на светлом и тёмном фоне: белый фон просмотрщика не доказывает отсутствие alpha. Шрифты, входные файлы, интернет и shell-команды не нужны. Повторный запуск заменяет одноимённый учебный PNG.
Ошибки, альтернативы и стоимость
Replace затрагивает и одинаковые по цвету детали, не только фон. Floodfill протекает через разрывы контура и зависит от фактических цветов/fuzz. В проверенном Draw с чёрной stroke-границей FillToBorder заполнил весь холст, включая границы: его native border_color не был задан как чёрный. Для явно заданной границы используйте современный floodFillPaintImage с нужным target/invert либо маску; не обещайте, что stroke сам является border_color. Reset стирает все прежние цвета.
Операции связаны с реальными размерами и количеством пикселей. Глобальная замена/заливка может пройти большую область, composite хранит копию источника, растеризация и сохранение требуют памяти. Ограничивайте размеры входа и число повторов. Сначала определите область/источник и формат PNG, затем проверяйте результат; один setter не является общей проверкой цепочки. В примерах нет сетевых загрузок, непроверенных файлов, шрифтов или shell.
Связанные шаги: ImagickDraw::composite · ImagickDraw::matte · ImagickDraw::setFillAlpha · ImagickDraw::setStrokeAlpha. Современные настройки: setFillOpacity, setStrokeOpacity. Ошибки — исключения и Error, прозрачность — цвет и alpha обводки.
ImagickDraw::compositeПоместить готовый значок подтверждения поверх карточки в заданном месте и размере, сохранив прозрачные углы.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::composite(int $composite, float $x, float $y, float $width, float $height, Imagick $image): boolПоместить готовый значок подтверждения поверх карточки в заданном месте и размере, сохранив прозрачные углы.
Метод принимает источник Imagick и ставит в Draw команду вставки с operator, x/y и width/height. В текущем native-коде источник клонируется и встраивается в векторный поток как blob/base64, поэтому очередь хранит снимок на момент вызова. Сам целевой PNG изменится позже, когда его Imagick выполнит drawImage.

Синтаксис, параметры и результат
ImagickDraw::composite(int $composite, float $x, float $y, float $width, float $height, Imagick $image): bool| Параметр | Что передать и зачем |
|---|---|
| $composite | int, Imagick::COMPOSITE_*; в примерах COMPOSITE_OVER — обычное наложение с учётом alpha источника. |
| $x | float, x левого верхнего угла вставки на целевом холсте. |
| $y | float, y левого верхнего угла вставки; не координата центра. |
| $width | float, целевая ширина вставляемого изображения. В примерах явно 80 или 120; нативный контракт также допускает 0 для исходной ширины. Не путайте с шириной конечного холста. |
| $height | float, целевая высота вставки. Для сохранения пропорций выбирайте согласованную пару; произвольная пара может исказить источник. Native 0 использует исходную высоту. |
| $image | Imagick, источник с настоящим изображением; в примерах он целиком создаётся кодом, без сети, внешних картинок и прав на чужие материалы. Это источник, не целевой $image, на котором позднее вызывается drawImage. |
bool, true при успешной постановке команды. При пустом источнике, отказе копирования/сериализации возможен native-отказ, который PHP wrapper преобразует в исключение. Успех постановки не заменяет проверку drawImage/writeImage. Возвращается не новый Imagick, а флаг.
Официальная доступность: PECL imagick 2, PECL imagick 3. В замороженной записи нет отдельного changelog и отметок deprecated/removed; исходная отметка неполной документации сохранена. Это не отменяет реально обнаруженных native-ограничений: matte отсутствует при данной IM7-сборке, два Alpha-alias выдают E_DEPRECATED. Полные исходные поля сохранены в контракте; уточнения привязаны к PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46. Старую IM6-ветку здесь не выполняли.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(360, 220, 'white');
$image->setImageFormat('png');
$logo = new Imagick();
$logo->newImage(80, 80, 'none');
$logo->setImageFormat('png');
$mark = new ImagickDraw();
$mark->setStrokeColor('none');
$mark->setFillColor('#ffe08a');
$mark->circle(40, 40, 70, 40);
$mark->setFillColor('none');
$mark->setStrokeColor('white');
$mark->setStrokeWidth(7);
$mark->polyline([['x' => 23, 'y' => 40], ['x' => 36, 'y' => 53], ['x' => 58, 'y' => 27]]);
$logo->drawImage($mark);
$mark->clear();
$draw = new ImagickDraw();
$draw->composite(Imagick::COMPOSITE_OVER, 20, 20, 80, 80, $logo);
$logo->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/own-mark-over-white.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'own-mark-over-white.png', "\n";
$image->clear();
Результат: own-mark-over-white.png 360×220. В области 80×80 с левым верхним углом (20,20) расположен свой золотистый круг с белой галочкой. Углы исходного PNG прозрачны и пропускают белый фон. Источник очищен после постановки команды, но встроенный снимок в очереди продолжает работать. Сохраните example.php в отдельной папке и выполните php example.php при PHP с imagick. PNG появится рядом; откройте его обычным просмотрщиком при 100%. Прозрачный PNG смотрите на светлом и тёмном фоне: белый фон просмотрщика не доказывает отсутствие alpha. Шрифты, входные файлы, интернет и shell-команды не нужны. Повторный запуск заменяет одноимённый учебный PNG.
Практическая задача: Проверить снимок источника и явный новый размер
Сначала поставим в очередь старый круг 80×80. Потом закрасим сам источник красным и поставим его вторую версию размером 120×120. Первая команда должна сохранить прежний круг, вторая получить новый квадрат.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(360, 220, 'white');
$image->setImageFormat('png');
$logo = new Imagick();
$logo->newImage(80, 80, 'none');
$logo->setImageFormat('png');
$mark = new ImagickDraw();
$mark->setStrokeColor('none');
$mark->setFillColor('#ffe08a');
$mark->circle(40, 40, 70, 40);
$mark->setFillColor('none');
$mark->setStrokeColor('white');
$mark->setStrokeWidth(7);
$mark->polyline([['x' => 23, 'y' => 40], ['x' => 36, 'y' => 53], ['x' => 58, 'y' => 27]]);
$logo->drawImage($mark);
$mark->clear();
$draw = new ImagickDraw();
$draw->composite(Imagick::COMPOSITE_OVER, 20, 60, 80, 80, $logo);
$change = new ImagickDraw();
$change->setStrokeColor('none');
$change->setFillColor('#c25732');
$change->rectangle(0, 0, 79, 79);
$logo->drawImage($change);
$change->clear();
$draw->composite(Imagick::COMPOSITE_OVER, 220, 40, 120, 120, $logo);
$logo->clear();
$image->drawImage($draw);
$draw->clear();
echo 'first=snapshot-80x80; second=changed-source-120x120', "\n";
$path = __DIR__ . '/queued-source-snapshots-and-size.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'queued-source-snapshots-and-size.png', "\n";
$image->clear();
Результат: queued-source-snapshots-and-size.png 360×220. Слева золотистый круг с галочкой в прежней области 80×80, справа красный квадрат ровно 120×120. Изменение/очистка источника после первого composite не меняет встроенный снимок первой команды. Указанные размеры изменяют только вставляемое изображение, холст остаётся 360×220. Консоль до имени файла: first=snapshot-80x80; second=changed-source-120x120. Сохраните example.php в отдельной папке и выполните php example.php при PHP с imagick. PNG появится рядом; откройте его обычным просмотрщиком при 100%. Прозрачный PNG смотрите на светлом и тёмном фоне: белый фон просмотрщика не доказывает отсутствие alpha. Шрифты, входные файлы, интернет и shell-команды не нужны. Повторный запуск заменяет одноимённый учебный PNG.
Ошибки, альтернативы и стоимость
Новый размер вставки не меняет размер конечного холста: выходящие за него части обрезаются. Альфа источника и fill/stroke opacity Draw — разные вещи; нельзя управлять готовым логотипом setter заливки как обычной фигурой. Base64-снимки увеличивают очередь и расход памяти; для большого готового растра можно использовать прямой Imagick::compositeImage без сохранения Draw-потока. Не храните огромные исходники в повторяемой очереди без нужды.
Операции связаны с реальными размерами и количеством пикселей. Глобальная замена/заливка может пройти большую область, composite хранит копию источника, растеризация и сохранение требуют памяти. Ограничивайте размеры входа и число повторов. Сначала определите область/источник и формат PNG, затем проверяйте результат; один setter не является общей проверкой цепочки. В примерах нет сетевых загрузок, непроверенных файлов, шрифтов или shell.
Связанные шаги: ImagickDraw::color · ImagickDraw::matte · ImagickDraw::setFillAlpha · ImagickDraw::setStrokeAlpha. Современные настройки: setFillOpacity, setStrokeOpacity. Ошибки — исключения и Error, прозрачность — цвет и alpha обводки.
ImagickDraw::matteСтарый пример предлагает удалить фон через matte, но на актуальной сборке такого метода нет. Нужно понять причину и всё равно получить прозрачный PNG.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::matte(float $x, float $y, int $paint): boolСтарый пример предлагает удалить фон через matte, но на актуальной сборке такого метода нет. Нужно понять причину и всё равно получить прозрачный PNG.
Исторический matte менял opacity-канал выбранных PAINT-пикселей, а не рисовал белую краску. В Imagick 3.8.1 он компилируется только при ImageMagick ниже 7; при нашей библиотеке 7.1.1-46 метода нет. Два примера действительно вызывают его и ловят Error отсутствующего метода, после чего создают прозрачность рабочими современными операциями над Imagick.

Синтаксис, параметры и результат
ImagickDraw::matte(float $x, float $y, int $paint): bool| Параметр | Что передать и зачем |
|---|---|
| $x | float, историческая x координата выбранной точки/начала области. |
| $y | float, историческая y координата. В новом примере (0,0) относится к внешнему фону, а не к белой детали внутри предмета. |
| $paint | int, исторический PAINT_* режим: Point — точка, Replace — совпадающие пиксели, Floodfill — связные совпадающие, FillToBorder — область до border color, Reset — все пиксели. Этот сохранённый контракт не делает вызов доступным в сборке IM7. |
bool по официальной сигнатуре: true при успехе, false при отказе согласно общему success-контракту. Исторический wrapper IM6 вызывает DrawMatte и возвращает true; здесь эта ветка не выполнялась. Реальный runtime-результат попытки на IM7 — Error, а не false и не ImagickException. Успешный PNG в примерах принадлежит современной замене, не matte.
Официальная доступность: PECL imagick 2, PECL imagick 3. В замороженной записи нет отдельного changelog и отметок deprecated/removed; исходная отметка неполной документации сохранена. Это не отменяет реально обнаруженных native-ограничений: matte отсутствует при данной IM7-сборке, два Alpha-alias выдают E_DEPRECATED. Полные исходные поля сохранены в контракте; уточнения привязаны к PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46. Старую IM6-ветку здесь не выполняли.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(360, 220, 'white');
$image->setImageFormat('png');
$legacy = new ImagickDraw();
try {
$legacy->matte(0, 0, Imagick::PAINT_FLOODFILL);
throw new LogicException('В проверенной сборке ImageMagick 7 ожидалось отсутствие matte');
} catch (Error $error) {
if (!str_contains($error->getMessage(), 'ImagickDraw::matte')) {
throw $error;
}
echo 'matte=unavailable-in-IM7; modern-operation=used', "\n";
}
$legacy->clear();
$object = new ImagickDraw();
$object->setStrokeColor('none');
$object->setFillColor('#146c74');
$object->roundRectangle(60, 30, 300, 190, 18, 18);
$image->drawImage($object);
$object->clear();
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE);
$image->transparentPaintImage('white', 0.0, 0, false);
$path = __DIR__ . '/legacy-matte-modern-transparent-color.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'legacy-matte-modern-transparent-color.png', "\n";
$image->clear();
Результат: legacy-matte-modern-transparent-color.png 360×220. Бирюзовая фигура непрозрачна, весь точно белый фон имеет alpha 0. Matte действительно отсутствует и его вызов обработан как Error; прозрачность создаёт transparentPaintImage. Эта операция заменяет все совпадающие белые пиксели, а не только связанные с одной точкой. Шахматная подложка в поясняющей схеме не записана в PNG. Консоль до имени файла: matte=unavailable-in-IM7; modern-operation=used. Сохраните example.php в отдельной папке и выполните php example.php при PHP с imagick. PNG появится рядом; откройте его обычным просмотрщиком при 100%. Прозрачный PNG смотрите на светлом и тёмном фоне: белый фон просмотрщика не доказывает отсутствие alpha. Шрифты, входные файлы, интернет и shell-команды не нужны. Повторный запуск заменяет одноимённый учебный PNG.
Практическая задача: Удалить связный внешний фон и сохранить белую деталь внутри
У предмета есть белый круг внутри бирюзового силуэта. Глобальное удаление белого испортило бы эту деталь. После честной диагностики отсутствующего matte выберем floodFillPaintImage с началом на внешнем фоне.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(360, 220, 'white');
$image->setImageFormat('png');
$legacy = new ImagickDraw();
try {
$legacy->matte(0, 0, Imagick::PAINT_FLOODFILL);
throw new LogicException('В проверенной сборке ImageMagick 7 ожидалось отсутствие matte');
} catch (Error $error) {
if (!str_contains($error->getMessage(), 'ImagickDraw::matte')) {
throw $error;
}
echo 'matte=unavailable-in-IM7; modern-operation=used', "\n";
}
$legacy->clear();
$object = new ImagickDraw();
$object->setStrokeColor('none');
$object->setFillColor('#146c74');
$object->roundRectangle(60, 30, 300, 190, 18, 18);
$object->setFillColor('white');
$object->circle(180, 110, 205, 110);
$image->drawImage($object);
$object->clear();
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE);
$image->floodFillPaintImage('none', 0, 'white', 0, 0, false);
$path = __DIR__ . '/connected-background-keeps-white-detail.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'connected-background-keeps-white-detail.png', "\n";
$image->clear();
Результат: connected-background-keeps-white-detail.png 360×220. Внешний белый фон прозрачен (alpha 0), бирюзовый предмет непрозрачен (alpha 1), белый внутренний круг тоже остаётся непрозрачным. Точка (0,0) принадлежит внешнему фону; floodfill не проходит через бирюзовую границу к изолированному белому кругу. Это работа современной операции над Imagick, не успешный matte. Консоль до имени файла: matte=unavailable-in-IM7; modern-operation=used. Сохраните example.php в отдельной папке и выполните php example.php при PHP с imagick. PNG появится рядом; откройте его обычным просмотрщиком при 100%. Прозрачный PNG смотрите на светлом и тёмном фоне: белый фон просмотрщика не доказывает отсутствие alpha. Шрифты, входные файлы, интернет и shell-команды не нужны. Повторный запуск заменяет одноимённый учебный PNG.
Ошибки, альтернативы и стоимость
Не обозначайте метод просто «работает в Imagick 3»: важна underlying ImageMagick-сборка. Не советуйте downgrade ради нового кода. TransparentPaintImage заменяет все совпадающие цвета; для связного внешнего фона floodFillPaintImage с явной точкой сохраняет изолированную белую деталь. Обе операции требуют проверки alpha результата. Белый цвет и прозрачность различаются; PNG хранит alpha, JPEG — нет. Замена none при обычном OVER сама по себе не является ластиком.
Операции связаны с реальными размерами и количеством пикселей. Глобальная замена/заливка может пройти большую область, composite хранит копию источника, растеризация и сохранение требуют памяти. Ограничивайте размеры входа и число повторов. Сначала определите область/источник и формат PNG, затем проверяйте результат; один setter не является общей проверкой цепочки. В примерах нет сетевых загрузок, непроверенных файлов, шрифтов или shell.
Связанные шаги: ImagickDraw::color · ImagickDraw::composite · ImagickDraw::setFillAlpha · ImagickDraw::setStrokeAlpha. Современные настройки: setFillOpacity, setStrokeOpacity. Ошибки — исключения и Error, прозрачность — цвет и alpha обводки.
ImagickDraw::setFillAlphaСтарый код содержит setFillAlpha, и нужно сохранить полупрозрачную заливку без потери контуров при переходе на современное имя.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setFillAlpha(float $alpha): boolСтарый код содержит setFillAlpha, и нужно сохранить полупрозрачную заливку без потери контуров при переходе на современное имя.
Это устаревшее имя настройки непрозрачности fill. В проверенном wrapper оно выдаёт E_DEPRECATED и вызывает современный DrawSetFillOpacity. Значение 0 прозрачно, 1 непрозрачно. Для нового кода выбран setFillOpacity; alias оставлен в двух диагностических примерах с реальным предупреждением и равным изображением.

Синтаксис, параметры и результат
ImagickDraw::setFillAlpha(float $alpha): bool| Параметр | Что передать и зачем |
|---|---|
| $alpha | float, в этих примерах допустимое нормализованное 0..1: 0.5 для полупрозрачной заливки, 0.25 для мягкой подсветки. Это непрозрачность (1 = opaque), а не историческая обратная шкала opacity старого native-ядра. Не передавайте 50 вместо 0.5. |
bool по сигнатуре; raw prose об отсутствии результата сохранён. Текущий alias предупреждает об устаревании, записывает fill opacity и возвращает true. Сам bool не сообщает, была ли фигура нарисована и каким стал итоговый alpha после смешивания с фоном.
Официальная доступность: PECL imagick 2, PECL imagick 3. В замороженной записи нет отдельного changelog и отметок deprecated/removed; исходная отметка неполной документации сохранена. Это не отменяет реально обнаруженных native-ограничений: matte отсутствует при данной IM7-сборке, два Alpha-alias выдают E_DEPRECATED. Полные исходные поля сохранены в контракте; уточнения привязаны к PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46. Старую IM6-ветку здесь не выполняли.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(360, 220, 'none');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$deprecated = 0;
set_error_handler(static function (int $severity, string $message) use (&$deprecated): bool {
if ($severity === E_DEPRECATED && str_contains($message, 'ImagickDraw::setFillAlpha')) {
++$deprecated;
return true;
}
return false;
}, E_DEPRECATED);
try {
$draw->setFillAlpha(0.5);
} finally {
restore_error_handler();
}
if ($deprecated !== 1) {
throw new LogicException('Ожидалось одно предупреждение устаревшего setFillAlpha в этой сборке');
}
echo 'deprecated=1; replacement=setFillOpacity', "\n";
$draw->rectangle(20, 40, 140, 180);
$image->drawImage($draw);
$draw->clear();
$modern = new ImagickDraw();
$modern->setStrokeColor('none');
$modern->setFillColor('#146c74');
$modern->setFillOpacity(0.5);
$modern->rectangle(220, 40, 340, 180);
$image->drawImage($modern);
$modern->clear();
$path = __DIR__ . '/legacy-fill-and-modern-opacity.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'legacy-fill-and-modern-opacity.png', "\n";
$image->clear();
Результат: legacy-fill-and-modern-opacity.png 360×220. Два одинаковых полупрозрачных бирюзовых прямоугольника на настоящем прозрачном холсте: слева устаревший alias, справа современный setFillOpacity. У внутренних пикселей alpha около 0.5, снаружи 0. У старого вызова зафиксировано ровно одно ожидаемое E_DEPRECATED; остальные ошибки не подавляются. Консоль до имени файла: deprecated=1; replacement=setFillOpacity. Сохраните example.php в отдельной папке и выполните php example.php при PHP с imagick. PNG появится рядом; откройте его обычным просмотрщиком при 100%. Прозрачный PNG смотрите на светлом и тёмном фоне: белый фон просмотрщика не доказывает отсутствие alpha. Шрифты, входные файлы, интернет и shell-команды не нужны. Повторный запуск заменяет одноимённый учебный PNG.
Практическая задача: Сделать подсветку прозрачной, сохранив непрозрачную рамку
У выделяемой области нужна мягкая заливка, но контур должен оставаться чётким. В старом коде меняется только fill alpha; покажем то же современным именем на соседней панели.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(360, 220, 'white');
$image->setImageFormat('png');
$base = new Imagick();
$base->newImage(160, 220, 'white');
$base->setImageFormat('png');
$background = new ImagickDraw();
$background->setStrokeColor('none');
$background->setFillColor('#bdebe2');
$background->rectangle(10, 20, 150, 200);
$base->drawImage($background);
$background->clear();
$left = clone $base;
$right = clone $base;
$base->clear();
$draw = new ImagickDraw();
$draw->setFillColor('#146c74');
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(8);
$draw->setStrokeOpacity(1);
$deprecated = 0;
set_error_handler(static function (int $severity, string $message) use (&$deprecated): bool {
if ($severity === E_DEPRECATED && str_contains($message, 'ImagickDraw::setFillAlpha')) {
++$deprecated;
return true;
}
return false;
}, E_DEPRECATED);
try {
$draw->setFillAlpha(0.25);
} finally {
restore_error_handler();
}
if ($deprecated !== 1) {
throw new LogicException('Ожидалось одно предупреждение устаревшего setFillAlpha в этой сборке');
}
echo 'deprecated=1; replacement=setFillOpacity', "\n";
$draw->rectangle(25, 45, 135, 175);
$left->drawImage($draw);
$draw->clear();
$modern = new ImagickDraw();
$modern->setFillColor('#146c74');
$modern->setFillOpacity(0.25);
$modern->setStrokeColor('#146c74');
$modern->setStrokeOpacity(1);
$modern->setStrokeWidth(8);
$modern->rectangle(25, 45, 135, 175);
$right->drawImage($modern);
$modern->clear();
$image->compositeImage($left, Imagick::COMPOSITE_OVER, 0, 0);
$image->compositeImage($right, Imagick::COMPOSITE_OVER, 200, 0);
$left->clear();
$right->clear();
$path = __DIR__ . '/translucent-fill-opaque-outline.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'translucent-fill-opaque-outline.png', "\n";
$image->clear();
Результат: translucent-fill-opaque-outline.png 360×220. Две одинаковые области на отдельных мятных панелях: мягкая смешанная заливка, но непрозрачные бирюзовые рамки. Одинаковые локальные координаты исключают различие сглаживания при переносе геометрии. Итоговый PNG непрозрачен, потому что под фигурами был непрозрачный фон; fill alpha 0.25 не означает alpha 0.25 у уже смешанного конечного пикселя. Консоль до имени файла: deprecated=1; replacement=setFillOpacity. Сохраните example.php в отдельной папке и выполните php example.php при PHP с imagick. PNG появится рядом; откройте его обычным просмотрщиком при 100%. Прозрачный PNG смотрите на светлом и тёмном фоне: белый фон просмотрщика не доказывает отсутствие alpha. Шрифты, входные файлы, интернет и shell-команды не нужны. Повторный запуск заменяет одноимённый учебный PNG.
Ошибки, альтернативы и стоимость
Не подавляйте все ошибки через @ или error_reporting(0). Здесь временный handler принимает только ожидаемый E_DEPRECATED именно этого метода и восстанавливается в finally; неожиданные ошибки остаются видимыми. Устанавливайте сначала непрозрачный цвет, затем opacity: копирование rgba-цвета может заменить alpha, не обещается универсальное произведение двух настроек. Fill не меняет alpha независимого готового источника composite и не делает stroke автоматически прозрачным.
Операции связаны с реальными размерами и количеством пикселей. Глобальная замена/заливка может пройти большую область, composite хранит копию источника, растеризация и сохранение требуют памяти. Ограничивайте размеры входа и число повторов. Сначала определите область/источник и формат PNG, затем проверяйте результат; один setter не является общей проверкой цепочки. В примерах нет сетевых загрузок, непроверенных файлов, шрифтов или shell.
Связанные шаги: ImagickDraw::color · ImagickDraw::composite · ImagickDraw::matte · ImagickDraw::setStrokeAlpha. Современные настройки: setFillOpacity, setStrokeOpacity. Ошибки — исключения и Error, прозрачность — цвет и alpha обводки.
ImagickDraw::setStrokeAlphaОслабить контур второстепенного блока, сохранив непрозрачную золотистую заливку и прозрачные области вне фигуры.
PECL imagick 2, PECL imagick 3 · imagick
ImagickDraw::setStrokeAlpha(float $alpha): boolОслабить контур второстепенного блока, сохранив непрозрачную золотистую заливку и прозрачные области вне фигуры.
Исторический alias задаёт непрозрачность stroke. В текущей сборке возникает E_DEPRECATED, затем применяется современный DrawSetStrokeOpacity. Для нового кода используйте setStrokeOpacity; fill opacity и ширина линии задаются отдельно.

Синтаксис, параметры и результат
ImagickDraw::setStrokeAlpha(float $alpha): bool| Параметр | Что передать и зачем |
|---|---|
| $alpha | float 0..1 для воспроизводимого примера: 0 полностью прозрачно, 1 полностью непрозрачно. При 0.25 наружная часть линии четверть-непрозрачна. Это не толщина stroke и не непрозрачность всего PNG. |
bool по сигнатуре; raw prose говорит об отсутствии результата. Текущий wrapper выдаёт предупреждение устаревания, меняет stroke opacity и возвращает true. Значение alpha квантуется native-каналом, поэтому около 0.25/0.5 при чтении не обязано быть побитно точным десятичным float.
Официальная доступность: PECL imagick 2, PECL imagick 3. В замороженной записи нет отдельного changelog и отметок deprecated/removed; исходная отметка неполной документации сохранена. Это не отменяет реально обнаруженных native-ограничений: matte отсутствует при данной IM7-сборке, два Alpha-alias выдают E_DEPRECATED. Полные исходные поля сохранены в контракте; уточнения привязаны к PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46. Старую IM6-ветку здесь не выполняли.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(360, 220, 'none');
$image->setImageFormat('png');
$left = new Imagick();
$left->newImage(160, 220, 'none');
$left->setImageFormat('png');
$right = clone $left;
$draw = new ImagickDraw();
$draw->setFillColor('none');
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(10);
$deprecated = 0;
set_error_handler(static function (int $severity, string $message) use (&$deprecated): bool {
if ($severity === E_DEPRECATED && str_contains($message, 'ImagickDraw::setStrokeAlpha')) {
++$deprecated;
return true;
}
return false;
}, E_DEPRECATED);
try {
$draw->setStrokeAlpha(0.5);
} finally {
restore_error_handler();
}
if ($deprecated !== 1) {
throw new LogicException('Ожидалось одно предупреждение устаревшего setStrokeAlpha в этой сборке');
}
echo 'deprecated=1; replacement=setStrokeOpacity', "\n";
$draw->rectangle(25, 40, 135, 180);
$left->drawImage($draw);
$draw->clear();
$modern = new ImagickDraw();
$modern->setFillColor('none');
$modern->setStrokeColor('#146c74');
$modern->setStrokeWidth(10);
$modern->setStrokeOpacity(0.5);
$modern->rectangle(25, 40, 135, 180);
$right->drawImage($modern);
$modern->clear();
$image->compositeImage($left, Imagick::COMPOSITE_OVER, 0, 0);
$image->compositeImage($right, Imagick::COMPOSITE_OVER, 200, 0);
$left->clear();
$right->clear();
$path = __DIR__ . '/legacy-stroke-and-modern-opacity.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'legacy-stroke-and-modern-opacity.png', "\n";
$image->clear();
Результат: legacy-stroke-and-modern-opacity.png 360×220. Две одинаковые полупрозрачные рамки без заливки на прозрачном холсте. Для строгого сравнения обе нарисованы в одинаковых координатах на независимых панелях 160×220, затем вставлены в общий PNG. В середине alpha 0, на прямом участке контура около 0.5. Слева alias с ожидаемым предупреждением, справа современный setStrokeOpacity. Консоль до имени файла: deprecated=1; replacement=setStrokeOpacity. Сохраните example.php в отдельной папке и выполните php example.php при PHP с imagick. PNG появится рядом; откройте его обычным просмотрщиком при 100%. Прозрачный PNG смотрите на светлом и тёмном фоне: белый фон просмотрщика не доказывает отсутствие alpha. Шрифты, входные файлы, интернет и shell-команды не нужны. Повторный запуск заменяет одноимённый учебный PNG.
Практическая задача: Ослабить рамку, сохранив непрозрачную заливку
Для второстепенного блока нужен менее заметный контур, а золотистый центр должен остаться непрозрачным. Меняем только stroke alpha и рядом показываем современное имя.
<?php
declare(strict_types=1);
$image = new Imagick();
$image->newImage(360, 220, 'none');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setFillColor('#ffe08a');
$draw->setFillOpacity(1);
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(10);
$deprecated = 0;
set_error_handler(static function (int $severity, string $message) use (&$deprecated): bool {
if ($severity === E_DEPRECATED && str_contains($message, 'ImagickDraw::setStrokeAlpha')) {
++$deprecated;
return true;
}
return false;
}, E_DEPRECATED);
try {
$draw->setStrokeAlpha(0.25);
} finally {
restore_error_handler();
}
if ($deprecated !== 1) {
throw new LogicException('Ожидалось одно предупреждение устаревшего setStrokeAlpha в этой сборке');
}
echo 'deprecated=1; replacement=setStrokeOpacity', "\n";
$draw->rectangle(25, 40, 135, 180);
$image->drawImage($draw);
$draw->clear();
$modern = new ImagickDraw();
$modern->setFillColor('#ffe08a');
$modern->setFillOpacity(1);
$modern->setStrokeColor('#146c74');
$modern->setStrokeOpacity(0.25);
$modern->setStrokeWidth(10);
$modern->rectangle(225, 40, 335, 180);
$image->drawImage($modern);
$modern->clear();
$path = __DIR__ . '/soft-outline-opaque-fill.png';
if (!$image->writeImage($path)) {
throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'soft-outline-opaque-fill.png', "\n";
$image->clear();
Результат: soft-outline-opaque-fill.png 360×220. Два одинаковых золотистых блока на прозрачном фоне: центры имеют alpha 1, внешняя часть контура около 0.25, снаружи alpha 0. На участке наложения полупрозрачной обводки поверх уже непрозрачной заливки результирующая alpha остаётся 1; для проверки 0.25 берём наружную половину stroke. Консоль до имени файла: deprecated=1; replacement=setStrokeOpacity. Сохраните example.php в отдельной папке и выполните php example.php при PHP с imagick. PNG появится рядом; откройте его обычным просмотрщиком при 100%. Прозрачный PNG смотрите на светлом и тёмном фоне: белый фон просмотрщика не доказывает отсутствие alpha. Шрифты, входные файлы, интернет и shell-команды не нужны. Повторный запуск заменяет одноимённый учебный PNG.
Ошибки, альтернативы и стоимость
На внутренней половине линии, нарисованной поверх непрозрачной заливки, итоговый alpha может остаться 1. Чтобы увидеть 0.25, смотрите наружный участок stroke на прозрачном фоне. Сначала задайте цвет stroke, затем opacity, затем фигуру. Alias не является способом менять alpha всех существующих пикселей изображения. Миграция показана на реально совпавших RGBA-панелях, а не на названии метода.
Операции связаны с реальными размерами и количеством пикселей. Глобальная замена/заливка может пройти большую область, composite хранит копию источника, растеризация и сохранение требуют памяти. Ограничивайте размеры входа и число повторов. Сначала определите область/источник и формат PNG, затем проверяйте результат; один setter не является общей проверкой цепочки. В примерах нет сетевых загрузок, непроверенных файлов, шрифтов или shell.
Связанные шаги: ImagickDraw::color · ImagickDraw::composite · ImagickDraw::matte · ImagickDraw::setFillAlpha. Современные настройки: setFillOpacity, setStrokeOpacity. Ошибки — исключения и Error, прозрачность — цвет и alpha обводки.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


