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

Дерево руководства
Глава 357 · После alpha и композиции
Imagick: перекраска, прозрачность и связный фон
Плоская упаковка и PNG-наклейка: выбрать цвет или связанную область, сохранив внутренние белые детали.
Выпустить другой цвет упаковки и подготовить наклейку
Нужно выпустить оранжевую версию упаковки и подготовить рисунок как PNG-наклейку для другой подложки. Важно сохранить белую этикетку, белую кружку и отверстие ручки. Сначала заменим известный синий акцент; затем разберём, почему одинаковый белый цвет ещё не означает одинаковую роль в рисунке.


Это специально нарисованный вход с известными цветами и закрытыми контурами. Мы не выдаём его за фотографию или алгоритм автоматического отделения товара. Два нижних образца имеют RGB(48,120,168) и RGB(53,124,171). При fuzz 0 второй оттенок отличается, даже если глаз считает оба синими. Надпись BLUE BOX и напечатанные под образцами числа являются частью исходного рисунка: при перекраске они сами не пересчитываются. Актуальный цвет результата задаётся вызовом и подписями сравнения, а не старым текстом под оранжевой плашкой.
RGB — красная, зелёная и синяя компоненты цвета. RGBA добавляет к ним alpha, обозначенную A. В условной сетке схемы T — клетка, уже подходящая под цветовое условие, X — неподходящая клетка, S — стартовая точка только этой сетки. ΔR/G/B означает разность соответствующих компонент, вертикальные черты — её модуль, знак ≤ читается «не больше». Цветовое сходство в общем случае не сводится к трём таким независимым сравнениям.
| Термин до схемы | Значение |
|---|---|
| Target и fill | Target — цвет сравнения, fill — цвет записи. Совпадение проверяется по цветовым данным, не по названию предмета. Invert=false выбирает совпавшее, true — несовпавшее. |
| Q и fuzz | Q — QuantumRange, максимум внутренней компоненты; в Q16 он равен 65535. Fuzz — допуск в этой шкале; 0.04×Q=2621.4, то есть 4% диапазона значения, не 4% числа пикселей. |
| Alpha A | Вклад пикселя: 0 прозрачно, 1 непрозрачно, 0.5 промежуточно. TransparentPaint присваивает A выбранным пикселям. RGB хранит цвет отдельно; фон просмотрщика не доказывает наличие/отсутствие alpha. |
| Координаты и связность | x вправо, y вниз от нуля, размеры в пикселях. Seed — стартовая точка, здесь (8,80). Для flood доступны четыре соседа: вверх, вниз, влево, вправо; диагональ не соединяет области. Target при этом обязателен. |

