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

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

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

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

Глава 387 · После объектов, клонирования и основных цветовых операций; совместимость с IM6

Imagick: старые заливки, замена цвета и прозрачность — понять и перенести IM6-код

Пять реальных операций на одном собственном рисунке: барьер и target, локальный и глобальный выбор, настоящая alpha, fuzz, каналы и измеренный перенос.

Изменить одну область старого рисунка и понять, что сохранится

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

Собственный исходник и настоящая заливка левого контура: чёрный барьер защищает правую область
Собственный исходник и настоящая заливка левого контура: чёрный барьер защищает правую область

Исходник 400 × 320 создан для этой задачи и входит в каждый архив. Начало (50,90) лежит слева; справа такой же красный цвет, но связи с левой областью нет. Синие вставки и близкий красный квадрат внутри помогают отличить «всё до контура» от «только совпавший цвет». Это условная схема интерфейсной графики, не алгоритм распознавания товара на фотографии. Современные заливки и замена цвета уже разобраны отдельно; эта глава нужна для legacy-кода.

$image = clone $source;
$image->colorFloodfillImage('rgb(32,176,96)', 0, 'black', 50, 90);

$source хранит прочитанный PNG, clone создаёт отдельный изменяемый объект $image. Запись -> вызывает его метод; скобки содержат аргументы по порядку, запятые разделяют значения, ; заканчивает инструкцию. Строки в кавычках задают цвета, число 0 означает точное сравнение, 50 и 90 — координаты начала. Чёрный здесь останавливает проход. Вся область внутри левого контура, включая синий участок, становится зелёной, а не только исходные красные пиксели. После этой строки объект ещё нужно записать в файл.

Все пять изучаемых методов устарели с Imagick 3.4.4 и исполнялись в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL. На текущем Windows IM7 их работу не заявляем. Два E_DEPRECATED от каждого legacy-вызова сохраняются в журнал; это предупреждение о переносе кода, а не повод подавить всю диагностику. Готовый результат и исходник можно скачать вместе с самостоятельной программой ниже.

Разделить барьер, target, связность, каналы и прозрачность

Seed выбирает связную область; барьер, совпадающий target и глобальный цвет задают разные правила
Seed выбирает связную область; барьер, совпадающий target и глобальный цвет задают разные правила
ОперацияПравило выбора на нашем исходникеЧто происходит с синей вставкой
colorFloodfillImage, blackСвязная область от (50,90), не совпадающая с чёрным барьером.В левой области тоже перекрашивается.
matteFloodfillImage, blackТа же область до барьера, но присваивается alpha.Слева становится прозрачной.
paintFloodfillImage, exact redТолько связные подходящие красные пиксели от seed.Не подходит, остаётся синей.
paintOpaqueImage, exact redВсе совпавшие пиксели по всему кадру, без seed.Не подходит, остаётся синей.
paintTransparentImage, exact redТот же глобальный выбор цвета, присваивается alpha.Остаётся видимой.

Модель заливки похожа на проход по соседним клеткам вверх, вниз, влево и вправо. Диагональное касание само по себе не соединяет области. При барьерном варианте надо остановиться перед подходящим чёрным пикселем; при target-варианте продолжать можно только по подходящим красным. Имя bordercolor у paintFloodfillImage историческое и вводит в заблуждение: exact native wrapper фактически использует его как target. Слишком большой fuzz может перестать считать контур надёжной границей, поэтому предварительно проверяют условия рисунка.

Alpha — отдельная компонента прозрачности. Значение 0 означает прозрачный пиксель, 1 — непрозрачный; RGB при операции matte/transparent остаются прежними. Шахматка — отдельная подложка просмотра, а не данные прозрачного PNG. Файлы *-raw8.png содержат реальные RGBA без шахматки. Просмотр JPEG или белая HTML-подложка сами по себе не показывают, сохранилась ли alpha. Подробнее: alpha и фон, цвет пикселя и смешивание слоёв.

Fuzz — числовой допуск в шкале Quantum, здесь Q = 65 535. Для двух процентов вычисляем 0.02 × Q = 1 310.7; готовый аргумент 2 не означает два процента. Сравнение может учитывать alpha и цветовое пространство. Для данного непрозрачного RGB-рисунка отдельно показано точное совпадение и близкий красный, без обещания одинакового результата для фотографий и других профилей.

Выполнить пять коротких операций с понятными аргументами

Пять независимых настоящих результатов: область до барьера, её alpha, локальный target и две глобальные операции
Пять независимых настоящих результатов: область до барьера, её alpha, локальный target и две глобальные операции

Распакуйте любой пример в отдельный каталог и выполните php example.php. В архиве лежат собственный PNG в source.png.b64 и полный legacy-paint-fill-fixture.php. lpRestore восстанавливает PNG по контрольной сумме; lpSource открывает его. В основном коде остаётся изучаемый вызов. lpCall принимает короткую функцию fn()=>..., выполняет её только под временным обработчиком E_DEPRECATED и возвращает результат вместе с журналом. Стрелочная функция нужна здесь для ограниченного перехвата предупреждений; простая операция — строка с ->, показанная перед полной программой. Стрелочные функции, исключения и clone объясняют эти вспомогательные конструкции.

colorFloodfillImage

$image->colorFloodfillImage('rgb(32,176,96)',0,'black',50,90);

Левое красное поле, синяя вставка и близкий красный квадрат стали зелёными: барьером был чёрный контур. Правая область, сам контур и внешний белый фон сохранены.

АргументСмысл
$fillОбязательный ImagickPixel или строка цвета заливки, здесь rgb(32,176,96). Непрозрачный fill полностью перекрывает выбранную область; legacy Core использует OVER, поэтому полупрозрачная заливка смешивается с прежними пикселями.
$fuzzОбязательный float: допустимое различие цвета в Quantum-единицах. Здесь 0: чёрный барьер совпадает точно. Официальный пример с интенсивностями 100 и 102 и fuzz 10 относится к числовому допуску, не к процентам.
$bordercolorОбязательный цвет барьера, здесь black. В actual IM6 ненулевой border включает FillToBorderMethod: проходить можно по соседям, не совпадающим с ним. Null в PHP-wrapper этого метода не разрешён.
$x, $yОбязательные int: начальные столбец и строка, нумерация с 0. Здесь (50,90) внутри левого контура. Нужны 0 ≤ x < ширина и 0 ≤ y < высота.

Перекрасить всю область внутри левого чёрного контура

Левое красное поле, синяя вставка и близкий красный квадрат стали зелёными: барьером был чёрный контур. Правая область, сам контур и внешний белый фон сохранены.

Перекрасить всю область внутри левого чёрного контураПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$image=clone $source;
$call=lpCall('color',fn()=>$image->colorFloodfillImage('rgb(32,176,96)',0,'black',50,90));
lpMinimalProof('legacy-color-fill-minimal','color','colorFloodfillImage',$source,$image,$call,$before);
echo "legacy-paint-fill-color.png\ncolor-raw8.png\nsource-preview8.png\nmetrics.json\nreturned=1 deprecations=2 source-unchanged=1\n";

Левое красное поле, синяя вставка и близкий красный квадрат стали зелёными: барьером был чёрный контур. Правая область, сам контур и внешний белый фон сохранены. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-color.png
color-raw8.png
source-preview8.png
metrics.json
returned=1 deprecations=2 source-unchanged=1

matteFloodfillImage

$image->matteFloodfillImage(0,0,'black',50,90);

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

АргументСмысл
$alphaОбязательный float: 0 полностью прозрачно, 1 полностью непрозрачно. Внутри IM6 это переводится в opacity Q − Q × alpha. Значение присваивается выбранной области, не умножает прежнюю alpha; RGB остаются прежними.
$fuzzОбязательный float в Quantum-единицах, допуск сравнения с барьером; здесь 0.
$bordercolorОбязательная строка или ImagickPixel с цветом барьера; здесь black. Названный в официальном тексте FillToBorderMethod — внутренний режим, не дополнительный аргумент PHP.
$x, $yОбязательные int координаты начала связной области; здесь (50,90). Проверяйте границы кадра до вызова.

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

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

Сделать прозрачной область внутри одного контураПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$image=clone $source;
$call=lpCall('matte',fn()=>$image->matteFloodfillImage(0,0,'black',50,90));
lpMinimalProof('legacy-matte-fill-minimal','matte','matteFloodfillImage',$source,$image,$call,$before);
echo "legacy-paint-fill-matte.png\nmatte-raw8.png\nmetrics.json\nreturned=1 deprecations=2 source-unchanged=1\n";

Внутри левого контура появились настоящие прозрачные пиксели, включая синюю вставку. Справа всё осталось непрозрачным. RGB выбранных пикселей не изменились; шахматная подложка существует только в отдельном просмотре. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-matte.png
matte-raw8.png
metrics.json
returned=1 deprecations=2 source-unchanged=1

paintFloodfillImage

$image->paintFloodfillImage('rgb(32,176,96)',0,'rgb(208,32,48)',50,90);

Зелёным стал связный точный красный участок слева. Левая синяя вставка и близкий красный квадрат сохранились, как и правое красное поле. Третий аргумент этого метода — фактический target, несмотря на историческое имя bordercolor.

АргументСмысл
$fillОбязательный ImagickPixel или строка нового цвета; здесь непрозрачный зелёный.
$fuzzОбязательный float в Quantum-единицах, допуск сравнения с target. При 0 близкий красный квадрат не совпадает с точным красным.
$bordercolorИсторическое имя третьего параметра. В проверенном IM6 deprecated Wand делегирует современному FloodfillPaintImage с invert=false: этот цвет является совпадающим target, а не барьером. Явный red выбирает только связную красную область; black при красном seed оставляет изображение прежним и всё равно возвращает true. Actual wrapper 3.7 допускает null, чтобы Wand взял target из seed; XML/stub такой nullable-тип не объявляют, поэтому это отдельно проверенная особенность этой реализации.
$x, $yОбязательные int координаты seed, здесь (50,90); сами по себе не отменяют явно переданный target.
$channelНеобязательный int, по умолчанию Imagick::CHANNEL_DEFAULT. Именованные CHANNEL_* ограничивают запись каналов, а не геометрическую область. Несколько каналов объединяют побитовым |. Полупрозрачный fill в Core может также активировать/записать alpha; не обещаем универсальную изоляцию alpha одним RGB-mask.

Перекрасить только связный красный участок

Зелёным стал связный точный красный участок слева. Левая синяя вставка и близкий красный квадрат сохранились, как и правое красное поле. Третий аргумент этого метода — фактический target, несмотря на историческое имя bordercolor.

Перекрасить только связный красный участокПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$image=clone $source;
$call=lpCall('paint',fn()=>$image->paintFloodfillImage('rgb(32,176,96)',0,'rgb(208,32,48)',50,90));
lpMinimalProof('legacy-paint-fill-minimal','paint','paintFloodfillImage',$source,$image,$call,$before);
echo "legacy-paint-fill-paint.png\npaint-raw8.png\nmetrics.json\nreturned=1 deprecations=2 source-unchanged=1\n";

Зелёным стал связный точный красный участок слева. Левая синяя вставка и близкий красный квадрат сохранились, как и правое красное поле. Третий аргумент этого метода — фактический target, несмотря на историческое имя bordercolor. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-paint.png
paint-raw8.png
metrics.json
returned=1 deprecations=2 source-unchanged=1

paintOpaqueImage

$image->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0);

Точный красный стал зелёным в обоих несвязанных контейнерах. Синие вставки и близкий красный квадрат сохранились при fuzz 0. Координаты для глобальной замены не нужны.

АргументСмысл
$targetОбязательный ImagickPixel или строка исходного цвета; здесь rgb(208,32,48). Поиск глобальный: координат нет, обе красные области подходят.
$fillОбязательный ImagickPixel или строка цвета замены; здесь rgb(32,176,96).
$fuzzОбязательный float в Quantum-единицах. 0 выбирает точное совпадение, а 0.02 × Q в нашем примере дополнительно выбирает близкий красный квадрат.
$channelНеобязательный int, по умолчанию CHANNEL_DEFAULT. CHANNEL_BLUE присваивает выбранным пикселям только синий компонент fill; R/G/A сохраняются в показанном непрозрачном RGB-случае. Для нескольких каналов используют |.

Заменить точный красный цвет в обоих контейнерах

Точный красный стал зелёным в обоих несвязанных контейнерах. Синие вставки и близкий красный квадрат сохранились при fuzz 0. Координаты для глобальной замены не нужны.

Заменить точный красный цвет в обоих контейнерахПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$image=clone $source;
$call=lpCall('opaque',fn()=>$image->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0));
lpMinimalProof('legacy-opaque-minimal','opaque','paintOpaqueImage',$source,$image,$call,$before);
echo "legacy-paint-fill-opaque.png\nopaque-raw8.png\nmetrics.json\nreturned=1 deprecations=2 source-unchanged=1\n";

Точный красный стал зелёным в обоих несвязанных контейнерах. Синие вставки и близкий красный квадрат сохранились при fuzz 0. Координаты для глобальной замены не нужны. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-opaque.png
opaque-raw8.png
metrics.json
returned=1 deprecations=2 source-unchanged=1

paintTransparentImage

$image->paintTransparentImage('rgb(208,32,48)',0,0);

Оба точных красных поля получили alpha 0. Синие вставки, близкий красный квадрат, чёрные контуры и белый фон остались видимыми. Это глобальный выбор цвета, а не распознавание фона или объекта.

