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

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

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

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

Глава 357 · После alpha и композиции

Imagick: перекраска, прозрачность и связный фон

Плоская упаковка и PNG-наклейка: выбрать цвет или связанную область, сохранив внутренние белые детали.

Выпустить другой цвет упаковки и подготовить наклейку

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

Собственная плоская графика 400×320: внешний белый фон, закрытые белые детали, точный синий и близкий оттенок, отдельный badge и SKU
Собственная плоская графика 400×320: внешний белый фон, закрытые белые детали, точный синий и близкий оттенок, отдельный badge и SKU
Готовая оранжевая версия по точному синему: меняются все совпадающие участки, включая отдельные акценты
Готовая оранжевая версия по точному синему: меняются все совпадающие участки, включая отдельные акценты

Это специально нарисованный вход с известными цветами и закрытыми контурами. Мы не выдаём его за фотографию или алгоритм автоматического отделения товара. Два нижних образца имеют RGB(48,120,168) и RGB(53,124,171). При fuzz 0 второй оттенок отличается, даже если глаз считает оба синими. Надпись BLUE BOX и напечатанные под образцами числа являются частью исходного рисунка: при перекраске они сами не пересчитываются. Актуальный цвет результата задаётся вызовом и подписями сравнения, а не старым текстом под оранжевой плашкой.

RGB — красная, зелёная и синяя компоненты цвета. RGBA добавляет к ним alpha, обозначенную A. В условной сетке схемы T — клетка, уже подходящая под цветовое условие, X — неподходящая клетка, S — стартовая точка только этой сетки. ΔR/G/B означает разность соответствующих компонент, вертикальные черты — её модуль, знак ≤ читается «не больше». Цветовое сходство в общем случае не сводится к трём таким независимым сравнениям.

Термин до схемыЗначение
Target и fillTarget — цвет сравнения, fill — цвет записи. Совпадение проверяется по цветовым данным, не по названию предмета. Invert=false выбирает совпавшее, true — несовпавшее.
Q и fuzzQ — 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 при этом обязателен.
Сравнение цвета → глобальная запись RGB/alpha или только достижимая от seed область. Условная сетка объясняет связность, не подменяет реальные PNG.
Сравнение цвета → глобальная запись RGB/alpha или только достижимая от seed область. Условная сетка объясняет связность, не подменяет реальные PNG.

Самая маленькая запись

В $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. Во втором варианте близкий синий на боковине и образце входит в выбранное множество. Слишком большой допуск способен захватить другие цвета; это не управление насыщенностью и не классификатор «всё синее».

Глобальная замена: fuzz 0 и 0.04×Q; отдельный badge тоже принадлежит совпадениям
Глобальная замена: fuzz 0 и 0.04×Q; отдельный badge тоже принадлежит совпадениям

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

Локальная перекраска упаковки: вне известного ROI исходные пиксели сохранены
Локальная перекраска упаковки: вне известного ROI исходные пиксели сохранены

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

Создать прозрачный слой и увидеть цену глобального выбора

Если действительно нужно убрать все белые пиксели, transparentPaint подходит прямо. Сравним alpha 0 и 0.5: второй вариант оставляет половинный вклад белого. Для нашей наклейки глобальный белый — полезный контрпример: он удаляет также этикетку, перед кружки и белое внутри ручки.

Настоящие RGBA отдельно от preview: глобальный белый удаляет и фон, и внутренние белые детали; invert оставляет синий слой
Настоящие RGBA отдельно от preview: глобальный белый удаляет и фон, и внутренние белые детали; invert оставляет синий слой

Другая задача — извлечь цветной акцент как слой для макета. 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, сохраняя белые детали.

Связная заливка внешнего фона и самостоятельная RGBA-наклейка; глобальный белый показан рядом как другое правило
Связная заливка внешнего фона и самостоятельная RGBA-наклейка; глобальный белый показан рядом как другое правило

Для второй практики нужен свободный промежуточный цвет. В нашем входе #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.
Полупрозрачный белый не совпал с whiteAlpha участвует в цветовом сравнении. В пробе 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.

Выбрать область действия и проверить свой вариант

Все совпадения → opaque/transparent; достижимый внешний фон → flood; локальный макет → явный ROI
Все совпадения → opaque/transparent; достижимый внешний фон → flood; локальный макет → явный ROI

Упражнение: сделать фон светло-жёлтым, не изменяя внутренний белый. Решение: в минимальной 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
Изменить только упаковку, сохранив badge и SKUПример для указанного окружения
<?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. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.