Самая маленькая запись
В $image уже загружена отдельная копия рисунка. $ начинает имя переменной; -> вызывает метод, скобки содержат аргументы, запятые разделяют их, ; завершает команду. Кавычки задают строку цвета. #3078a8 — шестнадцатеричная запись RGB(48,120,168), по две цифры на компоненту; white — имя белого. False/true — логические значения. Fuzz 0.0 задаёт точный допуск для обычного RGB с 8 битами на компоненту. Проверяет каждый пиксель всего изображения на близость к target. Для выбранных совпадений записывает fill в разрешённые каналы. Раздельные участки одного цвета тоже меняются; координаты начала не нужны.
$image->opaquePaintImage('#3078a8', '#dc701e', 0.0, false);Метод возвращает bool true, а изменённое изображение остаётся в $image. Не заменяйте объект возвращённым bool. $image = clone $source создаёт независимую копию; простое присваивание объекта только добавляет второе имя. If проверяет условие, ! означает отрицание; throw new RuntimeException прекращает отказавшую цепочку. Подготовка: объекты и методы, копирование clone, исключения.
Полный запуск начинается с <?php и declare(strict_types=1): PHP и строгая передача типов. Require подключает paint-fixture.php из __DIR__, папки программы. LoadPaintSource проверяет Base64/SHA256 и возвращает точный Imagick. Imagick::getQuantumRange() — статический метод класса; $range["quantumRangeLong"] читает элемент массива. Q нужен для следующего варианта с допуском. SavePaintComparison сохраняет целые панели и печатает имя PNG. Детали помощника открыты ниже.
<?php
declare(strict_types=1);
require __DIR__ . '/paint-fixture.php';
$source = loadPaintSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$image = clone $source;
if (!$image->opaquePaintImage('#3078a8', '#dc701e', 0.0, false)) {
throw new RuntimeException('Не выполнен opaquePaintImage');
}
savePaintComparison([$source, $image], 'paint-first.png');
$source->clear();
$image->clear();
Результат: Исходный синий акцент и оранжевая версия всего рисунка. Глобальная замена затрагивает все точные совпадения #3078a8, включая отдельный badge и образец, но не близкий синий. Распакуйте example.php, paint-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи и PHP/Imagick. Помощник восстанавливает точный PNG по Base64/SHA256 без шрифтов и сети. Stdout — paint-first.png и перевод строки. Откройте PNG просмотрщиком; полное сравнение 800×320 содержит целые панели 400×320 слева направо. Отдельные RGBA сохраняют alpha; подложка preview не является их фоном.
Ожидаемый вывод
paint-first.png
Полный paint-fixture.php, включённый в каждый ZIP
<?php
declare(strict_types=1);
function loadPaintSource(): Imagick
{
$encoded = file_get_contents(__DIR__ . '/source.png.b64');
if ($encoded === false) {
throw new RuntimeException('Не найден source.png.b64: распакуйте весь архив');
}
$bytes = base64_decode($encoded, true);
if ($bytes === false || hash('sha256', $bytes) !== '9aefec1f2dc9a02228b0286a65aa6a969e108a4218bc827a67a67153ee531d68') {
throw new RuntimeException('Повреждён исходный PNG');
}
$path = __DIR__ . '/source.png';
if (file_put_contents($path, $bytes) !== strlen($bytes)) {
throw new RuntimeException('Не удалось восстановить source.png');
}
return new Imagick($path);
}
function savePaintComparison(array $panels, string $filename): void
{
if ($panels === []) {
throw new InvalidArgumentException('Нужна хотя бы одна панель');
}
$width = 0;
$height = 0;
foreach ($panels as $panel) {
if (!$panel instanceof Imagick) {
throw new InvalidArgumentException('Панель должна быть объектом Imagick');
}
$width += $panel->getImageWidth();
$height = max($height, $panel->getImageHeight());
}
$output = new Imagick();
$output->newImage($width, $height, 'white');
$output->setImageFormat('png');
$left = 0;
foreach ($panels as $panel) {
$top = intdiv($height - $panel->getImageHeight(), 2);
if (!$output->compositeImage($panel, Imagick::COMPOSITE_OVER, $left, $top)) {
throw new RuntimeException('Не удалось собрать полное сравнение');
}
$left += $panel->getImageWidth();
}
$output->setImageDepth(8);
$output->setOption('png:color-type', '2');
if (!$output->writeImage(__DIR__ . '/' . $filename)) {
throw new RuntimeException('Не удалось записать результат');
}
$output->clear();
echo $filename, "\n";
}
function paintPreview(Imagick $image): Imagick
{
$preview = new Imagick();
$preview->newImage($image->getImageWidth(), $image->getImageHeight(), '#e6edf1');
if (!$preview->compositeImage($image, Imagick::COMPOSITE_OVER, 0, 0)) {
throw new RuntimeException('Не удалось создать preview');
}
return $preview;
}
Function объявляет функцию, return возвращает результат; : Imagick задаёт тип, void означает отсутствие возвращаемого значения. Массив $panels хранит панели, foreach перебирает их. File_get_contents читает Base64, base64_decode восстанавливает байты, hash проверяет SHA256, file_put_contents сохраняет PNG. New Imagick/newImage создают полотно. PaintPreview накладывает RGBA на отдельную подложку #e6edf1 через OVER и возвращает новый непрозрачный просмотр; исходный слой не заменяется. Помощник не ищет шрифты и не скачивает файлы. Основы: функции, массивы, циклы, alpha и OVER.
Отделить цветовое совпадение от связной области
Глобальный opaque перебирает весь кадр: отдельный синий badge и нижний образец меняются вместе с коробкой. У transparent такая же глобальная область, но меняется alpha. Flood добавляет второе условие: до пикселя можно дойти от seed по подходящим четырём соседям. Закрытая белая этикетка совпадает по цвету с фоном, но не связана с ним.
Target не пропускается. Метод PHP передаёт его явно, даже когда библиотека сначала прочитала seed. В небольшой пробе белый seed с синим target дал true и 0 изменённых пикселей. Если нужно взять текущий цвет начала, делаем это отдельным вызовом getImagePixelColor(x,y), который возвращает ImagickPixel — цветовой объект, подходящий в target.
Перед следующей полной программой все три маленьких действия. $image, $flood и $transparent — отдельные clone источника. Пустого target здесь нет; alpha 0 означает прозрачность. Только flood использует координаты начала:
$image->opaquePaintImage('#3078a8', '#dc701e', 0.0, false);
$flood->floodFillPaintImage('#d8ece4', 0.0, 'white', 8, 80, false);
$transparent->transparentPaintImage('white', 0.0, 0.0, false);<?php
declare(strict_types=1);
require __DIR__ . '/paint-fixture.php';
$source = loadPaintSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$image = clone $source;
if (!$image->opaquePaintImage('#3078a8', '#dc701e', 0.0, false)) {
throw new RuntimeException('Не выполнен opaquePaintImage');
}
$flood = clone $source;
if (!$flood->floodFillPaintImage('#d8ece4', 0.0, 'white', 8, 80, false)) {
throw new RuntimeException('Не выполнен floodFillPaintImage');
}
$transparent = clone $source;
if (!$transparent->transparentPaintImage('white', 0.0, 0.0, false)) {
throw new RuntimeException('Не выполнен transparentPaintImage');
}
$transparent->setImageFormat('png');
$transparent->setImageDepth(8);
$transparent->setOption('png:color-type', '6');
if (!$transparent->writeImage(__DIR__ . '/controls-transparent.png')) {
throw new RuntimeException('Не записан controls-transparent.png');
}
$preview = paintPreview($transparent);
savePaintComparison([$source, $image, $flood, $preview], 'paint-controls.png');
$source->clear();
$image->clear();
$flood->clear();
$preview->clear();
$transparent->clear();
Результат: Исходник; глобальная замена синего; перекраска только связного белого фона; глобальное удаление белого на подложке просмотра #e6edf1. Последнее удаляет также внутренние белые детали. controls-transparent.png хранит настоящую RGBA. Распакуйте example.php, paint-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи и PHP/Imagick. Помощник восстанавливает точный PNG по Base64/SHA256 без шрифтов и сети. Stdout — paint-controls.png и перевод строки. Откройте PNG просмотрщиком; полное сравнение 1600×320 содержит целые панели 400×320 слева направо. Отдельные RGBA сохраняют alpha; подложка preview не является их фоном.
Ожидаемый вывод
paint-controls.png
Выбрать охват цвета и защитить другой акцент
Первая практика меняет все акценты одной партии: сравните точный target с допуском 0.04×Q. Во втором варианте близкий синий на боковине и образце входит в выбранное множество. Слишком большой допуск способен захватить другие цвета; это не управление насыщенностью и не классификатор «всё синее».

Вторая практика требует изменить только саму коробку, сохранив badge и согласованную маркировку. Вырезаем прямоугольник 200×180 в (64,72), перекрашиваем с умеренным допуском и возвращаем на место.