АргументСмысл
$targetОбязательный ImagickPixel или строка выбранного цвета; все совпавшие пиксели во всём изображении получат alpha. Это не выбор связного внешнего фона.
$alphaОбязательный float: 0 прозрачно, 1 непрозрачно. Присваивается alpha, RGB сохраняются; параметра fill у метода нет. Общая фраза официального описания про fill не соответствует его собственной сигнатуре, поэтому здесь показана фактическая операция прозрачности.
$fuzzОбязательный float в Quantum-единицах, допуск совпадения с target. Большой допуск может убрать детали объекта похожего цвета. Параметров invert и channel у этого legacy-метода нет.

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

Оба точных красных поля получили alpha 0. Синие вставки, близкий красный квадрат, чёрные контуры и белый фон остались видимыми. Это глобальный выбор цвета, а не распознавание фона или объекта.

Сделать прозрачным точный красный цвет в обоих контейнерахПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$image=clone $source;
$call=lpCall('transparent',fn()=>$image->paintTransparentImage('rgb(208,32,48)',0,0));
lpMinimalProof('legacy-transparent-minimal','transparent','paintTransparentImage',$source,$image,$call,$before);
echo "legacy-paint-fill-transparent.png\ntransparent-raw8.png\nmetrics.json\nreturned=1 deprecations=2 source-unchanged=1\n";

Оба точных красных поля получили alpha 0. Синие вставки, близкий красный квадрат, чёрные контуры и белый фон остались видимыми. Это глобальный выбор цвета, а не распознавание фона или объекта. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-transparent.png
transparent-raw8.png
metrics.json
returned=1 deprecations=2 source-unchanged=1

Полный helper в последнем разделе открыт для чтения и входит в каждый ZIP. Он восстанавливает вход, рисует только отдельную подложку просмотра, сохраняет raw PNG и измерения. Он не вызывает перечисленные методы за вас и не подменяет результат нарисованной иллюстрацией. Значения пикселей и количества изменений измерены через PIXEL_CHAR до отдельного экспорта PNG8; RGBA16-хеш — точное сравнение численных компонентов, а не хеш байтов файла.

Настроить редактор, проверить перенос и реальные отказы

Реальные дополнительные случаи: fuzz выбирает близкий цвет, один канал меняется отдельно, неверный target оставляет исходник, modern-вызов переносит нужное правило
Реальные дополнительные случаи: fuzz выбирает близкий цвет, один канал меняется отдельно, неверный target оставляет исходник, modern-вызов переносит нужное правило

Теперь создадим сравнение для настройки старого редактора: каждый режим работает на независимой копии одного исходника. Пять основных действий дополняют четыре диагностических случая. Массив $operations содержит подписанные функции; foreach берёт каждую из них, создаёт clone, выполняет её и складывает полученные пиксели и журнал в $rows. Это удобная организация повторяющейся работы после знакомства с минимальными вызовами, не обязательное устройство любой заливки. Массивы и перебор помогают читать эту часть.

Выбрать область, допуск и каналы в одном контролируемом редакторе

Пять независимых результатов сопоставлены на общей полосе. Отдельно допуск 0.02 × Q захватил близкий красный квадрат; CHANNEL_BLUE изменил только синий канал выбранного красного. Несовпадающий target дал true без изменения, а null в paintFloodfillImage выбрал цвет seed и совпал с явным красным.

Выбрать область, допуск и каналы в одном контролируемом редактореПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$quantum=Imagick::getQuantumRange()['quantumRangeLong'];
$operations=[
    'color'=>fn(Imagick $i)=>$i->colorFloodfillImage('rgb(32,176,96)',0,'black',50,90),
    'matte'=>fn(Imagick $i)=>$i->matteFloodfillImage(0,0,'black',50,90),
    'paint'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,'rgb(208,32,48)',50,90),
    'opaque'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0),
    'transparent'=>fn(Imagick $i)=>$i->paintTransparentImage('rgb(208,32,48)',0,0),
    'fuzz'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0.02*$quantum),
    'blue-channel'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','white',0,Imagick::CHANNEL_BLUE),
    'mismatch'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,'black',50,90),
    'null'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,null,50,90),
];
$rows=[];$images=[];
foreach($operations as $key=>$operation){
    $image=clone $source;$call=lpCall($key,fn()=>$operation($image));
    $rows[$key]=lpSummary($source,$image,$call);$images[$key]=$image;
    if(in_array($key,['color','matte','paint','opaque','transparent'],true)){lpRaw($image,'workflow-'.$key.'-raw8.png');}
    else{lpView($image,'workflow-'.$key.'8.png');}
}
$panelKeys=['color','matte','paint','opaque','transparent'];
$rects=lpCompare(array_map(fn($key)=>$images[$key],$panelKeys),'legacy-paint-fill-workflow.png');
$checks=[];foreach($panelKeys as $key){foreach(lpCaseChecks($key,$rows[$key],lpSamples($source)) as $name=>$value){$checks[$key.'_'.$name]=$value;}}
$near=$rows['fuzz']['samples']['near_red'];$original=lpSamples($source);$channel=$rows['blue-channel']['samples']['left'];
$checks+=['fuzz_selects_near_red'=>$near===[32,176,96,255],
    'blue_channel_preserves_RG'=>$channel===[$original['left'][0],$original['left'][1],255,255],
    'mismatching_target_true_but_no_change'=>$rows['mismatch']['returned']===true&&$rows['mismatch']['changed_pixels']===0,
    'null_seed_matches_explicit_target'=>$rows['null']['rgba16_sha256']===$rows['paint']['rgba16_sha256'],
    'nine_scoped_legacy_calls'=>count(array_filter($rows,fn($row)=>($row['returned']??null)===true&&$row['deprecations']===2))===9,
    'source_preserved'=>lpHash($source)===$before];
lpDiagnostic('legacy-paint-fill-workflow',['executed_apis'=>['colorFloodfillImage','matteFloodfillImage','paintFloodfillImage','paintOpaqueImage','paintTransparentImage'],
    'quantum'=>$quantum,'fuzz'=>0.02*$quantum,'channel'=>Imagick::CHANNEL_BLUE,'rows'=>$rows,'panel_keys'=>$panelKeys,'panel_geometry'=>$rects,
    'source_samples'=>$original,'source_unchanged'=>lpHash($source)===$before,'checks'=>$checks]);
echo "legacy-paint-fill-workflow.png\nworkflow-color-raw8.png\nworkflow-matte-raw8.png\nworkflow-paint-raw8.png\nworkflow-opaque-raw8.png\nworkflow-transparent-raw8.png\nworkflow-fuzz8.png\nworkflow-blue-channel8.png\nworkflow-mismatch8.png\nworkflow-null8.png\nmetrics.json\ncases=9 deprecations=18 mismatch-unchanged=1 null-equal=1 source-unchanged=1\n";

Пять независимых результатов сопоставлены на общей полосе. Отдельно допуск 0.02 × Q захватил близкий красный квадрат; CHANNEL_BLUE изменил только синий канал выбранного красного. Несовпадающий target дал true без изменения, а null в paintFloodfillImage выбрал цвет seed и совпал с явным красным. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-workflow.png
workflow-color-raw8.png
workflow-matte-raw8.png
workflow-paint-raw8.png
workflow-opaque-raw8.png
workflow-transparent-raw8.png
workflow-fuzz8.png
workflow-blue-channel8.png
workflow-mismatch8.png
workflow-null8.png
metrics.json
cases=9 deprecations=18 mismatch-unchanged=1 null-equal=1 source-unchanged=1
СитуацияНастройкаНаблюдаемый результат
Два близких красныхpaintOpaqueImage, fuzz = 0.02 × QБлизкий квадрат тоже зелёный, тогда как при 0 он сохранялся.
Изменить только Bfill white, CHANNEL_BLUEТочный красный стал (208,32,255); R/G/A сохранены в этом RGB-случае.
Не тот targetpaintFloodfillImage с black при красном seedTrue, но ноль изменённых пикселей. Результат проверяют, а не выводят только флаг.
Взять цвет началаpaintFloodfillImage с nullНа этой версии совпало с явно переданным точным красным. Это actual wrapper-ветка, не общее разрешение null для всех методов.

Перенести задачу, а не только переименовать метод

Следующая программа в одном процессе сравнивает пять старых и пять современных вызовов на отдельных копиях того же входа. Для барьера современному floodFillPaintImage нужен invert=true; для совпадающего target invert=false. Для matte ограничиваем запись каналом alpha. Для глобальных методов также явно передаём invert=false. Полупрозрачная цветная заливка не объявляется универсально равной legacy OVER: здесь заливка непрозрачная и равенство проверено именно для этого исходника.

Перенести пять операций и поймать три настоящие ошибки

Все пять пар сравниваются по всем RGBA16-компонентам до записи отдельного PNG8: результаты старых и современных вызовов равны на этом исходнике. Современные вызовы не дали deprecated-предупреждений. За границей кадра, на пустом объекте и при null вместо обязательного барьера получены и сохранены три ImagickException.

Перенести пять операций и поймать три настоящие ошибкиПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$legacy=[
    'color'=>fn(Imagick $i)=>$i->colorFloodfillImage('rgb(32,176,96)',0,'black',50,90),
    'matte'=>fn(Imagick $i)=>$i->matteFloodfillImage(0,0,'black',50,90),
    'paint'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,'rgb(208,32,48)',50,90),
    'opaque'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0),
    'transparent'=>fn(Imagick $i)=>$i->paintTransparentImage('rgb(208,32,48)',0,0),
];
$modern=[
    'color'=>fn(Imagick $i)=>$i->floodFillPaintImage('rgb(32,176,96)',0,'black',50,90,true,Imagick::CHANNEL_DEFAULT),
    'matte'=>fn(Imagick $i)=>$i->floodFillPaintImage('transparent',0,'black',50,90,true,Imagick::CHANNEL_ALPHA),
    'paint'=>fn(Imagick $i)=>$i->floodFillPaintImage('rgb(32,176,96)',0,'rgb(208,32,48)',50,90,false,Imagick::CHANNEL_DEFAULT),
    'opaque'=>fn(Imagick $i)=>$i->opaquePaintImage('rgb(208,32,48)','rgb(32,176,96)',0,false,Imagick::CHANNEL_DEFAULT),
    'transparent'=>fn(Imagick $i)=>$i->transparentPaintImage('rgb(208,32,48)',0,0,false),
];
$rows=[];$pairs=[];$images=[];
foreach($legacy as $key=>$operation){
    $old=clone $source;$new=clone $source;
    $oldCall=lpCall('legacy-'.$key,fn()=>$operation($old));
    $newCall=lpCall('modern-'.$key,fn()=>$modern[$key]($new));
    $rows[$key]=['legacy'=>lpSummary($source,$old,$oldCall),'modern'=>lpSummary($source,$new,$newCall)];
    $pairs[$key]=lpHash($old)===lpHash($new);$images[]=$new;lpRaw($new,'migration-modern-'.$key.'-raw8.png');
}
$errors=[
    'bad_seed'=>lpCall('bad_seed',fn()=>(clone $source)->colorFloodfillImage('green',0,'black',500,90)),
    'empty'=>lpCall('empty',fn()=>(new Imagick())->paintOpaqueImage('red','green',0)),
    'color_null'=>lpCall('color_null',fn()=>(clone $source)->colorFloodfillImage('green',0,null,50,90)),
];
$rects=lpCompare($images,'legacy-paint-fill-migration.png');$checks=[];
foreach($rows as $key=>$row){
    $checks[$key.'_same_RGBA16']=$pairs[$key];
    $checks[$key.'_legacy_true_two_warnings']=($row['legacy']['returned']??null)===true&&$row['legacy']['deprecations']===2;
    $checks[$key.'_modern_true_no_warnings']=($row['modern']['returned']??null)===true&&$row['modern']['deprecations']===0;
}
foreach($errors as $key=>$error){$checks[$key.'_caught']=($error['error']['class']??null)==='ImagickException'&&$error['deprecations']===2;}
$checks['source_preserved']=lpHash($source)===$before;
lpDiagnostic('legacy-paint-fill-migration',['executed_apis'=>['colorFloodfillImage','matteFloodfillImage','paintFloodfillImage','paintOpaqueImage','paintTransparentImage',
    'floodFillPaintImage','opaquePaintImage','transparentPaintImage'],'rows'=>$rows,'modern_pixel_equal'=>$pairs,'errors'=>$errors,
    'panel_keys'=>array_keys($legacy),'panel_geometry'=>$rects,'source_unchanged'=>lpHash($source)===$before,'checks'=>$checks]);
echo "legacy-paint-fill-migration.png\nmigration-modern-color-raw8.png\nmigration-modern-matte-raw8.png\nmigration-modern-paint-raw8.png\nmigration-modern-opaque-raw8.png\nmigration-modern-transparent-raw8.png\nmetrics.json\nmodern-pairs=5 equal=5 failures=3 modern-deprecations=0 source-unchanged=1\n";

Все пять пар сравниваются по всем RGBA16-компонентам до записи отдельного PNG8: результаты старых и современных вызовов равны на этом исходнике. Современные вызовы не дали deprecated-предупреждений. За границей кадра, на пустом объекте и при null вместо обязательного барьера получены и сохранены три ImagickException. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-migration.png
migration-modern-color-raw8.png
migration-modern-matte-raw8.png
migration-modern-paint-raw8.png
migration-modern-opaque-raw8.png
migration-modern-transparent-raw8.png
metrics.json
modern-pairs=5 equal=5 failures=3 modern-deprecations=0 source-unchanged=1
Старый смыслСовременный вызов в примере
Заливка до blackfloodFillPaintImage(green,0,black,50,90,true,CHANNEL_DEFAULT)
Alpha до blackfloodFillPaintImage(transparent,0,black,50,90,true,CHANNEL_ALPHA)
Связный redfloodFillPaintImage(green,0,red,50,90,false,CHANNEL_DEFAULT)
Глобальная замена redopaquePaintImage(red,green,0,false,CHANNEL_DEFAULT)
Глобальная alpha redtransparentPaintImage(red,0,0,false)

Три намеренные ошибки: seed (500,90) при ширине 400, пустой Imagick, null вместо обязательного барьера colorFloodfillImage. Получены ImagickException: Unable to color floodfill image; Can not process empty Imagick object; Invalid color parameter provided. Тексты относятся к этой сборке. lpCall записывает class/message и восстанавливает обработчик даже после ошибки. В приложении размеры, наличие изображения и допустимый цвет проверяют заранее; при исключении не показывают пользователю несуществующий удачный результат.

Полные контракты, устаревание, воспроизводимость и следующий шаг

Назначение, аргументы и результат

Imagick::colorFloodfillImage(mixed $fill, float $fuzz, mixed $bordercolor, int $x, int $y): bool

Левое красное поле, синяя вставка и близкий красный квадрат стали зелёными: барьером был чёрный контур. Правая область, сам контур и внешний белый фон сохранены.

ПараметрКак он используется
$fillОбязательный ImagickPixel или строка цвета заливки, здесь rgb(32,176,96). Непрозрачный fill полностью перекрывает выбранную область; legacy Core использует OVER, поэтому полупрозрачная заливка смешивается с прежними пикселями.
$fuzzОбязательный float: допустимое различие цвета в Quantum-единицах. Здесь 0: чёрный барьер совпадает точно. Официальный пример с интенсивностями 100 и 102 и fuzz 10 относится к числовому допуску, не к процентам.
$bordercolorОбязательный цвет барьера, здесь black. В actual IM6 ненулевой border включает FillToBorderMethod: проходить можно по соседям, не совпадающим с ним. Null в PHP-wrapper этого метода не разрешён.
$x, $yОбязательные int: начальные столбец и строка, нумерация с 0. Здесь (50,90) внутри левого контура. Нужны 0 ≤ x < ширина и 0 ≤ y < высота.

Возвращается bool true при успешном выполнении, а сам текущий объект изображения изменяется. Это не новый Imagick и не количество затронутых пикселей. True не доказывает изменение: в проектном примере paintFloodfillImage с несовпадающим target вернул true и оставил источник прежним. Работаем на clone, чтобы сохранить оригинал. Ошибка native-операции превращается в ImagickException; пустой объект, неверный цвет и координаты проверяются отдельно. Тексты трёх реально полученных исключений сохранены в metrics.json, не выдаются за универсальные сообщения всех версий.

Официальная доступность: PECL imagick 2, PECL imagick 3. Все пять методов помечены deprecated с PECL Imagick 3.4.4; в проверенных guarded bindings они относятся к ветке ImageMagick 6 и исключены для IM7. Не используйте их как начало нового проекта. Здесь они нужны, чтобы понять и перенести существующий редактор; современные варианты выполняются отдельно в той же IM6-среде, а автоматическая совместимость любого старого сценария не обещается.

Официальный changelog PECL Imagick 2.1.0 сохраняется: строки цвета разрешены вместо прежнего обязательного ImagickPixel. У color это первый и третий параметры, у matte третий, у opaque первый и второй, у transparent первый. Тип mixed из старого synopsis не означает, что подходят любые PHP-значения: actual wrapper преобразует только допустимое представление цвета.

Полный официальный XML: описание, параметры, возврат, ограничения и changelog
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.colorfloodfillimage">
 <refnamediv>
  <refname>Imagick::colorFloodfillImage</refname>
  <refpurpose>Changes the color value of any pixel that matches target</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::colorFloodfillImage</methodname>
   <methodparam><type>mixed</type><parameter>fill</parameter></methodparam>
   <methodparam><type>float</type><parameter>fuzz</parameter></methodparam>
   <methodparam><type>mixed</type><parameter>bordercolor</parameter></methodparam>
   <methodparam><type>int</type><parameter>x</parameter></methodparam>
   <methodparam><type>int</type><parameter>y</parameter></methodparam>
  </methodsynopsis>
  <para>
   Changes the color value of any pixel that matches target and is an
   immediate neighbor.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>fill</parameter></term>
     <listitem>
      <para>
       ImagickPixel object containing the fill color
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>fuzz</parameter></term>
     <listitem>
      <para>
       The amount of fuzz. For example, set fuzz to 10 and the color red at
       intensities of 100 and 102 respectively are now interpreted as the
       same color for the purposes of the floodfill.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>bordercolor</parameter></term>
     <listitem>
      <para>
       ImagickPixel object containing the border color
      </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>
   </variablelist>
  </para>

 </refsect1>
 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>

 <refsect1 role="errors">
  &reftitle.errors;
  <para>
   &imagick.imagick.throws;
  </para>
 </refsect1>

 <refsect1 role="changelog">
  &reftitle.changelog;
  <para>
   <informaltable>
    <tgroup cols="2">
     <thead>
      <row>
       <entry>&Version;</entry>
       <entry>&Description;</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>PECL imagick 2.1.0</entry>
       <entry>
        Now allows a string representing the color as first and third
        parameter. Previous versions allow only an ImagickPixel object.
       </entry>
      </row>
     </tbody>
    </tgroup>
   </informaltable>
  </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
-->

Назначение, аргументы и результат

Imagick::matteFloodfillImage(float $alpha, float $fuzz, mixed $bordercolor, int $x, int $y): bool

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

ПараметрКак он используется
$alphaОбязательный float: 0 полностью прозрачно, 1 полностью непрозрачно. Внутри IM6 это переводится в opacity Q − Q × alpha. Значение присваивается выбранной области, не умножает прежнюю alpha; RGB остаются прежними.
$fuzzОбязательный float в Quantum-единицах, допуск сравнения с барьером; здесь 0.
$bordercolorОбязательная строка или ImagickPixel с цветом барьера; здесь black. Названный в официальном тексте FillToBorderMethod — внутренний режим, не дополнительный аргумент PHP.
$x, $yОбязательные int координаты начала связной области; здесь (50,90). Проверяйте границы кадра до вызова.

Возвращается bool true при успешном выполнении, а сам текущий объект изображения изменяется. Это не новый Imagick и не количество затронутых пикселей. True не доказывает изменение: в проектном примере paintFloodfillImage с несовпадающим target вернул true и оставил источник прежним. Работаем на clone, чтобы сохранить оригинал. Ошибка native-операции превращается в ImagickException; пустой объект, неверный цвет и координаты проверяются отдельно. Тексты трёх реально полученных исключений сохранены в metrics.json, не выдаются за универсальные сообщения всех версий.

Официальная доступность: PECL imagick 2, PECL imagick 3. Все пять методов помечены deprecated с PECL Imagick 3.4.4; в проверенных guarded bindings они относятся к ветке ImageMagick 6 и исключены для IM7. Не используйте их как начало нового проекта. Здесь они нужны, чтобы понять и перенести существующий редактор; современные варианты выполняются отдельно в той же IM6-среде, а автоматическая совместимость любого старого сценария не обещается.

Официальный changelog PECL Imagick 2.1.0 сохраняется: строки цвета разрешены вместо прежнего обязательного ImagickPixel. У color это первый и третий параметры, у matte третий, у opaque первый и второй, у transparent первый. Тип mixed из старого synopsis не означает, что подходят любые PHP-значения: actual wrapper преобразует только допустимое представление цвета.

Полный официальный XML: описание, параметры, возврат, ограничения и changelog
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.mattefloodfillimage">
 <refnamediv>
  <refname>Imagick::matteFloodfillImage</refname>
  <refpurpose>Changes the transparency value of a color</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::matteFloodfillImage</methodname>
   <methodparam><type>float</type><parameter>alpha</parameter></methodparam>
   <methodparam><type>float</type><parameter>fuzz</parameter></methodparam>
   <methodparam><type>mixed</type><parameter>bordercolor</parameter></methodparam>
   <methodparam><type>int</type><parameter>x</parameter></methodparam>
   <methodparam><type>int</type><parameter>y</parameter></methodparam>
  </methodsynopsis>
  <para>
   Changes the transparency value of any pixel that matches
   target and is an immediate neighbor.  If the method
   <constant>FillToBorderMethod</constant> is specified, the transparency value
   is changed for any neighbor pixel that does not match
   the bordercolor member of image.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>alpha</parameter></term>
     <listitem>
      <para>
       The level of transparency: 1.0 is fully opaque and 0.0 is fully
       transparent.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>fuzz</parameter></term>
     <listitem>
      <para>
       The fuzz member of image defines how much tolerance is acceptable to
       consider two colors as the same.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>bordercolor</parameter></term>
     <listitem>
      <para>
      An <classname>ImagickPixel</classname> object or string representing the border color.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>x</parameter></term>
     <listitem>
      <para>
      The starting x coordinate of the operation.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>y</parameter></term>
     <listitem>
      <para>
      The starting y coordinate of the operation.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>

 <refsect1 role="errors">
  &reftitle.errors;
  <para>
   &imagick.imagick.throws;
  </para>
 </refsect1>

 <refsect1 role="changelog">
  &reftitle.changelog;
  <para>
   <informaltable>
    <tgroup cols="2">
     <thead>
      <row>
       <entry>&Version;</entry>
       <entry>&Description;</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>PECL imagick 2.1.0</entry>
       <entry>
        Now allows a string representing the color as the third parameter.
        Previous versions allow only an <classname>ImagickPixel</classname> object.
       </entry>
      </row>
     </tbody>
    </tgroup>
   </informaltable>
  </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
-->

Назначение, аргументы и результат

Imagick::paintFloodfillImage(mixed $fill, float $fuzz, mixed $bordercolor, int $x, int $y, int $channel = Imagick::CHANNEL_DEFAULT): bool

Зелёным стал связный точный красный участок слева. Левая синяя вставка и близкий красный квадрат сохранились, как и правое красное поле. Третий аргумент этого метода — фактический target, несмотря на историческое имя bordercolor.

ПараметрКак он используется
$fillОбязательный ImagickPixel или строка нового цвета; здесь непрозрачный зелёный.
$fuzzОбязательный float в Quantum-единицах, допуск сравнения с target. При 0 близкий красный квадрат не совпадает с точным красным.
$bordercolorИсторическое имя третьего параметра. В проверенном IM6 deprecated Wand делегирует современному FloodfillPaintImage с invert=false: этот цвет является совпадающим target, а не барьером. Явный red выбирает только связную красную область; black при красном seed оставляет изображение прежним и всё равно возвращает true. Actual wrapper 3.7 допускает null, чтобы Wand взял target из seed; XML/stub такой nullable-тип не объявляют, поэтому это отдельно проверенная особенность этой реализации.
$x, $yОбязательные int координаты seed, здесь (50,90); сами по себе не отменяют явно переданный target.
$channelНеобязательный int, по умолчанию Imagick::CHANNEL_DEFAULT. Именованные CHANNEL_* ограничивают запись каналов, а не геометрическую область. Несколько каналов объединяют побитовым |. Полупрозрачный fill в Core может также активировать/записать alpha; не обещаем универсальную изоляцию alpha одним RGB-mask.

Возвращается bool true при успешном выполнении, а сам текущий объект изображения изменяется. Это не новый Imagick и не количество затронутых пикселей. True не доказывает изменение: в проектном примере paintFloodfillImage с несовпадающим target вернул true и оставил источник прежним. Работаем на clone, чтобы сохранить оригинал. Ошибка native-операции превращается в ImagickException; пустой объект, неверный цвет и координаты проверяются отдельно. Тексты трёх реально полученных исключений сохранены в metrics.json, не выдаются за универсальные сообщения всех версий.

Официальная доступность: PECL imagick 2 >= 2.1.0, PECL imagick 3. Все пять методов помечены deprecated с PECL Imagick 3.4.4; в проверенных guarded bindings они относятся к ветке ImageMagick 6 и исключены для IM7. Не используйте их как начало нового проекта. Здесь они нужны, чтобы понять и перенести существующий редактор; современные варианты выполняются отдельно в той же IM6-среде, а автоматическая совместимость любого старого сценария не обещается.

В официальном описании дополнительно указано устаревание с ImageMagick 6.3.8 и ссылка на floodFillPaintImage. Это отдельная история native API, не дата PECL-предупреждения 3.4.4. Не переносите одно только имя метода: у нового вызова нужно явно различать target и invert, а у старого color/matte третий цвет имел роль барьера. Invert — необязательный bool со значением false по умолчанию; в нашем переносе он передаётся явно, чтобы сохранить нужное правило выбора.

Полный официальный XML: описание, параметры, возврат, ограничения и changelog
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.paintfloodfillimage">
 <refnamediv>
  <refname>Imagick::paintFloodfillImage</refname>
  <refpurpose>Changes the color value of any pixel that matches target</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::paintFloodfillImage</methodname>
   <methodparam><type>mixed</type><parameter>fill</parameter></methodparam>
   <methodparam><type>float</type><parameter>fuzz</parameter></methodparam>
   <methodparam><type>mixed</type><parameter>bordercolor</parameter></methodparam>
   <methodparam><type>int</type><parameter>x</parameter></methodparam>
   <methodparam><type>int</type><parameter>y</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. As of ImageMagick 6.3.8 this method has been deprecated
   and <function>Imagick::floodfillPaintImage</function> should be used instead.
  </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>
       The amount of fuzz. For example, set fuzz to 10 and the color red at
       intensities of 100 and 102 respectively are now interpreted as the
       same color for the purposes of the floodfill.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>bordercolor</parameter></term>
     <listitem>
      <para>
       ImagickPixel object or a string containing the border color
      </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>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