CropImage(200,180,64,72) принимает ширину, высоту, x, y. SetImagePage(0,0,0,0) сбрасывает виртуальную позицию вырезки. CompositeImage с Imagick::COMPOSITE_OVER возвращает непрозрачный прямоугольник в (64,72); :: здесь обращается к константе класса. ROI задан макетом заранее, а не найден методом. Два запуска: точность цвета и защищённая упаковка.
Создать прозрачный слой и увидеть цену глобального выбора
Если действительно нужно убрать все белые пиксели, transparentPaint подходит прямо. Сравним alpha 0 и 0.5: второй вариант оставляет половинный вклад белого. Для нашей наклейки глобальный белый — полезный контрпример: он удаляет также этикетку, перед кружки и белое внутри ручки.

Другая задача — извлечь цветной акцент как слой для макета. Invert=true при синем target делает прозрачным всё несовпавшее; совпавшие синие остаются со своими исходными RGB. Это не бинарная чёрно-белая маска. Допуск 0.04×Q включает и боковину близкого цвета. Полные программы: присвоить alpha и извлечь акцент.
Каждый отдельный слой сохраняется как RGBA с 8 битами на компоненту, PNG color-type 6; сравнения — RGB color-type 2. Это не индексированный PNG. SetImageFormat выбирает формат, setImageDepth — глубину, setOption("png:color-type","6") задаёт RGBA-кодирование, writeImage пишет файл; эти шаги не являются выбором цвета. Сине-серая подложка preview не входит в alpha-файлы. Оценивайте реальную alpha, не только цвет экрана.
Удалить только внешний фон и сохранить белый товар
Для внешнего фона выбираем белый target и seed (8,80), расположенный снаружи. Глобальный белый видит и кружку, а flood туда не попадает через закрытый синий контур. Первая практика меняет только связный фон на #d8ece4, сохраняя белые детали.

Для второй практики нужен свободный промежуточный цвет. В нашем входе #ff00ff отсутствует. Сначала flood красит только внешнее белое в этот key, затем transparent делает прозрачным только key. Белые детали больше не совпадают с удаляемым цветом. Если key уже встречается в товаре, он тоже исчезнет при глобальном втором шаге: это обязательная проверка нового входа, не универсальный preset.
Так получается sticker-connected.png 400×320 с настоящей alpha, без изменения геометрии. В sticker-global.png сохраняем альтернативное глобальное удаление белого, чтобы сравнить сохранность деталей. Старые оттенки RGB под alpha0 могут сохраняться в файле и отличаться у других обработчиков; форму определяет alpha. Не обещаем автоматического удаления фотографического фона, полупрозрачных волос, теней или ореолов. Два запуска: новый фон и PNG-наклейка.
Проверить выбор пикселей, alpha и границы метода
| Наблюдение | Что проверить |
|---|---|
| Сразу изменился весь рисунок | Проверьте invert и величину fuzz. Глобальные opaque/transparent не ограничены связной областью. |
| Заливка вернула true, но ничего не видно | Сравните target с seed и выбранный канал. В пробе неверный target дал no-op; RED с белым→magenta тоже не изменил красный, который уже 255. |
| Исчезли внутренние белые детали | Глобальное transparent white выбрало их по цвету. Для известного закрытого рисунка используйте связанную область и свободный key. |
| Полупрозрачный белый не совпал с white | Alpha участвует в цветовом сравнении. В пробе white с alpha 1 не выбрал белый с alpha 0 или 64/255; нельзя считать совпадение только по RGB. |
| Другой фон в просмотрщике | Проверьте alpha и формат PNG. Preview является отдельной композицией, не изменением самого RGBA-слоя. |
| Внешний фон прошёл внутрь | Проверьте разрывы контура, seed и допуск. Четырёхсвязная заливка не распознаёт предмет или смысл текста. |
Source — собственная плоская графика с известным белым фоном. На фотографии соседние оттенки, шум и полупрозрачные края требуют другого контроля. Не обещаем сохранение alpha у opaque/flood с произвольным цветом fill, а также сохранение всех каналов у любой маски. В контрольной проверке RED opaque сохранил G/B/alpha; это ограниченный результат, а не полная спецификация цветоуправления.
При отказе чтения/цвета/записи программа прекращается исключением. Все значения фиксированы; для внешнего ввода отдельно нужны ограничения размеров/кадров/памяти и проверка параметров. Локальная проверка не измеряет скорость, уменьшение файла, печатный цвет или совместимость Photoshop. PNG-наклейка — готовый локальный файл, HTTP-публикация не выполняется.
Старые paintOpaqueImage, paintTransparentImage и paintFloodfillImage остаются отдельными историческими узлами руководства, отмеченными deprecated с PECL 3.4.4; этот блок их не исключает из общего объёма и не заменяет их полные будущие карточки. Новый floodFill официально заменяет paintFloodfillImage, но сигнатуры отличаются наличием invert.
Выбрать область действия и проверить свой вариант