-->

Назначение, аргументы и результат

Imagick::paintOpaqueImage(mixed $target, mixed $fill, float $fuzz, int $channel = Imagick::CHANNEL_DEFAULT): bool

Точный красный стал зелёным в обоих несвязанных контейнерах. Синие вставки и близкий красный квадрат сохранились при fuzz 0. Координаты для глобальной замены не нужны.

ПараметрКак он используется
$targetОбязательный ImagickPixel или строка исходного цвета; здесь rgb(208,32,48). Поиск глобальный: координат нет, обе красные области подходят.
$fillОбязательный ImagickPixel или строка цвета замены; здесь rgb(32,176,96).
$fuzzОбязательный float в Quantum-единицах. 0 выбирает точное совпадение, а 0.02 × Q в нашем примере дополнительно выбирает близкий красный квадрат.
$channelНеобязательный int, по умолчанию CHANNEL_DEFAULT. CHANNEL_BLUE присваивает выбранным пикселям только синий компонент fill; R/G/A сохраняются в показанном непрозрачном RGB-случае. Для нескольких каналов используют |.

Возвращается bool true при успешном выполнении, а сам текущий объект изображения изменяется. Это не новый Imagick и не количество затронутых пикселей. True не доказывает изменение: в проектном примере paintFloodfillImage с несовпадающим target вернул true и оставил источник прежним. Работаем на clone, чтобы сохранить оригинал. Ошибка native-операции превращается в ImagickException; пустой объект, неверный цвет и координаты проверяются отдельно. Тексты трёх реально полученных исключений сохранены в metrics.json, не выдаются за универсальные сообщения всех версий.

Официальная доступность: PECL imagick 2, PECL imagick 3. Все пять методов помечены deprecated с PECL Imagick 3.4.4; в проверенных guarded bindings они относятся к ветке ImageMagick 6 и исключены для IM7. Не используйте их как начало нового проекта. Здесь они нужны, чтобы понять и перенести существующий редактор; современные варианты выполняются отдельно в той же IM6-среде, а автоматическая совместимость любого старого сценария не обещается.

Официальный changelog PECL Imagick 2.1.0 сохраняется: строки цвета разрешены вместо прежнего обязательного ImagickPixel. У color это первый и третий параметры, у matte третий, у opaque первый и второй, у transparent первый. Тип mixed из старого synopsis не означает, что подходят любые PHP-значения: actual wrapper преобразует только допустимое представление цвета.

Полный официальный XML: описание, параметры, возврат, ограничения и changelog
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.paintopaqueimage">
 <refnamediv>
  <refname>Imagick::paintOpaqueImage</refname>
  <refpurpose>Change any pixel that matches color</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::paintOpaqueImage</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 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.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>target</parameter></term>
     <listitem>
      <para>
       Change this target color to the fill color within the image. An
       ImagickPixel object or a string representing the target color.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>fill</parameter></term>
     <listitem>
      <para>
       An ImagickPixel object or a string representing the fill color.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>fuzz</parameter></term>
     <listitem>
      <para>
       The fuzz member of image defines how much tolerance is acceptable to
       consider two colors as the same.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>channel</parameter></term>
     <listitem>
      <para>
       Provide any channel constant that is valid for your channel mode. To
       apply to more than one channel, combine channeltype constants using
       bitwise operators. Refer to this
       list of <link linkend="imagick.constants.channel">channel constants</link>.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>

 <refsect1 role="errors">
  &reftitle.errors;
  <para>
   &imagick.imagick.throws;
  </para>
 </refsect1>

 <refsect1 role="changelog">
  &reftitle.changelog;
  <para>
   <informaltable>
    <tgroup cols="2">
     <thead>
      <row>
       <entry>&Version;</entry>
       <entry>&Description;</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>PECL imagick 2.1.0</entry>
       <entry>
        Now allows a string representing the color as first and second parameter.
        Previous versions allow only an ImagickPixel object.
       </entry>
      </row>
     </tbody>
    </tgroup>
   </informaltable>
  </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
-->

Назначение, аргументы и результат

Imagick::paintTransparentImage(mixed $target, float $alpha, float $fuzz): bool

Оба точных красных поля получили alpha 0. Синие вставки, близкий красный квадрат, чёрные контуры и белый фон остались видимыми. Это глобальный выбор цвета, а не распознавание фона или объекта.

ПараметрКак он используется
$targetОбязательный ImagickPixel или строка выбранного цвета; все совпавшие пиксели во всём изображении получат alpha. Это не выбор связного внешнего фона.
$alphaОбязательный float: 0 прозрачно, 1 непрозрачно. Присваивается alpha, RGB сохраняются; параметра fill у метода нет. Общая фраза официального описания про fill не соответствует его собственной сигнатуре, поэтому здесь показана фактическая операция прозрачности.
$fuzzОбязательный float в Quantum-единицах, допуск совпадения с target. Большой допуск может убрать детали объекта похожего цвета. Параметров invert и channel у этого legacy-метода нет.

Возвращается bool true при успешном выполнении, а сам текущий объект изображения изменяется. Это не новый Imagick и не количество затронутых пикселей. True не доказывает изменение: в проектном примере paintFloodfillImage с несовпадающим target вернул true и оставил источник прежним. Работаем на clone, чтобы сохранить оригинал. Ошибка native-операции превращается в ImagickException; пустой объект, неверный цвет и координаты проверяются отдельно. Тексты трёх реально полученных исключений сохранены в metrics.json, не выдаются за универсальные сообщения всех версий.

Официальная доступность: PECL imagick 2, PECL imagick 3. Все пять методов помечены deprecated с PECL Imagick 3.4.4; в проверенных guarded bindings они относятся к ветке ImageMagick 6 и исключены для IM7. Не используйте их как начало нового проекта. Здесь они нужны, чтобы понять и перенести существующий редактор; современные варианты выполняются отдельно в той же IM6-среде, а автоматическая совместимость любого старого сценария не обещается.

Официальный changelog PECL Imagick 2.1.0 сохраняется: строки цвета разрешены вместо прежнего обязательного ImagickPixel. У color это первый и третий параметры, у matte третий, у opaque первый и второй, у transparent первый. Тип mixed из старого synopsis не означает, что подходят любые PHP-значения: actual wrapper преобразует только допустимое представление цвета.

Полный официальный XML: описание, параметры, возврат, ограничения и changelog
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.painttransparentimage">
 <refnamediv>
  <refname>Imagick::paintTransparentImage</refname>
  <refpurpose>Changes any pixel that matches color with the color defined by fill</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::paintTransparentImage</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>
  </methodsynopsis>
  <para>
   Changes any pixel that matches color with the color defined by fill.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>target</parameter></term>
     <listitem>
      <para>
      Change this target color to specified opacity value within the image.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>alpha</parameter></term>
     <listitem>
      <para>
       The level of transparency: 1.0 is fully opaque and 0.0 is fully 
       transparent.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>fuzz</parameter></term>
     <listitem>
      <para>
       The fuzz member of image defines how much tolerance is acceptable to
       consider two colors as the same.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>

 </refsect1>
 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>

 <refsect1 role="errors">
  &reftitle.errors;
  <para>
   &imagick.imagick.throws;
  </para>
 </refsect1>

 <refsect1 role="changelog">
  &reftitle.changelog;
  <para>
   <informaltable>
    <tgroup cols="2">
     <thead>
      <row>
       <entry>&Version;</entry>
       <entry>&Description;</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>PECL imagick 2.1.0</entry>
       <entry>
        Now allows a string representing the color as the first parameter.
        Previous versions allow only an ImagickPixel object.
       </entry>
      </row>
     </tbody>
    </tgroup>
   </informaltable>
  </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
-->

Окружение и ограничения задачи

Проверенная legacy-среда — официальные Ubuntu-пакеты php8.3-cli и php8.3-imagick, фактически связанные с IM6.9.12-98. Наличие названия Imagick без версии связанной native-библиотеки недостаточно. Для такой системы установка выглядит следующим образом; это не предложение заменить текущую Windows-среду.

sudo apt install php8.3-cli php8.3-imagick
php example.php

Современные вызовы в этой главе исполнены в том же IM6-процессе для честного сравнения. Их отдельные главы объясняют использование в текущем IM7. Из предупреждений нельзя делать исключения глобальным отключением E_DEPRECATED: здесь сохраняются оба реально возникших сообщения и прежний handler возвращается через finally. Ошибки сторонних операций не подавляются. Для HTTP отдавайте PNG отдельным ответом с Content-Type: image/png, без текстового журнала; для учебного просмотра открывайте созданный файл.

Упражнение: нужно изменить только левое красное поле, сохранив синюю вставку и правый контейнер. Решение — связный target-вариант с точным red, seed (50,90), fuzz 0; барьерная color-заливка была бы неверным выбором, поскольку перекрасит и синюю вставку. Если вместо этого надо убрать все точные красные поля, глобальная transparent-операция подходит. Ни один вариант не решает автоматически задачу отделения белого товара от белого фона фотографии.

Полный вспомогательный PHP из каждого архива
<?php
declare(strict_types=1);
function lpRestore():void {
    $raw=base64_decode((string)file_get_contents(__DIR__.'/source.png.b64'),true);
    if($raw===false||hash('sha256',$raw)!=='388f5a2a6f60b1d445cd8b356791ce98bf952ec7cd33507a77306c3899407795'||file_put_contents(__DIR__.'/source.png',$raw)===false){throw new RuntimeException('Own source PNG missing or changed');}
}
function lpSource():Imagick {return new Imagick(__DIR__.'/source.png');}
function lpHash(Imagick $image):string {
    return hash('sha256',json_encode($image->exportImagePixels(0,0,400,320,'RGBA',Imagick::PIXEL_SHORT),JSON_THROW_ON_ERROR));
}
function lpSamples(Imagick $image):array {
    $out=[];
    foreach(['left'=>[50,90],'right'=>[250,90],'left_blue'=>[90,140],'right_blue'=>[290,140],'near_red'=>[140,195],'border'=>[20,90],'outside'=>[5,5]] as $key=>$xy){
        $c=$image->getImagePixelColor(...$xy)->getColor(1);
        $out[$key]=array_map(fn($v)=>(int)round($v*255),[$c['r'],$c['g'],$c['b'],$c['a']]);
    }
    return $out;
}
function lpCall(string $label,callable $operation):array {
    $warnings=[];$out=['label'=>$label];
    set_error_handler(function(int $severity,string $message)use(&$warnings):bool {
        if($severity!==E_DEPRECATED){return false;}
        $warnings[]=['severity'=>$severity,'message'=>$message];return true;
    });
    try{$out['returned']=$operation();}
    catch(Throwable $error){$out['error']=['class'=>get_class($error),'message'=>$error->getMessage()];}
    finally{restore_error_handler();}
    $out['warnings']=$warnings;$out['deprecations']=count($warnings);return $out;
}
function lpRaw(Imagick $image,string $filename):void {
    $copy=clone $image;$copy->stripImage();$copy->setImageFormat('png');$copy->setImageDepth(8);
    $copy->setOption('png:bit-depth','8');$copy->setOption('png:color-type','6');$copy->setOption('png:exclude-chunk','all');
    if(!$copy->writeImage(__DIR__.'/'.$filename)){throw new RuntimeException('PNG write failed');}
}
function lpChecker(Imagick $image):Imagick {
    static $background=null;
    if($background===null){
        $background=new Imagick();$background->newImage(400,320,'white','png');$draw=new ImagickDraw();
        $draw->setStrokeColor('none');$draw->setFillColor('#d8e1e2');
        for($y=0;$y<320;$y+=20){for($x=0;$x<400;$x+=20){if((intdiv($x,20)+intdiv($y,20))%2===0){$draw->rectangle($x,$y,$x+19,$y+19);}}}
        $background->drawImage($draw);
    }
    $view=clone $background;$view->compositeImage($image,Imagick::COMPOSITE_OVER,0,0);return $view;
}
function lpView(Imagick $image,string $filename):void {lpRaw(lpChecker($image),$filename);}
function lpCompare(array $images,string $filename):array {
    $board=new Imagick();$board->newImage(400*count($images),320,'white','png');$rects=[];
    foreach(array_values($images) as $i=>$image){$view=lpChecker($image);$board->compositeImage($view,Imagick::COMPOSITE_OVER,400*$i,0);$rects[]=['x'=>400*$i,'y'=>0,'width'=>400,'height'=>320];}
    lpRaw($board,$filename);return $rects;
}
function lpSummary(Imagick $source,Imagick $image,array $call):array {
    $before=$source->exportImagePixels(0,0,400,320,'RGBA',Imagick::PIXEL_CHAR);
    $after=$image->exportImagePixels(0,0,400,320,'RGBA',Imagick::PIXEL_CHAR);
    $changed=0;$rgbChanged=0;$alphaChanged=0;$transparent=0;
    for($i=0,$n=count($after);$i<$n;$i+=4){
        $rgb=$before[$i]!==$after[$i]||$before[$i+1]!==$after[$i+1]||$before[$i+2]!==$after[$i+2];
        $alpha=$before[$i+3]!==$after[$i+3];
        if($rgb){$rgbChanged++;}if($alpha){$alphaChanged++;}if($rgb||$alpha){$changed++;}if($after[$i+3]===0){$transparent++;}
    }
    return $call+['rgba16_sha256'=>lpHash($image),'samples'=>lpSamples($image),'changed_pixels'=>$changed,'rgb_changed_pixels'=>$rgbChanged,'alpha_changed_pixels'=>$alphaChanged,'transparent_pixels'=>$transparent];
}
function lpCaseChecks(string $key,array $row,array $source):array {
    $s=$row['samples'];$green=[32,176,96,255];$red=$source['left'];$blue=$source['left_blue'];
    $common=['returned_true'=>($row['returned']??null)===true,'scoped_two_deprecations'=>$row['deprecations']===2,
        'border_preserved'=>$s['border']===$source['border'],'outside_preserved'=>$s['outside']===$source['outside'],'actual_pixels_changed'=>$row['changed_pixels']>0];
    if($key==='color'){$checks=['left_filled'=>$s['left']===$green&&$s['left_blue']===$green&&$s['near_red']===$green,'right_protected'=>$s['right']===$red&&$s['right_blue']===$blue];}
    elseif($key==='matte'){$checks=['left_region_transparent'=>$s['left'][3]===0&&$s['left_blue'][3]===0&&$s['near_red'][3]===0,'right_opaque'=>$s['right'][3]===255&&$s['right_blue'][3]===255,'RGB_preserved'=>$row['rgb_changed_pixels']===0];}
    elseif($key==='paint'){$checks=['left_red_only'=>$s['left']===$green&&$s['left_blue']===$blue&&$s['near_red']===$source['near_red'],'right_protected'=>$s['right']===$red];}
    elseif($key==='opaque'){$checks=['both_red_replaced'=>$s['left']===$green&&$s['right']===$green,'other_colors_preserved'=>$s['left_blue']===$blue&&$s['near_red']===$source['near_red']];}
    else{$checks=['both_red_transparent'=>$s['left'][3]===0&&$s['right'][3]===0,'blue_and_near_red_opaque'=>$s['left_blue'][3]===255&&$s['near_red'][3]===255,'RGB_preserved'=>$row['rgb_changed_pixels']===0];}
    return $common+$checks;
}
function lpDiagnostic(string $id,array $data):void {
    $doc=['schema'=>'aen-legacy-paint-fill-program-diagnostics-v1','example_id'=>$id,
        'runtime'=>['php'=>PHP_VERSION,'imagick'=>phpversion('imagick'),'imagemagick'=>Imagick::getVersion()]]+$data;
    if(file_put_contents(__DIR__.'/metrics.json',json_encode($doc,JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR)."\n")===false){throw new RuntimeException('Cannot write measurements');}
}
function lpMinimalProof(string $id,string $key,string $method,Imagick $source,Imagick $image,array $call,string $before):void {
    lpRaw($image,$key.'-raw8.png');lpView($image,'legacy-paint-fill-'.$key.'.png');
    if($key==='color'){lpView($source,'source-preview8.png');}
    $row=lpSummary($source,$image,$call);$checks=lpCaseChecks($key,$row,lpSamples($source));$checks['source_preserved']=lpHash($source)===$before;
    lpDiagnostic($id,['executed_api'=>$method,'case'=>$key,'result'=>$row,'source_samples'=>lpSamples($source),'source_unchanged'=>lpHash($source)===$before,'checks'=>$checks]);
}

Дальше: современные заливки и замена цвета, прозрачность и фон, композиция и глубина цвета. Все пять официальных страниц сохранены целиком вместе с параметрами, возвратом и историей; глава добавляет объяснение реальной реализации и постепенные самостоятельные примеры.

Функции и методы этой темы

Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.

Imagick::colorFloodfillImageПерекрасить всю область внутри левого чёрного контура

PECL imagick 2, PECL imagick 3 · imagick

Imagick::colorFloodfillImage(mixed $fill, float $fuzz, mixed $bordercolor, int $x, int $y): bool

Назначение, аргументы и результат

Imagick::colorFloodfillImage(mixed $fill, float $fuzz, mixed $bordercolor, int $x, int $y): bool

Левое красное поле, синяя вставка и близкий красный квадрат стали зелёными: барьером был чёрный контур. Правая область, сам контур и внешний белый фон сохранены.

ПараметрКак он используется
$fillОбязательный ImagickPixel или строка цвета заливки, здесь rgb(32,176,96). Непрозрачный fill полностью перекрывает выбранную область; legacy Core использует OVER, поэтому полупрозрачная заливка смешивается с прежними пикселями.
$fuzzОбязательный float: допустимое различие цвета в Quantum-единицах. Здесь 0: чёрный барьер совпадает точно. Официальный пример с интенсивностями 100 и 102 и fuzz 10 относится к числовому допуску, не к процентам.
$bordercolorОбязательный цвет барьера, здесь black. В actual IM6 ненулевой border включает FillToBorderMethod: проходить можно по соседям, не совпадающим с ним. Null в PHP-wrapper этого метода не разрешён.
$x, $yОбязательные int: начальные столбец и строка, нумерация с 0. Здесь (50,90) внутри левого контура. Нужны 0 ≤ x < ширина и 0 ≤ y < высота.

Возвращается bool true при успешном выполнении, а сам текущий объект изображения изменяется. Это не новый Imagick и не количество затронутых пикселей. True не доказывает изменение: в проектном примере paintFloodfillImage с несовпадающим target вернул true и оставил источник прежним. Работаем на clone, чтобы сохранить оригинал. Ошибка native-операции превращается в ImagickException; пустой объект, неверный цвет и координаты проверяются отдельно. Тексты трёх реально полученных исключений сохранены в metrics.json, не выдаются за универсальные сообщения всех версий.

Официальная доступность: PECL imagick 2, PECL imagick 3. Все пять методов помечены deprecated с PECL Imagick 3.4.4; в проверенных guarded bindings они относятся к ветке ImageMagick 6 и исключены для IM7. Не используйте их как начало нового проекта. Здесь они нужны, чтобы понять и перенести существующий редактор; современные варианты выполняются отдельно в той же IM6-среде, а автоматическая совместимость любого старого сценария не обещается.

Официальный changelog PECL Imagick 2.1.0 сохраняется: строки цвета разрешены вместо прежнего обязательного ImagickPixel. У color это первый и третий параметры, у matte третий, у opaque первый и второй, у transparent первый. Тип mixed из старого synopsis не означает, что подходят любые PHP-значения: actual wrapper преобразует только допустимое представление цвета.

Полный официальный XML: описание, параметры, возврат, ограничения и changelog
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.colorfloodfillimage">
 <refnamediv>
  <refname>Imagick::colorFloodfillImage</refname>
  <refpurpose>Changes the color value of any pixel that matches target</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::colorFloodfillImage</methodname>
   <methodparam><type>mixed</type><parameter>fill</parameter></methodparam>
   <methodparam><type>float</type><parameter>fuzz</parameter></methodparam>
   <methodparam><type>mixed</type><parameter>bordercolor</parameter></methodparam>
   <methodparam><type>int</type><parameter>x</parameter></methodparam>
   <methodparam><type>int</type><parameter>y</parameter></methodparam>
  </methodsynopsis>
  <para>
   Changes the color value of any pixel that matches target and is an
   immediate neighbor.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>fill</parameter></term>
     <listitem>
      <para>
       ImagickPixel object containing the fill color
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>fuzz</parameter></term>
     <listitem>
      <para>
       The amount of fuzz. For example, set fuzz to 10 and the color red at
       intensities of 100 and 102 respectively are now interpreted as the
       same color for the purposes of the floodfill.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>bordercolor</parameter></term>
     <listitem>
      <para>
       ImagickPixel object containing the border color
      </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>
   </variablelist>
  </para>

 </refsect1>
 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>

 <refsect1 role="errors">
  &reftitle.errors;
  <para>
   &imagick.imagick.throws;
  </para>
 </refsect1>

 <refsect1 role="changelog">
  &reftitle.changelog;
  <para>
   <informaltable>
    <tgroup cols="2">
     <thead>
      <row>
       <entry>&Version;</entry>
       <entry>&Description;</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>PECL imagick 2.1.0</entry>
       <entry>
        Now allows a string representing the color as first and third
        parameter. Previous versions allow only an ImagickPixel object.
       </entry>
      </row>
     </tbody>
    </tgroup>
   </informaltable>
  </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
-->

Перекрасить всю область внутри левого чёрного контура

Левое красное поле, синяя вставка и близкий красный квадрат стали зелёными: барьером был чёрный контур. Правая область, сам контур и внешний белый фон сохранены.

Перекрасить всю область внутри левого чёрного контураПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$image=clone $source;
$call=lpCall('color',fn()=>$image->colorFloodfillImage('rgb(32,176,96)',0,'black',50,90));
lpMinimalProof('legacy-color-fill-minimal','color','colorFloodfillImage',$source,$image,$call,$before);
echo "legacy-paint-fill-color.png\ncolor-raw8.png\nsource-preview8.png\nmetrics.json\nreturned=1 deprecations=2 source-unchanged=1\n";

Левое красное поле, синяя вставка и близкий красный квадрат стали зелёными: барьером был чёрный контур. Правая область, сам контур и внешний белый фон сохранены. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-color.png
color-raw8.png
source-preview8.png
metrics.json
returned=1 deprecations=2 source-unchanged=1

Выбрать область, допуск и каналы в одном контролируемом редакторе

Пять независимых результатов сопоставлены на общей полосе. Отдельно допуск 0.02 × Q захватил близкий красный квадрат; CHANNEL_BLUE изменил только синий канал выбранного красного. Несовпадающий target дал true без изменения, а null в paintFloodfillImage выбрал цвет seed и совпал с явным красным.

Выбрать область, допуск и каналы в одном контролируемом редактореПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$quantum=Imagick::getQuantumRange()['quantumRangeLong'];
$operations=[
    'color'=>fn(Imagick $i)=>$i->colorFloodfillImage('rgb(32,176,96)',0,'black',50,90),
    'matte'=>fn(Imagick $i)=>$i->matteFloodfillImage(0,0,'black',50,90),
    'paint'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,'rgb(208,32,48)',50,90),
    'opaque'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0),
    'transparent'=>fn(Imagick $i)=>$i->paintTransparentImage('rgb(208,32,48)',0,0),
    'fuzz'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0.02*$quantum),
    'blue-channel'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','white',0,Imagick::CHANNEL_BLUE),
    'mismatch'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,'black',50,90),
    'null'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,null,50,90),
];
$rows=[];$images=[];
foreach($operations as $key=>$operation){
    $image=clone $source;$call=lpCall($key,fn()=>$operation($image));
    $rows[$key]=lpSummary($source,$image,$call);$images[$key]=$image;
    if(in_array($key,['color','matte','paint','opaque','transparent'],true)){lpRaw($image,'workflow-'.$key.'-raw8.png');}
    else{lpView($image,'workflow-'.$key.'8.png');}
}
$panelKeys=['color','matte','paint','opaque','transparent'];
$rects=lpCompare(array_map(fn($key)=>$images[$key],$panelKeys),'legacy-paint-fill-workflow.png');
$checks=[];foreach($panelKeys as $key){foreach(lpCaseChecks($key,$rows[$key],lpSamples($source)) as $name=>$value){$checks[$key.'_'.$name]=$value;}}
$near=$rows['fuzz']['samples']['near_red'];$original=lpSamples($source);$channel=$rows['blue-channel']['samples']['left'];
$checks+=['fuzz_selects_near_red'=>$near===[32,176,96,255],
    'blue_channel_preserves_RG'=>$channel===[$original['left'][0],$original['left'][1],255,255],
    'mismatching_target_true_but_no_change'=>$rows['mismatch']['returned']===true&&$rows['mismatch']['changed_pixels']===0,
    'null_seed_matches_explicit_target'=>$rows['null']['rgba16_sha256']===$rows['paint']['rgba16_sha256'],
    'nine_scoped_legacy_calls'=>count(array_filter($rows,fn($row)=>($row['returned']??null)===true&&$row['deprecations']===2))===9,
    'source_preserved'=>lpHash($source)===$before];
lpDiagnostic('legacy-paint-fill-workflow',['executed_apis'=>['colorFloodfillImage','matteFloodfillImage','paintFloodfillImage','paintOpaqueImage','paintTransparentImage'],
    'quantum'=>$quantum,'fuzz'=>0.02*$quantum,'channel'=>Imagick::CHANNEL_BLUE,'rows'=>$rows,'panel_keys'=>$panelKeys,'panel_geometry'=>$rects,
    'source_samples'=>$original,'source_unchanged'=>lpHash($source)===$before,'checks'=>$checks]);
echo "legacy-paint-fill-workflow.png\nworkflow-color-raw8.png\nworkflow-matte-raw8.png\nworkflow-paint-raw8.png\nworkflow-opaque-raw8.png\nworkflow-transparent-raw8.png\nworkflow-fuzz8.png\nworkflow-blue-channel8.png\nworkflow-mismatch8.png\nworkflow-null8.png\nmetrics.json\ncases=9 deprecations=18 mismatch-unchanged=1 null-equal=1 source-unchanged=1\n";