Упражнение: сделать фон светло-жёлтым, не изменяя внутренний белый. Решение: в минимальной flood-программе изменить только fill на #fff0bf; target, seed (8,80), fuzz0 и invert=false оставить. Проверьте белые точки (109,145), (280,170), (340,190): они должны остаться RGB 255/255/255. Это новая программа, которую нужно выполнить после изменения; сохранённые здесь native-свидетельства относятся к исходным восьми определениям.
Следующие задачи: тень и размещение готового прозрачного слоя, замена по палитре вместо единственного target, число уровней и тоновые эффекты, рамка для готового PNG. Сначала сформулируйте, нужен весь цвет, только связный фон или заранее известная область макета.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Imagick::opaquePaintImageПроверяет каждый пиксель всего изображения на близость к target. Для выбранных совпадений записывает fill в разрешённые каналы. Раздельные участки одного цвета тоже меняются; координаты начала не нужны.
PECL imagick 2 >= 2.3.0, PECL imagick 3 · imagick
Imagick::opaquePaintImage(mixed $target, mixed $fill, float $fuzz, bool $invert, int $channel = Imagick::CHANNEL_DEFAULT): boolСамая маленькая запись
В $image уже загружена отдельная копия рисунка. $ начинает имя переменной; -> вызывает метод, скобки содержат аргументы, запятые разделяют их, ; завершает команду. Кавычки задают строку цвета. #3078a8 — шестнадцатеричная запись RGB(48,120,168), по две цифры на компоненту; white — имя белого. False/true — логические значения. Fuzz 0.0 задаёт точный допуск для обычного RGB с 8 битами на компоненту. Проверяет каждый пиксель всего изображения на близость к target. Для выбранных совпадений записывает fill в разрешённые каналы. Раздельные участки одного цвета тоже меняются; координаты начала не нужны.
$image->opaquePaintImage('#3078a8', '#dc701e', 0.0, false);Метод возвращает bool true, а изменённое изображение остаётся в $image. Не заменяйте объект возвращённым bool. $image = clone $source создаёт независимую копию; простое присваивание объекта только добавляет второе имя. If проверяет условие, ! означает отрицание; throw new RuntimeException прекращает отказавшую цепочку. Подготовка: объекты и методы, копирование clone, исключения.
Полная официальная сигнатура
Imagick::opaquePaintImage(mixed $target, mixed $fill, float $fuzz, bool $invert, int $channel = Imagick::CHANNEL_DEFAULT): bool| Аргумент | Смысл и ограничения |
|---|---|
| $target | Обязательный ImagickPixel или строка цвета; здесь #3078a8, RGB(48,120,168). Это цвет сравнения, не координата и не имя предмета. |
| $fill | Обязательный цвет замены, здесь #dc701e, RGB(220,112,30). Alpha fill также может записываться если альфа-канал разрешён для изменения; слово opaque не гарантирует непрозрачность произвольного fill. |
| $fuzz | Обязательный float, допуск цветовой близости во внутренних Quantum-единицах. 0 — точные совпадения обычного RGB с 8 битами на компоненту; 0.04×Q — выбранный умеренный допуск, а не строка "4%" и не доля числа пикселей. |
| $invert | Обязательный bool: false выбирает совпадение, true — несовпадение. Не меняет местами target и fill. |
| $channel | Необязательная int-маска CHANNEL_DEFAULT; RED ограничивает запись красной компоненты, сочетание масок задаётся |. Критерий сравнения цвета не сводится автоматически к одному выбранному каналу. |
Официальная доступность: PECL imagick 2 >= 2.3.0, PECL imagick 3; компиляция с ImageMagick 6.3.8 или новее. Все аргументы кроме явно необязательного channel нужны. Операция меняет текущий объект и возвращает bool true при успехе, размер не растёт. Пустое изображение, неверный цвет или нативный отказ библиотеки могут дать ImagickException; неверные PHP-типы/число аргументов — TypeError/ArgumentCountError. True не доказывает, что нашлись выбранные пиксели: неверный target в flood-проверке вернул true при неизменном рисунке.
Fuzz передаётся непосредственно. Для доли 0.04 сначала получаем $range = Imagick::getQuantumRange(), затем $Q = $range["quantumRangeLong"], после чего вычисляем 0.04*$Q. :: здесь вызывает статический метод класса; квадратные скобки читают элемент массива по строковому ключу. В проверенной Q16-сборке Q=65535 и допуск 2621.4. Это цветовая близость с учётом alpha/цветового пространства, не независимый интервал ±fuzz каждого RGB-канала. В наших основных программах исходник непрозрачный sRGB.
Для внешних параметров отдельно проверяют цвета, конечный неотрицательный fuzz, alpha0..1, стартовую точку внутри растра, разрешённые каналы и площадь/число кадров. Валидация внешней формы здесь не реализована: значения фиксированы. Обход всего изображения и дополнительные копии требуют памяти и времени; ускорение и размер файла не измерялись. Antialias/JPEG создают другие цвета, большой fuzz может захватить нужные детали; точное удаление белого может оставить светлые ореолы.
Полный официальный XML: описание, все параметры, return, пример и ссылки
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.opaquepaintimage">
<refnamediv>
<refname>Imagick::opaquePaintImage</refname>
<refpurpose>Changes the color value of any pixel that matches target</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>bool</type><methodname>Imagick::opaquePaintImage</methodname>
<methodparam><type>mixed</type><parameter>target</parameter></methodparam>
<methodparam><type>mixed</type><parameter>fill</parameter></methodparam>
<methodparam><type>float</type><parameter>fuzz</parameter></methodparam>
<methodparam><type>bool</type><parameter>invert</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>channel</parameter><initializer>Imagick::CHANNEL_DEFAULT</initializer></methodparam>
</methodsynopsis>
<para>
Changes any pixel that matches color with the color defined by fill.
&imagick.method.available.0x638;
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>target</parameter></term>
<listitem>
<para>
ImagickPixel object or a string containing the color to change
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>fill</parameter></term>
<listitem>
<para>
The replacement color
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>fuzz</parameter></term>
<listitem>
<para>
&imagick.parameter.fuzz;
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>invert</parameter></term>
<listitem>
<para>
If &true; paints any pixel that does not match the target color.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>channel</parameter></term>
<listitem>
<para>
&imagick.parameter.channel;
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&imagick.return.success;
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
Официальный HTTP-пример сохранён целиком. Наши программы работают с локальными PNG, сеть и HTTP-выдачу не проверяют. MIME header сам по себе файл не перекодирует; JPEG не сохраняет alpha. Связи: файлы и запись, HTTP-ответ.
<?php
declare(strict_types=1);
require __DIR__ . '/paint-fixture.php';
$source = loadPaintSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$image = clone $source;
if (!$image->opaquePaintImage('#3078a8', '#dc701e', 0.0, false)) {
throw new RuntimeException('Не выполнен opaquePaintImage');
}
$tolerant = clone $source;
if (!$tolerant->opaquePaintImage('#3078a8', '#dc701e', 0.04 * $Q, false)) {
throw new RuntimeException('Не выполнен opaquePaintImage');
}
savePaintComparison([$source, $image, $tolerant], 'opaque-tolerance.png');
$source->clear();
$image->clear();
$tolerant->clear();
Результат: Исходник, точное совпадение fuzz 0, допуск 0.04×Q. Близкий #357cab остаётся в точном варианте и входит в умеренный допуск. Это замена известных цветов, не распознавание упаковки. Распакуйте example.php, paint-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи и PHP/Imagick. Помощник восстанавливает точный PNG по Base64/SHA256 без шрифтов и сети. Stdout — opaque-tolerance.png и перевод строки. Откройте PNG просмотрщиком; полное сравнение 1200×320 содержит целые панели 400×320 слева направо. Отдельные RGBA сохраняют alpha; подложка preview не является их фоном.
Ожидаемый вывод
opaque-tolerance.png
<?php
declare(strict_types=1);
require __DIR__ . '/paint-fixture.php';
$source = loadPaintSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$image = clone $source;
$region = clone $source;
$region->cropImage(200, 180, 64, 72);
$region->setImagePage(0, 0, 0, 0);
if (!$region->opaquePaintImage('#3078a8', '#dc701e', 0.04 * $Q, false)) {
throw new RuntimeException('Не выполнен opaquePaintImage');
}
if (!$image->compositeImage($region, Imagick::COMPOSITE_OVER, 64, 72)) {
throw new RuntimeException('Не выполнен compositeImage');
}
savePaintComparison([$source, $image], 'opaque-protected.png');
$source->clear();
$image->clear();
$region->clear();
Результат: Перекраска с допуском применяется только к прямоугольнику x64/y72/200×180. Отдельный синий badge, образцы цветов и SKU вне него сохраняют исходные пиксели. Распакуйте example.php, paint-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи и PHP/Imagick. Помощник восстанавливает точный PNG по Base64/SHA256 без шрифтов и сети. Stdout — opaque-protected.png и перевод строки. Откройте PNG просмотрщиком; полное сравнение 800×320 содержит целые панели 400×320 слева направо. Отдельные RGBA сохраняют alpha; подложка preview не является их фоном.
Ожидаемый вывод
opaque-protected.png
Связанный путь: модель выбора и связности, ошибки и ограничения.
Imagick::transparentPaintImageПо тому же цветовому критерию выбирает пиксели по всему кадру и присваивает им заданную alpha. RGB не определяет, является ли участок фоном: белая кружка совпадёт с белой подложкой.
PECL imagick 2 >= 2.3.0, PECL imagick 3 · imagick
Imagick::transparentPaintImage(mixed $target, float $alpha, float $fuzz, bool $invert): boolСамая маленькая запись
В $image уже загружена отдельная копия рисунка. $ начинает имя переменной; -> вызывает метод, скобки содержат аргументы, запятые разделяют их, ; завершает команду. Кавычки задают строку цвета. #3078a8 — шестнадцатеричная запись RGB(48,120,168), по две цифры на компоненту; white — имя белого. False/true — логические значения. У transparent второй 0.0 — новая alpha: 0 прозрачно, 1 непрозрачно. Третий 0.0 — fuzz, точный допуск для обычного RGB с 8 битами на компоненту. По тому же цветовому критерию выбирает пиксели по всему кадру и присваивает им заданную alpha. RGB не определяет, является ли участок фоном: белая кружка совпадёт с белой подложкой.
$image->transparentPaintImage('white', 0.0, 0.0, false);Метод возвращает bool true, а изменённое изображение остаётся в $image. Не заменяйте объект возвращённым bool. $image = clone $source создаёт независимую копию; простое присваивание объекта только добавляет второе имя. If проверяет условие, ! означает отрицание; throw new RuntimeException прекращает отказавшую цепочку. Подготовка: объекты и методы, копирование clone, исключения.
Полная официальная сигнатура
Imagick::transparentPaintImage(mixed $target, float $alpha, float $fuzz, bool $invert): bool| Аргумент | Смысл и ограничения |
|---|---|
| $target | Обязательный ImagickPixel или строка, здесь white или #3078a8. При уже существующей alpha совпадение зависит и от неё; RGB-равенство само по себе не универсальная гарантия выбора. |
| $alpha | Обязательный float: 0 прозрачно, 1 непрозрачно, 0.5 половинный вклад. Wand масштабирует это значение в Q и ограничивает допустимым диапазоном. Это присваивание выбранным пикселям, не умножение прежней alpha. |
| $fuzz | Обязательный float в Quantum-шкале, wrapper не пересчитывает проценты. Глобальный белый в примерах имеет fuzz0; цветной акцент использует 0.04×Q. |
| $invert | Обязательный bool: true выбирает всё, не совпавшее с target. В отдельном слое так сохраняем синие участки и убираем остальное. Channel-аргумента у метода нет. |
Официальная доступность: PECL imagick 2 >= 2.3.0, PECL imagick 3; компиляция с ImageMagick 6.3.8 или новее. Все аргументы кроме явно необязательного channel нужны. Операция меняет текущий объект и возвращает bool true при успехе, размер не растёт. Пустое изображение, неверный цвет или нативный отказ библиотеки могут дать ImagickException; неверные PHP-типы/число аргументов — TypeError/ArgumentCountError. True не доказывает, что нашлись выбранные пиксели: неверный target в flood-проверке вернул true при неизменном рисунке.
Fuzz передаётся непосредственно. Для доли 0.04 сначала получаем $range = Imagick::getQuantumRange(), затем $Q = $range["quantumRangeLong"], после чего вычисляем 0.04*$Q. :: здесь вызывает статический метод класса; квадратные скобки читают элемент массива по строковому ключу. В проверенной Q16-сборке Q=65535 и допуск 2621.4. Это цветовая близость с учётом alpha/цветового пространства, не независимый интервал ±fuzz каждого RGB-канала. В наших основных программах исходник непрозрачный sRGB.
Для внешних параметров отдельно проверяют цвета, конечный неотрицательный fuzz, alpha0..1, стартовую точку внутри растра, разрешённые каналы и площадь/число кадров. Валидация внешней формы здесь не реализована: значения фиксированы. Обход всего изображения и дополнительные копии требуют памяти и времени; ускорение и размер файла не измерялись. Antialias/JPEG создают другие цвета, большой fuzz может захватить нужные детали; точное удаление белого может оставить светлые ореолы.
Полный официальный XML: описание, все параметры, return, пример и ссылки
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.transparentpaintimage">
<refnamediv>
<refname>Imagick::transparentPaintImage</refname>
<refpurpose>Paints pixels transparent</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>bool</type><methodname>Imagick::transparentPaintImage</methodname>
<methodparam><type>mixed</type><parameter>target</parameter></methodparam>
<methodparam><type>float</type><parameter>alpha</parameter></methodparam>
<methodparam><type>float</type><parameter>fuzz</parameter></methodparam>
<methodparam><type>bool</type><parameter>invert</parameter></methodparam>
</methodsynopsis>
<para>
Paints pixels matching the target color transparent.
&imagick.method.available.0x638;
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>target</parameter></term>
<listitem>
<para>
The target color to paint
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>alpha</parameter></term>
<listitem>
<para>
&imagick.parameter.alpha;
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>fuzz</parameter></term>
<listitem>
<para>
&imagick.parameter.fuzz;
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>invert</parameter></term>
<listitem>
<para>
If &true; paints any pixel that does not match the target color.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&imagick.return.success;
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title> <function>Imagick::transparentPaintImage</function></title>
<programlisting role="php">
<![CDATA[
<?php
function transparentPaintImage($color, $alpha, $fuzz) {
$imagick = new \Imagick(realpath("images/BlueScreen.jpg"));
//Need to be in a format that supports transparency
$imagick->setimageformat('png');
$imagick->transparentPaintImage(
$color, $alpha, $fuzz * \Imagick::getQuantum(), false
);
//Not required, but helps tidy up left over pixels
$imagick->despeckleimage();
header("Content-Type: image/png");
echo $imagick->getImageBlob();
}
?>
]]>
</programlisting>
</example>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
Официальный HTTP-пример сохранён целиком. Наши программы работают с локальными PNG, сеть и HTTP-выдачу не проверяют. MIME header сам по себе файл не перекодирует; JPEG не сохраняет alpha. Связи: файлы и запись, HTTP-ответ.
<?php
declare(strict_types=1);
require __DIR__ . '/paint-fixture.php';
$source = loadPaintSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$transparent = clone $source;
if (!$transparent->transparentPaintImage('white', 0.0, 0.0, false)) {
throw new RuntimeException('Не выполнен transparentPaintImage');
}
$transparent->setImageFormat('png');
$transparent->setImageDepth(8);
$transparent->setOption('png:color-type', '6');
if (!$transparent->writeImage(__DIR__ . '/transparent-global.png')) {
throw new RuntimeException('Не записан transparent-global.png');
}
$half = clone $source;
if (!$half->transparentPaintImage('white', 0.5, 0.0, false)) {
throw new RuntimeException('Не выполнен transparentPaintImage');
}
$half->setImageFormat('png');
$half->setImageDepth(8);
$half->setOption('png:color-type', '6');
if (!$half->writeImage(__DIR__ . '/transparent-half.png')) {
throw new RuntimeException('Не записан transparent-half.png');
}
$preview = paintPreview($transparent);
$halfPreview = paintPreview($half);
savePaintComparison([$source, $preview, $halfPreview], 'transparent-global-comparison.png');
$source->clear();
$preview->clear();
$halfPreview->clear();
$transparent->clear();
$half->clear();
Результат: Исходник; все белые пиксели с alpha 0; те же белые с alpha 0.5. Прозрачные файлы transparent-global.png и transparent-half.png сохранены отдельно. Сине-серая подложка есть только в просмотре. Распакуйте example.php, paint-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи и PHP/Imagick. Помощник восстанавливает точный PNG по Base64/SHA256 без шрифтов и сети. Stdout — transparent-global-comparison.png и перевод строки. Откройте PNG просмотрщиком; полное сравнение 1200×320 содержит целые панели 400×320 слева направо. Отдельные RGBA сохраняют alpha; подложка preview не является их фоном.
Ожидаемый вывод
transparent-global-comparison.png
<?php
declare(strict_types=1);
require __DIR__ . '/paint-fixture.php';
$source = loadPaintSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$stencil = clone $source;
if (!$stencil->transparentPaintImage('#3078a8', 0.0, 0.04 * $Q, true)) {
throw new RuntimeException('Не выполнен transparentPaintImage');
}
$stencil->setImageFormat('png');
$stencil->setImageDepth(8);
$stencil->setOption('png:color-type', '6');
if (!$stencil->writeImage(__DIR__ . '/accent-stencil.png')) {
throw new RuntimeException('Не записан accent-stencil.png');
}
$preview = paintPreview($stencil);
savePaintComparison([$source, $preview], 'transparent-accent.png');
$source->clear();
$preview->clear();
$stencil->clear();
Результат: Invert=true делает прозрачным всё, что не совпадает с синим в допуске 0.04×Q. accent-stencil.png — отдельный слой с исходными синими компонентами, а не окрашенная или бинарная маска. Распакуйте example.php, paint-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи и PHP/Imagick. Помощник восстанавливает точный PNG по Base64/SHA256 без шрифтов и сети. Stdout — transparent-accent.png и перевод строки. Откройте PNG просмотрщиком; полное сравнение 800×320 содержит целые панели 400×320 слева направо. Отдельные RGBA сохраняют alpha; подложка preview не является их фоном.
Ожидаемый вывод
transparent-accent.png
Связанный путь: модель выбора и связности, ошибки и ограничения.
Imagick::floodFillPaintImageНачинает в (x,y) и распространяется по подходящим соседям вверх/вниз/влево/вправо. Диагональное касание не соединяет области. Совпадение определяется обязательным target; invert меняет этот предикат, но не отменяет связность.
PECL imagick 2 >= 2.3.0, PECL imagick 3 · imagick
Imagick::floodFillPaintImage(mixed $fill, float $fuzz, mixed $target, int $x, int $y, bool $invert, int $channel = Imagick::CHANNEL_DEFAULT): boolСамая маленькая запись
В $image уже загружена отдельная копия рисунка. $ начинает имя переменной; -> вызывает метод, скобки содержат аргументы, запятые разделяют их, ; завершает команду. Кавычки задают строку цвета. #3078a8 — шестнадцатеричная запись RGB(48,120,168), по две цифры на компоненту; white — имя белого. False/true — логические значения. Fuzz 0.0 задаёт точный допуск для обычного RGB с 8 битами на компоненту. Начинает в (x,y) и распространяется по подходящим соседям вверх/вниз/влево/вправо. Диагональное касание не соединяет области. Совпадение определяется обязательным target; invert меняет этот предикат, но не отменяет связность.
$image->floodFillPaintImage('#d8ece4', 0.0, 'white', 8, 80, false);Метод возвращает bool true, а изменённое изображение остаётся в $image. Не заменяйте объект возвращённым bool. $image = clone $source создаёт независимую копию; простое присваивание объекта только добавляет второе имя. If проверяет условие, ! означает отрицание; throw new RuntimeException прекращает отказавшую цепочку. Подготовка: объекты и методы, копирование clone, исключения.
Полная официальная сигнатура
Imagick::floodFillPaintImage(mixed $fill, float $fuzz, mixed $target, int $x, int $y, bool $invert, int $channel = Imagick::CHANNEL_DEFAULT): bool| Аргумент | Смысл и ограничения |
|---|---|
| $fill | Обязательный ImagickPixel или строка цвета заливки. Здесь #d8ece4 для нового фона или свободный key #ff00ff перед прозрачностью. |
| $fuzz | Обязательный float в Quantum-единицах. Для нашего известного белого фона 0 достаточно; это не универсальный выбор для JPEG/шума. |
| $target | Обязательный цвет сравнения. PHP всегда передаёт его в Wand и заменяет им предварительно прочитанный цвет seed. Не пропускайте аргумент и не ожидайте автоматического выбора по (x,y). Можно явно получить ImagickPixel через getImagePixelColor(x,y). |
| $x / $y | Два обязательных int: столбец/строка начала, в пикселях, отсчёт от нуля вправо/вниз. Наш seed (8,80) лежит во внешнем белом. Другая точка внутри закрытой детали выбирает другую связную область. |
| $invert | Обязательный bool: false проходит по совпавшим пикселям; true — по несовпавшим. Если seed не удовлетворяет выбранному критерию, возможен true без изменений, как в сохранённой пробе. |
| $channel | Необязательная int-маска CHANNEL_DEFAULT. В ImageMagick 7 временная маска каналов ставится и восстанавливается; alpha может зависеть от fill и разрешения изменять её канал. В программах для заливки используется default, без общего обещания сохранения чужих каналов. |
Официальная доступность: PECL imagick 2 >= 2.3.0, PECL imagick 3; компиляция с ImageMagick 6.3.8 или новее. Все аргументы кроме явно необязательного channel нужны. Операция меняет текущий объект и возвращает bool true при успехе, размер не растёт. Пустое изображение, неверный цвет или нативный отказ библиотеки могут дать ImagickException; неверные PHP-типы/число аргументов — TypeError/ArgumentCountError. True не доказывает, что нашлись выбранные пиксели: неверный target в flood-проверке вернул true при неизменном рисунке.
Fuzz передаётся непосредственно. Для доли 0.04 сначала получаем $range = Imagick::getQuantumRange(), затем $Q = $range["quantumRangeLong"], после чего вычисляем 0.04*$Q. :: здесь вызывает статический метод класса; квадратные скобки читают элемент массива по строковому ключу. В проверенной Q16-сборке Q=65535 и допуск 2621.4. Это цветовая близость с учётом alpha/цветового пространства, не независимый интервал ±fuzz каждого RGB-канала. В наших основных программах исходник непрозрачный sRGB.
В точной Reflection Imagick 3.8.1 третий аргумент называется border_color, хотя raw XML называет его target; первые цветовые аргументы других методов имеют имена target_color/fill_color. Здесь позиционные вызовы. Для named arguments проверяйте фактические имена вашей версии. При invert=false переданный цвет служит target; при true выбирается его дополнение в связной области. Не трактуйте border_color как автоматически найденную границу предмета.
Для внешних параметров отдельно проверяют цвета, конечный неотрицательный fuzz, alpha0..1, стартовую точку внутри растра, разрешённые каналы и площадь/число кадров. Валидация внешней формы здесь не реализована: значения фиксированы. Обход всего изображения и дополнительные копии требуют памяти и времени; ускорение и размер файла не измерялись. Antialias/JPEG создают другие цвета, большой fuzz может захватить нужные детали; точное удаление белого может оставить светлые ореолы.
Полный официальный XML: описание, все параметры, return, пример и ссылки
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.floodfillpaintimage">
<refnamediv>
<refname>Imagick::floodFillPaintImage</refname>
<refpurpose>Changes the color value of any pixel that matches target</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>bool</type><methodname>Imagick::floodFillPaintImage</methodname>
<methodparam><type>mixed</type><parameter>fill</parameter></methodparam>
<methodparam><type>float</type><parameter>fuzz</parameter></methodparam>
<methodparam><type>mixed</type><parameter>target</parameter></methodparam>
<methodparam><type>int</type><parameter>x</parameter></methodparam>
<methodparam><type>int</type><parameter>y</parameter></methodparam>
<methodparam><type>bool</type><parameter>invert</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>channel</parameter><initializer>Imagick::CHANNEL_DEFAULT</initializer></methodparam>
</methodsynopsis>
<para>
Changes the color value of any pixel that matches target and is an
immediate neighbor. This method is a replacement for deprecated
<function>Imagick::paintFloodFillImage</function>.
&imagick.method.available.0x638;
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>fill</parameter></term>
<listitem>
<para>
ImagickPixel object or a string containing the fill color
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>fuzz</parameter></term>
<listitem>
<para>
&imagick.parameter.fuzz;
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>target</parameter></term>
<listitem>
<para>
ImagickPixel object or a string containing the target color to paint
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>x</parameter></term>
<listitem>
<para>
X start position of the floodfill
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>y</parameter></term>
<listitem>
<para>
Y start position of the floodfill
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>invert</parameter></term>
<listitem>
<para>
If &true; paints any pixel that does not match the target color.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>channel</parameter></term>
<listitem>
<para>
&imagick.parameter.channel;
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&imagick.return.success;
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title><methodname>Imagick::floodfillPaintImage</methodname> example</title>
<programlisting role="php">
<![CDATA[
<?php
/* Create new imagick object */
$im = new Imagick();
/* create red, green and blue images */
$im->newImage(100, 50, "red");
$im->newImage(100, 50, "green");
$im->newImage(100, 50, "blue");
/* Append the images into one */
$im->resetIterator();
$combined = $im->appendImages(true);
/* Save the intermediate image for comparison */
$combined->writeImage("floodfillpaint_intermediate.png");
/* The target pixel to paint */
$x = 1;
$y = 1;
/* Get the color we are painting */
$target = $combined->getImagePixelColor($x, $y);
/* Paints pixel in position 1,1 black and all neighboring
pixels that match the target color */
$combined->floodfillPaintImage("black", 1, $target, $x, $y, false);
/* Save the result */
$combined->writeImage("floodfillpaint_result.png");
?>
]]>
</programlisting>
&example.outputs.similar;
<mediaobject>
<alt>Output of example : Imagick::floodfillPaintImage()</alt>
<imageobject>
<imagedata fileref="en/reference/imagick/figures/floodfillpaint_intermediate.png"/>
</imageobject>
<imageobject>
<imagedata fileref="en/reference/imagick/figures/floodfillpaint_result.png"/>
</imageobject>
</mediaobject>
</example>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
Официальный HTTP-пример сохранён целиком. Наши программы работают с локальными PNG, сеть и HTTP-выдачу не проверяют. MIME header сам по себе файл не перекодирует; JPEG не сохраняет alpha. Связи: файлы и запись, HTTP-ответ.
<?php
declare(strict_types=1);
require __DIR__ . '/paint-fixture.php';
$source = loadPaintSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$image = clone $source;
$target = $image->getImagePixelColor(8, 80);
if (!$image->floodFillPaintImage('#d8ece4', 0.0, $target, 8, 80, false)) {
throw new RuntimeException('Не выполнен floodFillPaintImage');
}
savePaintComparison([$source, $image], 'flood-background.png');
$source->clear();
$image->clear();
Результат: Известный фон от точки (8,80) перекрашен в #d8ece4. Закрытые белые этикетка, перед кружки и отверстие ручки остаются белыми. Target явно получен из стартового пикселя, а не неявно выбран методом. Распакуйте example.php, paint-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи и PHP/Imagick. Помощник восстанавливает точный PNG по Base64/SHA256 без шрифтов и сети. Stdout — flood-background.png и перевод строки. Откройте PNG просмотрщиком; полное сравнение 800×320 содержит целые панели 400×320 слева направо. Отдельные RGBA сохраняют alpha; подложка preview не является их фоном.
Ожидаемый вывод
flood-background.png
<?php
declare(strict_types=1);
require __DIR__ . '/paint-fixture.php';
$source = loadPaintSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$global = clone $source;
if (!$global->transparentPaintImage('white', 0.0, 0.0, false)) {
throw new RuntimeException('Не выполнен transparentPaintImage');
}
$global->setImageFormat('png');
$global->setImageDepth(8);
$global->setOption('png:color-type', '6');
if (!$global->writeImage(__DIR__ . '/sticker-global.png')) {
throw new RuntimeException('Не записан sticker-global.png');
}
$sticker = clone $source;
if (!$sticker->floodFillPaintImage('#ff00ff', 0.0, 'white', 8, 80, false)) {
throw new RuntimeException('Не выполнен floodFillPaintImage');
}
if (!$sticker->transparentPaintImage('#ff00ff', 0.0, 0.0, false)) {
throw new RuntimeException('Не выполнен transparentPaintImage');
}
$sticker->setImageFormat('png');
$sticker->setImageDepth(8);
$sticker->setOption('png:color-type', '6');
if (!$sticker->writeImage(__DIR__ . '/sticker-connected.png')) {
throw new RuntimeException('Не записан sticker-connected.png');
}
$globalPreview = paintPreview($global);
$stickerPreview = paintPreview($sticker);
savePaintComparison([$source, $globalPreview, $stickerPreview], 'flood-sticker.png');
$source->clear();
$globalPreview->clear();
$stickerPreview->clear();
$global->clear();
$sticker->clear();
Результат: Исходник; неудачная для этой задачи глобальная прозрачность белого; связная замена внешнего белого на свободный magenta-key и прозрачность только этого key. sticker-connected.png сохраняет внутренние белые детали, sticker-global.png показывает различие. Оба настоящие RGBA 400×320. Распакуйте example.php, paint-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи и PHP/Imagick. Помощник восстанавливает точный PNG по Base64/SHA256 без шрифтов и сети. Stdout — flood-sticker.png и перевод строки. Откройте PNG просмотрщиком; полное сравнение 1200×320 содержит целые панели 400×320 слева направо. Отдельные RGBA сохраняют alpha; подложка preview не является их фоном.
Ожидаемый вывод
flood-sticker.png
Связанный путь: модель выбора и связности, ошибки и ограничения.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