Пять независимых результатов сопоставлены на общей полосе. Отдельно допуск 0.02 × Q захватил близкий красный квадрат; CHANNEL_BLUE изменил только синий канал выбранного красного. Несовпадающий target дал true без изменения, а null в paintFloodfillImage выбрал цвет seed и совпал с явным красным. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-workflow.png
workflow-color-raw8.png
workflow-matte-raw8.png
workflow-paint-raw8.png
workflow-opaque-raw8.png
workflow-transparent-raw8.png
workflow-fuzz8.png
workflow-blue-channel8.png
workflow-mismatch8.png
workflow-null8.png
metrics.json
cases=9 deprecations=18 mismatch-unchanged=1 null-equal=1 source-unchanged=1
Imagick::matteFloodfillImageСделать прозрачной область внутри одного контура

PECL imagick 2, PECL imagick 3 · imagick

Imagick::matteFloodfillImage(float $alpha, float $fuzz, mixed $bordercolor, int $x, int $y): bool

Назначение, аргументы и результат

Imagick::matteFloodfillImage(float $alpha, float $fuzz, mixed $bordercolor, int $x, int $y): bool

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

ПараметрКак он используется
$alphaОбязательный float: 0 полностью прозрачно, 1 полностью непрозрачно. Внутри IM6 это переводится в opacity Q − Q × alpha. Значение присваивается выбранной области, не умножает прежнюю alpha; RGB остаются прежними.
$fuzzОбязательный float в Quantum-единицах, допуск сравнения с барьером; здесь 0.
$bordercolorОбязательная строка или ImagickPixel с цветом барьера; здесь black. Названный в официальном тексте FillToBorderMethod — внутренний режим, не дополнительный аргумент PHP.
$x, $yОбязательные int координаты начала связной области; здесь (50,90). Проверяйте границы кадра до вызова.

Возвращается bool true при успешном выполнении, а сам текущий объект изображения изменяется. Это не новый Imagick и не количество затронутых пикселей. True не доказывает изменение: в проектном примере paintFloodfillImage с несовпадающим target вернул true и оставил источник прежним. Работаем на clone, чтобы сохранить оригинал. Ошибка native-операции превращается в ImagickException; пустой объект, неверный цвет и координаты проверяются отдельно. Тексты трёх реально полученных исключений сохранены в metrics.json, не выдаются за универсальные сообщения всех версий.

Официальная доступность: PECL imagick 2, PECL imagick 3. Все пять методов помечены deprecated с PECL Imagick 3.4.4; в проверенных guarded bindings они относятся к ветке ImageMagick 6 и исключены для IM7. Не используйте их как начало нового проекта. Здесь они нужны, чтобы понять и перенести существующий редактор; современные варианты выполняются отдельно в той же IM6-среде, а автоматическая совместимость любого старого сценария не обещается.

Официальный changelog PECL Imagick 2.1.0 сохраняется: строки цвета разрешены вместо прежнего обязательного ImagickPixel. У color это первый и третий параметры, у matte третий, у opaque первый и второй, у transparent первый. Тип mixed из старого synopsis не означает, что подходят любые PHP-значения: actual wrapper преобразует только допустимое представление цвета.

Полный официальный XML: описание, параметры, возврат, ограничения и changelog
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.mattefloodfillimage">
 <refnamediv>
  <refname>Imagick::matteFloodfillImage</refname>
  <refpurpose>Changes the transparency value of a color</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::matteFloodfillImage</methodname>
   <methodparam><type>float</type><parameter>alpha</parameter></methodparam>
   <methodparam><type>float</type><parameter>fuzz</parameter></methodparam>
   <methodparam><type>mixed</type><parameter>bordercolor</parameter></methodparam>
   <methodparam><type>int</type><parameter>x</parameter></methodparam>
   <methodparam><type>int</type><parameter>y</parameter></methodparam>
  </methodsynopsis>
  <para>
   Changes the transparency value of any pixel that matches
   target and is an immediate neighbor.  If the method
   <constant>FillToBorderMethod</constant> is specified, the transparency value
   is changed for any neighbor pixel that does not match
   the bordercolor member of image.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>alpha</parameter></term>
     <listitem>
      <para>
       The level of transparency: 1.0 is fully opaque and 0.0 is fully
       transparent.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>fuzz</parameter></term>
     <listitem>
      <para>
       The fuzz member of image defines how much tolerance is acceptable to
       consider two colors as the same.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>bordercolor</parameter></term>
     <listitem>
      <para>
      An <classname>ImagickPixel</classname> object or string representing the border color.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>x</parameter></term>
     <listitem>
      <para>
      The starting x coordinate of the operation.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>y</parameter></term>
     <listitem>
      <para>
      The starting y coordinate of the operation.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>

 <refsect1 role="errors">
  &reftitle.errors;
  <para>
   &imagick.imagick.throws;
  </para>
 </refsect1>

 <refsect1 role="changelog">
  &reftitle.changelog;
  <para>
   <informaltable>
    <tgroup cols="2">
     <thead>
      <row>
       <entry>&Version;</entry>
       <entry>&Description;</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>PECL imagick 2.1.0</entry>
       <entry>
        Now allows a string representing the color as the third parameter.
        Previous versions allow only an <classname>ImagickPixel</classname> object.
       </entry>
      </row>
     </tbody>
    </tgroup>
   </informaltable>
  </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
-->

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

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

Сделать прозрачной область внутри одного контураПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$image=clone $source;
$call=lpCall('matte',fn()=>$image->matteFloodfillImage(0,0,'black',50,90));
lpMinimalProof('legacy-matte-fill-minimal','matte','matteFloodfillImage',$source,$image,$call,$before);
echo "legacy-paint-fill-matte.png\nmatte-raw8.png\nmetrics.json\nreturned=1 deprecations=2 source-unchanged=1\n";

Внутри левого контура появились настоящие прозрачные пиксели, включая синюю вставку. Справа всё осталось непрозрачным. RGB выбранных пикселей не изменились; шахматная подложка существует только в отдельном просмотре. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-matte.png
matte-raw8.png
metrics.json
returned=1 deprecations=2 source-unchanged=1

Выбрать область, допуск и каналы в одном контролируемом редакторе

Пять независимых результатов сопоставлены на общей полосе. Отдельно допуск 0.02 × Q захватил близкий красный квадрат; CHANNEL_BLUE изменил только синий канал выбранного красного. Несовпадающий target дал true без изменения, а null в paintFloodfillImage выбрал цвет seed и совпал с явным красным.

Выбрать область, допуск и каналы в одном контролируемом редактореПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$quantum=Imagick::getQuantumRange()['quantumRangeLong'];
$operations=[
    'color'=>fn(Imagick $i)=>$i->colorFloodfillImage('rgb(32,176,96)',0,'black',50,90),
    'matte'=>fn(Imagick $i)=>$i->matteFloodfillImage(0,0,'black',50,90),
    'paint'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,'rgb(208,32,48)',50,90),
    'opaque'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0),
    'transparent'=>fn(Imagick $i)=>$i->paintTransparentImage('rgb(208,32,48)',0,0),
    'fuzz'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0.02*$quantum),
    'blue-channel'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','white',0,Imagick::CHANNEL_BLUE),
    'mismatch'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,'black',50,90),
    'null'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,null,50,90),
];
$rows=[];$images=[];
foreach($operations as $key=>$operation){
    $image=clone $source;$call=lpCall($key,fn()=>$operation($image));
    $rows[$key]=lpSummary($source,$image,$call);$images[$key]=$image;
    if(in_array($key,['color','matte','paint','opaque','transparent'],true)){lpRaw($image,'workflow-'.$key.'-raw8.png');}
    else{lpView($image,'workflow-'.$key.'8.png');}
}
$panelKeys=['color','matte','paint','opaque','transparent'];
$rects=lpCompare(array_map(fn($key)=>$images[$key],$panelKeys),'legacy-paint-fill-workflow.png');
$checks=[];foreach($panelKeys as $key){foreach(lpCaseChecks($key,$rows[$key],lpSamples($source)) as $name=>$value){$checks[$key.'_'.$name]=$value;}}
$near=$rows['fuzz']['samples']['near_red'];$original=lpSamples($source);$channel=$rows['blue-channel']['samples']['left'];
$checks+=['fuzz_selects_near_red'=>$near===[32,176,96,255],
    'blue_channel_preserves_RG'=>$channel===[$original['left'][0],$original['left'][1],255,255],
    'mismatching_target_true_but_no_change'=>$rows['mismatch']['returned']===true&&$rows['mismatch']['changed_pixels']===0,
    'null_seed_matches_explicit_target'=>$rows['null']['rgba16_sha256']===$rows['paint']['rgba16_sha256'],
    'nine_scoped_legacy_calls'=>count(array_filter($rows,fn($row)=>($row['returned']??null)===true&&$row['deprecations']===2))===9,
    'source_preserved'=>lpHash($source)===$before];
lpDiagnostic('legacy-paint-fill-workflow',['executed_apis'=>['colorFloodfillImage','matteFloodfillImage','paintFloodfillImage','paintOpaqueImage','paintTransparentImage'],
    'quantum'=>$quantum,'fuzz'=>0.02*$quantum,'channel'=>Imagick::CHANNEL_BLUE,'rows'=>$rows,'panel_keys'=>$panelKeys,'panel_geometry'=>$rects,
    'source_samples'=>$original,'source_unchanged'=>lpHash($source)===$before,'checks'=>$checks]);
echo "legacy-paint-fill-workflow.png\nworkflow-color-raw8.png\nworkflow-matte-raw8.png\nworkflow-paint-raw8.png\nworkflow-opaque-raw8.png\nworkflow-transparent-raw8.png\nworkflow-fuzz8.png\nworkflow-blue-channel8.png\nworkflow-mismatch8.png\nworkflow-null8.png\nmetrics.json\ncases=9 deprecations=18 mismatch-unchanged=1 null-equal=1 source-unchanged=1\n";

Пять независимых результатов сопоставлены на общей полосе. Отдельно допуск 0.02 × Q захватил близкий красный квадрат; CHANNEL_BLUE изменил только синий канал выбранного красного. Несовпадающий target дал true без изменения, а null в paintFloodfillImage выбрал цвет seed и совпал с явным красным. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-workflow.png
workflow-color-raw8.png
workflow-matte-raw8.png
workflow-paint-raw8.png
workflow-opaque-raw8.png
workflow-transparent-raw8.png
workflow-fuzz8.png
workflow-blue-channel8.png
workflow-mismatch8.png
workflow-null8.png
metrics.json
cases=9 deprecations=18 mismatch-unchanged=1 null-equal=1 source-unchanged=1
Imagick::paintFloodfillImageПерекрасить только связный красный участок

PECL imagick 2 >= 2.1.0, PECL imagick 3 · imagick

Imagick::paintFloodfillImage(mixed $fill, float $fuzz, mixed $bordercolor, int $x, int $y, int $channel = Imagick::CHANNEL_DEFAULT): bool

Назначение, аргументы и результат

Imagick::paintFloodfillImage(mixed $fill, float $fuzz, mixed $bordercolor, int $x, int $y, int $channel = Imagick::CHANNEL_DEFAULT): bool

Зелёным стал связный точный красный участок слева. Левая синяя вставка и близкий красный квадрат сохранились, как и правое красное поле. Третий аргумент этого метода — фактический target, несмотря на историческое имя bordercolor.

ПараметрКак он используется
$fillОбязательный ImagickPixel или строка нового цвета; здесь непрозрачный зелёный.
$fuzzОбязательный float в Quantum-единицах, допуск сравнения с target. При 0 близкий красный квадрат не совпадает с точным красным.
$bordercolorИсторическое имя третьего параметра. В проверенном IM6 deprecated Wand делегирует современному FloodfillPaintImage с invert=false: этот цвет является совпадающим target, а не барьером. Явный red выбирает только связную красную область; black при красном seed оставляет изображение прежним и всё равно возвращает true. Actual wrapper 3.7 допускает null, чтобы Wand взял target из seed; XML/stub такой nullable-тип не объявляют, поэтому это отдельно проверенная особенность этой реализации.
$x, $yОбязательные int координаты seed, здесь (50,90); сами по себе не отменяют явно переданный target.
$channelНеобязательный int, по умолчанию Imagick::CHANNEL_DEFAULT. Именованные CHANNEL_* ограничивают запись каналов, а не геометрическую область. Несколько каналов объединяют побитовым |. Полупрозрачный fill в Core может также активировать/записать alpha; не обещаем универсальную изоляцию alpha одним RGB-mask.

Возвращается bool true при успешном выполнении, а сам текущий объект изображения изменяется. Это не новый Imagick и не количество затронутых пикселей. True не доказывает изменение: в проектном примере paintFloodfillImage с несовпадающим target вернул true и оставил источник прежним. Работаем на clone, чтобы сохранить оригинал. Ошибка native-операции превращается в ImagickException; пустой объект, неверный цвет и координаты проверяются отдельно. Тексты трёх реально полученных исключений сохранены в metrics.json, не выдаются за универсальные сообщения всех версий.

Официальная доступность: PECL imagick 2 >= 2.1.0, PECL imagick 3. Все пять методов помечены deprecated с PECL Imagick 3.4.4; в проверенных guarded bindings они относятся к ветке ImageMagick 6 и исключены для IM7. Не используйте их как начало нового проекта. Здесь они нужны, чтобы понять и перенести существующий редактор; современные варианты выполняются отдельно в той же IM6-среде, а автоматическая совместимость любого старого сценария не обещается.

В официальном описании дополнительно указано устаревание с ImageMagick 6.3.8 и ссылка на floodFillPaintImage. Это отдельная история native API, не дата PECL-предупреждения 3.4.4. Не переносите одно только имя метода: у нового вызова нужно явно различать target и invert, а у старого color/matte третий цвет имел роль барьера. Invert — необязательный bool со значением false по умолчанию; в нашем переносе он передаётся явно, чтобы сохранить нужное правило выбора.

Полный официальный XML: описание, параметры, возврат, ограничения и changelog
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.paintfloodfillimage">
 <refnamediv>
  <refname>Imagick::paintFloodfillImage</refname>
  <refpurpose>Changes the color value of any pixel that matches target</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::paintFloodfillImage</methodname>
   <methodparam><type>mixed</type><parameter>fill</parameter></methodparam>
   <methodparam><type>float</type><parameter>fuzz</parameter></methodparam>
   <methodparam><type>mixed</type><parameter>bordercolor</parameter></methodparam>
   <methodparam><type>int</type><parameter>x</parameter></methodparam>
   <methodparam><type>int</type><parameter>y</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. As of ImageMagick 6.3.8 this method has been deprecated
   and <function>Imagick::floodfillPaintImage</function> should be used instead.
  </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>
       The amount of fuzz. For example, set fuzz to 10 and the color red at
       intensities of 100 and 102 respectively are now interpreted as the
       same color for the purposes of the floodfill.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>bordercolor</parameter></term>
     <listitem>
      <para>
       ImagickPixel object or a string containing the border color
      </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>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
-->

Перекрасить только связный красный участок

Зелёным стал связный точный красный участок слева. Левая синяя вставка и близкий красный квадрат сохранились, как и правое красное поле. Третий аргумент этого метода — фактический target, несмотря на историческое имя bordercolor.

Перекрасить только связный красный участокПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$image=clone $source;
$call=lpCall('paint',fn()=>$image->paintFloodfillImage('rgb(32,176,96)',0,'rgb(208,32,48)',50,90));
lpMinimalProof('legacy-paint-fill-minimal','paint','paintFloodfillImage',$source,$image,$call,$before);
echo "legacy-paint-fill-paint.png\npaint-raw8.png\nmetrics.json\nreturned=1 deprecations=2 source-unchanged=1\n";

Зелёным стал связный точный красный участок слева. Левая синяя вставка и близкий красный квадрат сохранились, как и правое красное поле. Третий аргумент этого метода — фактический target, несмотря на историческое имя bordercolor. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-paint.png
paint-raw8.png
metrics.json
returned=1 deprecations=2 source-unchanged=1

Выбрать область, допуск и каналы в одном контролируемом редакторе

Пять независимых результатов сопоставлены на общей полосе. Отдельно допуск 0.02 × Q захватил близкий красный квадрат; CHANNEL_BLUE изменил только синий канал выбранного красного. Несовпадающий target дал true без изменения, а null в paintFloodfillImage выбрал цвет seed и совпал с явным красным.

Выбрать область, допуск и каналы в одном контролируемом редактореПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$quantum=Imagick::getQuantumRange()['quantumRangeLong'];
$operations=[
    'color'=>fn(Imagick $i)=>$i->colorFloodfillImage('rgb(32,176,96)',0,'black',50,90),
    'matte'=>fn(Imagick $i)=>$i->matteFloodfillImage(0,0,'black',50,90),
    'paint'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,'rgb(208,32,48)',50,90),
    'opaque'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0),
    'transparent'=>fn(Imagick $i)=>$i->paintTransparentImage('rgb(208,32,48)',0,0),
    'fuzz'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0.02*$quantum),
    'blue-channel'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','white',0,Imagick::CHANNEL_BLUE),
    'mismatch'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,'black',50,90),
    'null'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,null,50,90),
];
$rows=[];$images=[];
foreach($operations as $key=>$operation){
    $image=clone $source;$call=lpCall($key,fn()=>$operation($image));
    $rows[$key]=lpSummary($source,$image,$call);$images[$key]=$image;
    if(in_array($key,['color','matte','paint','opaque','transparent'],true)){lpRaw($image,'workflow-'.$key.'-raw8.png');}
    else{lpView($image,'workflow-'.$key.'8.png');}
}
$panelKeys=['color','matte','paint','opaque','transparent'];
$rects=lpCompare(array_map(fn($key)=>$images[$key],$panelKeys),'legacy-paint-fill-workflow.png');
$checks=[];foreach($panelKeys as $key){foreach(lpCaseChecks($key,$rows[$key],lpSamples($source)) as $name=>$value){$checks[$key.'_'.$name]=$value;}}
$near=$rows['fuzz']['samples']['near_red'];$original=lpSamples($source);$channel=$rows['blue-channel']['samples']['left'];
$checks+=['fuzz_selects_near_red'=>$near===[32,176,96,255],
    'blue_channel_preserves_RG'=>$channel===[$original['left'][0],$original['left'][1],255,255],
    'mismatching_target_true_but_no_change'=>$rows['mismatch']['returned']===true&&$rows['mismatch']['changed_pixels']===0,
    'null_seed_matches_explicit_target'=>$rows['null']['rgba16_sha256']===$rows['paint']['rgba16_sha256'],
    'nine_scoped_legacy_calls'=>count(array_filter($rows,fn($row)=>($row['returned']??null)===true&&$row['deprecations']===2))===9,
    'source_preserved'=>lpHash($source)===$before];
lpDiagnostic('legacy-paint-fill-workflow',['executed_apis'=>['colorFloodfillImage','matteFloodfillImage','paintFloodfillImage','paintOpaqueImage','paintTransparentImage'],
    'quantum'=>$quantum,'fuzz'=>0.02*$quantum,'channel'=>Imagick::CHANNEL_BLUE,'rows'=>$rows,'panel_keys'=>$panelKeys,'panel_geometry'=>$rects,
    'source_samples'=>$original,'source_unchanged'=>lpHash($source)===$before,'checks'=>$checks]);
echo "legacy-paint-fill-workflow.png\nworkflow-color-raw8.png\nworkflow-matte-raw8.png\nworkflow-paint-raw8.png\nworkflow-opaque-raw8.png\nworkflow-transparent-raw8.png\nworkflow-fuzz8.png\nworkflow-blue-channel8.png\nworkflow-mismatch8.png\nworkflow-null8.png\nmetrics.json\ncases=9 deprecations=18 mismatch-unchanged=1 null-equal=1 source-unchanged=1\n";

Пять независимых результатов сопоставлены на общей полосе. Отдельно допуск 0.02 × Q захватил близкий красный квадрат; CHANNEL_BLUE изменил только синий канал выбранного красного. Несовпадающий target дал true без изменения, а null в paintFloodfillImage выбрал цвет seed и совпал с явным красным. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-workflow.png
workflow-color-raw8.png
workflow-matte-raw8.png
workflow-paint-raw8.png
workflow-opaque-raw8.png
workflow-transparent-raw8.png
workflow-fuzz8.png
workflow-blue-channel8.png
workflow-mismatch8.png
workflow-null8.png
metrics.json
cases=9 deprecations=18 mismatch-unchanged=1 null-equal=1 source-unchanged=1
Imagick::paintOpaqueImageЗаменить точный красный цвет в обоих контейнерах

PECL imagick 2, PECL imagick 3 · imagick

Imagick::paintOpaqueImage(mixed $target, mixed $fill, float $fuzz, int $channel = Imagick::CHANNEL_DEFAULT): bool

Назначение, аргументы и результат

Imagick::paintOpaqueImage(mixed $target, mixed $fill, float $fuzz, int $channel = Imagick::CHANNEL_DEFAULT): bool

Точный красный стал зелёным в обоих несвязанных контейнерах. Синие вставки и близкий красный квадрат сохранились при fuzz 0. Координаты для глобальной замены не нужны.

ПараметрКак он используется
$targetОбязательный ImagickPixel или строка исходного цвета; здесь rgb(208,32,48). Поиск глобальный: координат нет, обе красные области подходят.
$fillОбязательный ImagickPixel или строка цвета замены; здесь rgb(32,176,96).
$fuzzОбязательный float в Quantum-единицах. 0 выбирает точное совпадение, а 0.02 × Q в нашем примере дополнительно выбирает близкий красный квадрат.
$channelНеобязательный int, по умолчанию CHANNEL_DEFAULT. CHANNEL_BLUE присваивает выбранным пикселям только синий компонент fill; R/G/A сохраняются в показанном непрозрачном RGB-случае. Для нескольких каналов используют |.

Возвращается bool true при успешном выполнении, а сам текущий объект изображения изменяется. Это не новый Imagick и не количество затронутых пикселей. True не доказывает изменение: в проектном примере paintFloodfillImage с несовпадающим target вернул true и оставил источник прежним. Работаем на clone, чтобы сохранить оригинал. Ошибка native-операции превращается в ImagickException; пустой объект, неверный цвет и координаты проверяются отдельно. Тексты трёх реально полученных исключений сохранены в metrics.json, не выдаются за универсальные сообщения всех версий.

Официальная доступность: PECL imagick 2, PECL imagick 3. Все пять методов помечены deprecated с PECL Imagick 3.4.4; в проверенных guarded bindings они относятся к ветке ImageMagick 6 и исключены для IM7. Не используйте их как начало нового проекта. Здесь они нужны, чтобы понять и перенести существующий редактор; современные варианты выполняются отдельно в той же IM6-среде, а автоматическая совместимость любого старого сценария не обещается.

Официальный changelog PECL Imagick 2.1.0 сохраняется: строки цвета разрешены вместо прежнего обязательного ImagickPixel. У color это первый и третий параметры, у matte третий, у opaque первый и второй, у transparent первый. Тип mixed из старого synopsis не означает, что подходят любые PHP-значения: actual wrapper преобразует только допустимое представление цвета.

Полный официальный XML: описание, параметры, возврат, ограничения и changelog
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.paintopaqueimage">
 <refnamediv>
  <refname>Imagick::paintOpaqueImage</refname>
  <refpurpose>Change any pixel that matches color</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::paintOpaqueImage</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 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.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>target</parameter></term>
     <listitem>
      <para>
       Change this target color to the fill color within the image. An
       ImagickPixel object or a string representing the target color.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>fill</parameter></term>
     <listitem>
      <para>
       An ImagickPixel object or a string representing the fill color.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>fuzz</parameter></term>
     <listitem>
      <para>
       The fuzz member of image defines how much tolerance is acceptable to
       consider two colors as the same.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>channel</parameter></term>
     <listitem>
      <para>
       Provide any channel constant that is valid for your channel mode. To
       apply to more than one channel, combine channeltype constants using
       bitwise operators. Refer to this
       list of <link linkend="imagick.constants.channel">channel constants</link>.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>

 <refsect1 role="errors">
  &reftitle.errors;
  <para>
   &imagick.imagick.throws;
  </para>
 </refsect1>

 <refsect1 role="changelog">
  &reftitle.changelog;
  <para>
   <informaltable>
    <tgroup cols="2">
     <thead>
      <row>
       <entry>&Version;</entry>
       <entry>&Description;</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>PECL imagick 2.1.0</entry>
       <entry>
        Now allows a string representing the color as first and second parameter.
        Previous versions allow only an ImagickPixel object.
       </entry>
      </row>
     </tbody>
    </tgroup>
   </informaltable>
  </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
-->

Заменить точный красный цвет в обоих контейнерах

Точный красный стал зелёным в обоих несвязанных контейнерах. Синие вставки и близкий красный квадрат сохранились при fuzz 0. Координаты для глобальной замены не нужны.

Заменить точный красный цвет в обоих контейнерахПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$image=clone $source;
$call=lpCall('opaque',fn()=>$image->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0));
lpMinimalProof('legacy-opaque-minimal','opaque','paintOpaqueImage',$source,$image,$call,$before);
echo "legacy-paint-fill-opaque.png\nopaque-raw8.png\nmetrics.json\nreturned=1 deprecations=2 source-unchanged=1\n";

Точный красный стал зелёным в обоих несвязанных контейнерах. Синие вставки и близкий красный квадрат сохранились при fuzz 0. Координаты для глобальной замены не нужны. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-opaque.png
opaque-raw8.png
metrics.json
returned=1 deprecations=2 source-unchanged=1

Выбрать область, допуск и каналы в одном контролируемом редакторе

Пять независимых результатов сопоставлены на общей полосе. Отдельно допуск 0.02 × Q захватил близкий красный квадрат; CHANNEL_BLUE изменил только синий канал выбранного красного. Несовпадающий target дал true без изменения, а null в paintFloodfillImage выбрал цвет seed и совпал с явным красным.

Выбрать область, допуск и каналы в одном контролируемом редактореПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$quantum=Imagick::getQuantumRange()['quantumRangeLong'];
$operations=[
    'color'=>fn(Imagick $i)=>$i->colorFloodfillImage('rgb(32,176,96)',0,'black',50,90),
    'matte'=>fn(Imagick $i)=>$i->matteFloodfillImage(0,0,'black',50,90),
    'paint'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,'rgb(208,32,48)',50,90),
    'opaque'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0),
    'transparent'=>fn(Imagick $i)=>$i->paintTransparentImage('rgb(208,32,48)',0,0),
    'fuzz'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0.02*$quantum),
    'blue-channel'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','white',0,Imagick::CHANNEL_BLUE),
    'mismatch'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,'black',50,90),
    'null'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,null,50,90),
];
$rows=[];$images=[];
foreach($operations as $key=>$operation){
    $image=clone $source;$call=lpCall($key,fn()=>$operation($image));
    $rows[$key]=lpSummary($source,$image,$call);$images[$key]=$image;
    if(in_array($key,['color','matte','paint','opaque','transparent'],true)){lpRaw($image,'workflow-'.$key.'-raw8.png');}
    else{lpView($image,'workflow-'.$key.'8.png');}
}
$panelKeys=['color','matte','paint','opaque','transparent'];
$rects=lpCompare(array_map(fn($key)=>$images[$key],$panelKeys),'legacy-paint-fill-workflow.png');
$checks=[];foreach($panelKeys as $key){foreach(lpCaseChecks($key,$rows[$key],lpSamples($source)) as $name=>$value){$checks[$key.'_'.$name]=$value;}}
$near=$rows['fuzz']['samples']['near_red'];$original=lpSamples($source);$channel=$rows['blue-channel']['samples']['left'];
$checks+=['fuzz_selects_near_red'=>$near===[32,176,96,255],
    'blue_channel_preserves_RG'=>$channel===[$original['left'][0],$original['left'][1],255,255],
    'mismatching_target_true_but_no_change'=>$rows['mismatch']['returned']===true&&$rows['mismatch']['changed_pixels']===0,
    'null_seed_matches_explicit_target'=>$rows['null']['rgba16_sha256']===$rows['paint']['rgba16_sha256'],
    'nine_scoped_legacy_calls'=>count(array_filter($rows,fn($row)=>($row['returned']??null)===true&&$row['deprecations']===2))===9,
    'source_preserved'=>lpHash($source)===$before];
lpDiagnostic('legacy-paint-fill-workflow',['executed_apis'=>['colorFloodfillImage','matteFloodfillImage','paintFloodfillImage','paintOpaqueImage','paintTransparentImage'],
    'quantum'=>$quantum,'fuzz'=>0.02*$quantum,'channel'=>Imagick::CHANNEL_BLUE,'rows'=>$rows,'panel_keys'=>$panelKeys,'panel_geometry'=>$rects,
    'source_samples'=>$original,'source_unchanged'=>lpHash($source)===$before,'checks'=>$checks]);
echo "legacy-paint-fill-workflow.png\nworkflow-color-raw8.png\nworkflow-matte-raw8.png\nworkflow-paint-raw8.png\nworkflow-opaque-raw8.png\nworkflow-transparent-raw8.png\nworkflow-fuzz8.png\nworkflow-blue-channel8.png\nworkflow-mismatch8.png\nworkflow-null8.png\nmetrics.json\ncases=9 deprecations=18 mismatch-unchanged=1 null-equal=1 source-unchanged=1\n";

Пять независимых результатов сопоставлены на общей полосе. Отдельно допуск 0.02 × Q захватил близкий красный квадрат; CHANNEL_BLUE изменил только синий канал выбранного красного. Несовпадающий target дал true без изменения, а null в paintFloodfillImage выбрал цвет seed и совпал с явным красным. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-workflow.png
workflow-color-raw8.png
workflow-matte-raw8.png
workflow-paint-raw8.png
workflow-opaque-raw8.png
workflow-transparent-raw8.png
workflow-fuzz8.png
workflow-blue-channel8.png
workflow-mismatch8.png
workflow-null8.png
metrics.json
cases=9 deprecations=18 mismatch-unchanged=1 null-equal=1 source-unchanged=1
Imagick::paintTransparentImageСделать прозрачным точный красный цвет в обоих контейнерах

PECL imagick 2, PECL imagick 3 · imagick

Imagick::paintTransparentImage(mixed $target, float $alpha, float $fuzz): bool

Назначение, аргументы и результат

Imagick::paintTransparentImage(mixed $target, float $alpha, float $fuzz): bool

Оба точных красных поля получили alpha 0. Синие вставки, близкий красный квадрат, чёрные контуры и белый фон остались видимыми. Это глобальный выбор цвета, а не распознавание фона или объекта.

ПараметрКак он используется
$targetОбязательный ImagickPixel или строка выбранного цвета; все совпавшие пиксели во всём изображении получат alpha. Это не выбор связного внешнего фона.
$alphaОбязательный float: 0 прозрачно, 1 непрозрачно. Присваивается alpha, RGB сохраняются; параметра fill у метода нет. Общая фраза официального описания про fill не соответствует его собственной сигнатуре, поэтому здесь показана фактическая операция прозрачности.
$fuzzОбязательный float в Quantum-единицах, допуск совпадения с target. Большой допуск может убрать детали объекта похожего цвета. Параметров invert и channel у этого legacy-метода нет.

Возвращается bool true при успешном выполнении, а сам текущий объект изображения изменяется. Это не новый Imagick и не количество затронутых пикселей. True не доказывает изменение: в проектном примере paintFloodfillImage с несовпадающим target вернул true и оставил источник прежним. Работаем на clone, чтобы сохранить оригинал. Ошибка native-операции превращается в ImagickException; пустой объект, неверный цвет и координаты проверяются отдельно. Тексты трёх реально полученных исключений сохранены в metrics.json, не выдаются за универсальные сообщения всех версий.

Официальная доступность: PECL imagick 2, PECL imagick 3. Все пять методов помечены deprecated с PECL Imagick 3.4.4; в проверенных guarded bindings они относятся к ветке ImageMagick 6 и исключены для IM7. Не используйте их как начало нового проекта. Здесь они нужны, чтобы понять и перенести существующий редактор; современные варианты выполняются отдельно в той же IM6-среде, а автоматическая совместимость любого старого сценария не обещается.

Официальный changelog PECL Imagick 2.1.0 сохраняется: строки цвета разрешены вместо прежнего обязательного ImagickPixel. У color это первый и третий параметры, у matte третий, у opaque первый и второй, у transparent первый. Тип mixed из старого synopsis не означает, что подходят любые PHP-значения: actual wrapper преобразует только допустимое представление цвета.

Полный официальный XML: описание, параметры, возврат, ограничения и changelog
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.painttransparentimage">
 <refnamediv>
  <refname>Imagick::paintTransparentImage</refname>
  <refpurpose>Changes any pixel that matches color with the color defined by fill</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::paintTransparentImage</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>
  </methodsynopsis>
  <para>
   Changes any pixel that matches color with the color defined by fill.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>target</parameter></term>
     <listitem>
      <para>
      Change this target color to specified opacity value within the image.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>alpha</parameter></term>
     <listitem>
      <para>
       The level of transparency: 1.0 is fully opaque and 0.0 is fully 
       transparent.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>fuzz</parameter></term>
     <listitem>
      <para>
       The fuzz member of image defines how much tolerance is acceptable to
       consider two colors as the same.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>

 </refsect1>
 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>

 <refsect1 role="errors">
  &reftitle.errors;
  <para>
   &imagick.imagick.throws;
  </para>
 </refsect1>

 <refsect1 role="changelog">
  &reftitle.changelog;
  <para>
   <informaltable>
    <tgroup cols="2">
     <thead>
      <row>
       <entry>&Version;</entry>
       <entry>&Description;</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>PECL imagick 2.1.0</entry>
       <entry>
        Now allows a string representing the color as the first parameter.
        Previous versions allow only an ImagickPixel object.
       </entry>
      </row>
     </tbody>
    </tgroup>
   </informaltable>
  </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
-->

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

Оба точных красных поля получили alpha 0. Синие вставки, близкий красный квадрат, чёрные контуры и белый фон остались видимыми. Это глобальный выбор цвета, а не распознавание фона или объекта.

Сделать прозрачным точный красный цвет в обоих контейнерахПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$image=clone $source;
$call=lpCall('transparent',fn()=>$image->paintTransparentImage('rgb(208,32,48)',0,0));
lpMinimalProof('legacy-transparent-minimal','transparent','paintTransparentImage',$source,$image,$call,$before);
echo "legacy-paint-fill-transparent.png\ntransparent-raw8.png\nmetrics.json\nreturned=1 deprecations=2 source-unchanged=1\n";

Оба точных красных поля получили alpha 0. Синие вставки, близкий красный квадрат, чёрные контуры и белый фон остались видимыми. Это глобальный выбор цвета, а не распознавание фона или объекта. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-transparent.png
transparent-raw8.png
metrics.json
returned=1 deprecations=2 source-unchanged=1

Выбрать область, допуск и каналы в одном контролируемом редакторе

Пять независимых результатов сопоставлены на общей полосе. Отдельно допуск 0.02 × Q захватил близкий красный квадрат; CHANNEL_BLUE изменил только синий канал выбранного красного. Несовпадающий target дал true без изменения, а null в paintFloodfillImage выбрал цвет seed и совпал с явным красным.

Выбрать область, допуск и каналы в одном контролируемом редактореПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-paint-fill-fixture.php';
lpRestore();
$source=lpSource();$before=lpHash($source);
$quantum=Imagick::getQuantumRange()['quantumRangeLong'];
$operations=[
    'color'=>fn(Imagick $i)=>$i->colorFloodfillImage('rgb(32,176,96)',0,'black',50,90),
    'matte'=>fn(Imagick $i)=>$i->matteFloodfillImage(0,0,'black',50,90),
    'paint'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,'rgb(208,32,48)',50,90),
    'opaque'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0),
    'transparent'=>fn(Imagick $i)=>$i->paintTransparentImage('rgb(208,32,48)',0,0),
    'fuzz'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','rgb(32,176,96)',0.02*$quantum),
    'blue-channel'=>fn(Imagick $i)=>$i->paintOpaqueImage('rgb(208,32,48)','white',0,Imagick::CHANNEL_BLUE),
    'mismatch'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,'black',50,90),
    'null'=>fn(Imagick $i)=>$i->paintFloodfillImage('rgb(32,176,96)',0,null,50,90),
];
$rows=[];$images=[];
foreach($operations as $key=>$operation){
    $image=clone $source;$call=lpCall($key,fn()=>$operation($image));
    $rows[$key]=lpSummary($source,$image,$call);$images[$key]=$image;
    if(in_array($key,['color','matte','paint','opaque','transparent'],true)){lpRaw($image,'workflow-'.$key.'-raw8.png');}
    else{lpView($image,'workflow-'.$key.'8.png');}
}
$panelKeys=['color','matte','paint','opaque','transparent'];
$rects=lpCompare(array_map(fn($key)=>$images[$key],$panelKeys),'legacy-paint-fill-workflow.png');
$checks=[];foreach($panelKeys as $key){foreach(lpCaseChecks($key,$rows[$key],lpSamples($source)) as $name=>$value){$checks[$key.'_'.$name]=$value;}}
$near=$rows['fuzz']['samples']['near_red'];$original=lpSamples($source);$channel=$rows['blue-channel']['samples']['left'];
$checks+=['fuzz_selects_near_red'=>$near===[32,176,96,255],
    'blue_channel_preserves_RG'=>$channel===[$original['left'][0],$original['left'][1],255,255],
    'mismatching_target_true_but_no_change'=>$rows['mismatch']['returned']===true&&$rows['mismatch']['changed_pixels']===0,
    'null_seed_matches_explicit_target'=>$rows['null']['rgba16_sha256']===$rows['paint']['rgba16_sha256'],
    'nine_scoped_legacy_calls'=>count(array_filter($rows,fn($row)=>($row['returned']??null)===true&&$row['deprecations']===2))===9,
    'source_preserved'=>lpHash($source)===$before];
lpDiagnostic('legacy-paint-fill-workflow',['executed_apis'=>['colorFloodfillImage','matteFloodfillImage','paintFloodfillImage','paintOpaqueImage','paintTransparentImage'],
    'quantum'=>$quantum,'fuzz'=>0.02*$quantum,'channel'=>Imagick::CHANNEL_BLUE,'rows'=>$rows,'panel_keys'=>$panelKeys,'panel_geometry'=>$rects,
    'source_samples'=>$original,'source_unchanged'=>lpHash($source)===$before,'checks'=>$checks]);
echo "legacy-paint-fill-workflow.png\nworkflow-color-raw8.png\nworkflow-matte-raw8.png\nworkflow-paint-raw8.png\nworkflow-opaque-raw8.png\nworkflow-transparent-raw8.png\nworkflow-fuzz8.png\nworkflow-blue-channel8.png\nworkflow-mismatch8.png\nworkflow-null8.png\nmetrics.json\ncases=9 deprecations=18 mismatch-unchanged=1 null-equal=1 source-unchanged=1\n";

Пять независимых результатов сопоставлены на общей полосе. Отдельно допуск 0.02 × Q захватил близкий красный квадрат; CHANNEL_BLUE изменил только синий канал выбранного красного. Несовпадающий target дал true без изменения, а null в paintFloodfillImage выбрал цвет seed и совпал с явным красным. Самостоятельный архив содержит example.php, source.png.b64 и legacy-paint-fill-fixture.php; распакуйте их рядом и выполните php example.php. lpRestore проверяет SHA и восстанавливает собственный PNG; lpSource открывает его. lpCall выполняет видимый в программе вызов, сохраняет только E_DEPRECATED и восстанавливает прежний обработчик через finally. lpRaw сохраняет настоящую RGBA8-копию, lpView и lpCompare показывают результат на отдельной нативной шахматной подложке. lpSummary/Proof записывают metrics.json. Ни один helper не выбирает вместо вас барьер, target или метод. Проверенная среда: PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL; исполнение этих пяти legacy-методов на Windows IM7 не заявлено.

Ожидаемый вывод проверенной программы
legacy-paint-fill-workflow.png
workflow-color-raw8.png
workflow-matte-raw8.png
workflow-paint-raw8.png
workflow-opaque-raw8.png
workflow-transparent-raw8.png
workflow-fuzz8.png
workflow-blue-channel8.png
workflow-mismatch8.png
workflow-null8.png
metrics.json
cases=9 deprecations=18 mismatch-unchanged=1 null-equal=1 source-unchanged=1
Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.