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

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

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

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

Глава 323 · От первого цвета до проверенной маски

ImagickPixel, PixelIterator и ImagickKernel: цвет, область и morphology

Полный официальный блок: 3 класса и 41 API — от шкал цвета и alpha до region iterator, syncIterator и реального применения kernel к маске.

Маршрут: от одного цвета до фильтра по окрестности

Задача начинается с результата: прочитать цвет логотипа, перекрасить прямоугольник или расширить белую маску. Для одного значения нужен ImagickPixel; для строк изображения — PixelIterator; для решения по соседям — ImagickKernel.

Что выбрать
  1. Один цвет → создаём ImagickPixel, выбираем шкалу и читаем результат getter.
  2. Область изображения → задаём region/строку, меняем pixel-wand и синхронизируем каждую изменённую строку.
  3. Форма вокруг пикселя → строим kernel с origin, применяем morphology к маске и сохраняем PNG.

ImagickPixel: цвет, а не точка на холсте

Объект хранит каналы цвета и служебные поля. Координаты x/y принадлежат месту, откуда объект получен. Если getImagePixelColor вернул отдельное значение, его setColor сам по себе не обязан изменить исходный cache; для массового редактирования используют iterator.

СвойствоЧто означаетЧем не является
RGBA/HSLкомпоненты одного цветакоординатами
colorCountчастотой histogram-записичислом всех цветов
indexиндексом/служебным каналомномером строки или столбца

Первый безопасный шаг — создать цвет, прочитать его в одной шкале и проверить диапазоны. Затем тот же pixel становится фоном видимого PNG-образца.

Начинаем с цвета: что хранится в ImagickPixel

Представьте настройку цвета кнопки или фона карточки товара. Сайт получает #336699, а обработчику нужны отдельные красный, зелёный и синий каналы. ImagickPixel переводит запись цвета в значения, с которыми можно работать.

Образец синего цвета #336699
Цвет #336699: RGB (51,102,153). Вспомогательная иллюстрация ImageMagick CLI; это не отчёт о выполнении PHP-примера.

В RGB три канала: R — красный, G — зелёный, B — синий. В записи #336699 пары 33,66,99 — шестнадцатеричная запись чисел 51,102,153. Alpha — отдельный канал прозрачности; этот непрозрачный пример его не использует.

Первый шаг: получить три числа из цветаПример для указанного окружения
<?php
declare(strict_types=1);

$color = new ImagickPixel('#336699');
        $rgb = $color->getColor(0);
        echo $rgb['r'], ', ', $rgb['g'], ', ', $rgb['b'], PHP_EOL;
        $color->clear();

При доступном Imagick ожидается строка 51, 102, 153. Это состав цвета: красный канал 51, зелёный 102, синий 153. Код не меняет картинку и не создаёт файл. Проверен синтаксис; нативный запуск здесь не заявлен.

ЗаписьЧто происходит
new ImagickPixel(...)Создаём объект одного цвета; переменная $color хранит ссылку на него.
$color->getColor(0)Вызываем метод у этого объекта. Целое 0 выбирает RGB 0…255; результатом будет массив.
$rgb['r']Читаем значение по ключу r; g и b обозначают два других канала.
clear()Освобождаем состояние временного цвета после использования.

Если запись объекта или массива пока незнакома: класс и объект, массивы. Здесь важно различить: объект цвета сам по себе ещё не имеет места на изображении; чтобы изменить изображение, нужен следующий шаг.

Три шкалы цвета: 0…255, 0…1 и quantum

getColor(0) возвращает RGB 0…255 и грубый alpha 0/1; getColor(1) — нормализованные float 0…1; getColor(2) — RGBA 0…255. Quantum-методы используют реальную глубину сборки.

ШкалаКогда удобнаПроверка
0…1бизнес-правила, пороги, перенос между Q8/Q16каждый канал в диапазоне
0…255интерфейс и знакомая RGB-записьне выдавать за полную точность Q16
0…Imagick::getQuantum()точная работа в текущей сборкеint без HDRI, возможен float с HDRI

Alpha и opacity читают только с явно названной константой. Их исторические представления могут быть инверсными в разных контекстах ImageMagick; примеры проверяют выбранный канал round-trip, а не угадывают его по слову.

PixelIterator: строки, region и обязательная синхронизация

Iterator похож на окно в pixel cache. Он отдаёт массив объектов строки. y — позиция iterator; x — индекс элемента внутри строки. Region iterator видит только заданный прямоугольник.

Изменение прямоугольника
  1. Проверяем x, y, width, height относительно размеров изображения.
  2. Получаем iterator или region iterator.
  3. Меняем pixel-wand объектов текущей строки.
  4. Сразу вызываем syncIterator() для этой изменённой строки.
  5. Читаем контрольный пиксель из Imagick и записываем итоговый PNG.

От цвета к изображению: где находится пиксель и когда он изменяется

Изображение можно представить таблицей цветных клеток. Ширина 6 и высота 4 дают 24 клетки. Координаты начинаются с нуля: x идёт слева направо, y — сверху вниз. Точка (2,1) — третья клетка второй строки. В отличие от простого массива, данные картинки хранятся в ImageMagick; iterator предоставляет доступ по строкам.

Сетка 6 на 4: одна синяя клетка в третьем столбце второй строки
Ожидаемый вид changed-pixel.png, увеличенный в 60 раз без размытия; файл примера остаётся 6×4. Вспомогательная иллюстрация ImageMagick CLI; это не отчёт о выполнении PHP-примера.
Путь изменения
  1. Создаём белый холст 6×4.
  2. Внешний foreach выбирает строку y, внутренний — цвет в столбце x.
  3. В точке (2,1) вызываем setColor. После внутреннего цикла syncIterator передаёт текущую строку обратно изображению.
  4. writeImage записывает новое состояние в PNG. До этого вызова файла на диске ещё нет.
Второй шаг: изменить один пиксель и сохранить PNGПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
        $image->newImage(6, 4, 'white', 'png');
        $iterator = $image->getPixelIterator();
        foreach ($iterator as $y => $row) {
            foreach ($row as $x => $pixel) {
                if ($x === 2 && $y === 1) {
                    $pixel->setColor('#336699');
                }
            }
            $iterator->syncIterator();
        }
        $image->writeImage(__DIR__ . '/changed-pixel.png');
        echo 'changed-pixel.png', PHP_EOL;
        $iterator->clear();
        $image->clear();

При успешном запуске рядом со скриптом появится changed-pixel.png размером 6×4: 23 белых пикселя и один синий в точке (2,1). Консоль напечатает имя файла. Каталог скрипта должен разрешать запись. Это учебный минимум; ниже карточка syncIterator() показывает чтение результата и проверку записи. Проверен синтаксис, выполнение PHP Imagick отложено.

Здесь === проверяет точное равенство координаты, && требует совпадения обеих координат; => в foreach разделяет ключ и значение. Как работает foreach. Отдельно полученный цвет через getImagePixelColor — снимок значения; его изменение не следует считать редактированием исходного холста. Для редактирования здесь используются пиксели iterator и фиксация каждой строки.

Почему фабричные методы проверяются по версии и возвращаемому значению

В frozen PHP Manual для newPixelIterator() указано : bool. Для newPixelRegionIterator() сигнатура тоже : bool, но return-текст обещает новый ImagickPixelIterator. Это внутреннее противоречие upstream-документации, а не повод выдумывать один результат.

Эти два метода помечены устаревшими в актуальной реализации Imagick: они переинициализируют текущий iterator и возвращают bool. Проверка объекта оставлена как защитная совместимость с противоречивым описанием, а не обещание реального возврата объекта. Для нового кода используйте конструктор, Imagick::getPixelIterator или Imagick::getPixelRegionIterator. При обходе region отсчёт строки ведётся относительно области, начиная с нуля.

ImagickKernel: матрица, origin и видимый эффект

Kernel накладывается на окрестность каждого пикселя. Float задаёт вклад позиции, false исключает её. Для нечётной ширины и высоты origin по умолчанию находится в центре. Для любого чётного размера origin нужно передать явно как [x, y].

МатрицаСмыслПрактика
крест из 1.0 и falseучаствуют центр и четыре соседарасширение/сжатие бинарной маски
disk/diamond builtinстандартная форма с параметром радиусаконтур, закрытие разрыва, маска
веса с отрицательными числамиconvolution/sharpenпроверять normalization и clipping

Карточки не ограничиваются печатью матрицы: каждый kernel применяется к программно созданной чёрно-белой маске, сохраняется PNG, а histogram даёт число светлых пикселей до и после.

Операция по соседям: зачем нужна маска и ядро

Например, перед распознаванием текста надо немного утолстить светлые штрихи. Маска — отдельное изображение, в котором белое выделяет нужную область, а чёрное — фон. Не надо писать вложенные проверки всех соседей вручную: ядро задаёт форму соседства, а операция dilation расширяет белые области по этой форме.

До обработки: одна белая клетка в центре чёрной сетки 5 на 5
Входная маска: одна белая точка. Вспомогательная иллюстрация ImageMagick CLI; это не отчёт о выполнении PHP-примера.
После обработки: белый крест из пяти клеток
После Dilate с Diamond:1: белый крест из пяти точек. Вспомогательная иллюстрация ImageMagick CLI; это не отчёт о выполнении PHP-примера.
Третий шаг: расширить точку до крестаПример для указанного окружения
<?php
declare(strict_types=1);

$mask = new Imagick(__DIR__ . '/mask.pgm');
        $kernel = ImagickKernel::fromBuiltIn(Imagick::KERNEL_DIAMOND, '1');
        $mask->morphology(Imagick::MORPHOLOGY_DILATE, 1, $kernel);
        $mask->writeImage(__DIR__ . '/expanded-mask.png');
        echo 'expanded-mask.png', PHP_EOL;
        $mask->clear();

Архив уже содержит mask.pgm: чёрное изображение 5×5 с одной белой точкой в центре. При успешном запуске expanded-mask.png получит пять белых точек в форме креста: центр и его четыре соседа. Нужны Imagick с Kernel, поддержка PGM/PNG и право записи в каталог. Проверен синтаксис; PHP-результат пока не выполнен локально.

Часть вызоваЗачем нужна
fromBuiltIn(KERNEL_DIAMOND, '1')Готовое ромбовидное соседство радиуса 1: центр, верх, низ, лево и право.
MORPHOLOGY_DILATEПравило обработки: распространяем светлые области по соседству. Само ядро картинку не меняет.
1 в morphologyКоличество повторений операции; больше повторений расширяет область дальше.

Операцию применяют к маске осознанно: рядом расположенные области могут слиться, а мелкие детали — потеряться. Для закрытия небольших разрывов есть Close, для сужения — Erode. Ниже разобраны собственные матрицы, смещённый центр и отличие свёртки от операций над формой. Как читать двумерный массив пригодится при записи своей матрицы.

Стоимость и выбор более крупной операции

Построчный PHP-обход выполняет PHP-вызов на множество пикселей. Для простой заливки прямоугольника ImagickDraw, colorize/opaquePaint или morphology обычно выражают задачу яснее. Iterator нужен, когда решение действительно зависит от каждого значения или сложного пользовательского правила.

  • Ограничивайте width × height и region до обхода.
  • Сначала пробуйте операцию уровня изображения, затем iterator.
  • Kernel большего радиуса читает больше соседей; измеряйте на реальном лимите изображения.
  • Не храните все строки/pixel объекты в PHP-массиве после прохода.

Создать и освободить цвет

ImagickPixel хранит описание одного цвета. Сам по себе он не является координатой и не меняет исходное изображение.

Прочитать каналы без догадок о шкале

Один цвет можно читать как 0…255, нормализованные 0…1 или quantum текущей сборки. Шкалу всегда фиксируют рядом со значением.

Изменить канал и проверить чтением

Setter сообщает, принят ли вызов; полезный эффект подтверждают парным getter и, когда это уместно, записанным образцом PNG.

Отличить цвет от индекса и частоты

colorCount — частота цвета в histogram, index — индекс/служебный канал. Ни одно из них не является номером x/y пикселя.

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

Fuzz — часть правила сравнения. Без выбранной шкалы и проверенных примеров слово «похожий» не имеет воспроизводимого смысла.

Открыть полный холст или ограниченную область

Iterator отдаёт строки живых pixel-wand объектов. Region iterator ограничивает работу прямоугольником и снижает число обходов.

Перемещаться по строкам и сохранять изменения

Курсор строки и координата пикселя — разные величины. После изменения любой строки нужен syncIterator().

Описать окрестность числами

Kernel — матрица float/false с origin. Число задаёт вклад соседа, false исключает позицию.

Собрать и применить фильтр

Список ядер можно связывать, масштабировать и разделять; смысл проверяют реальной morphology/filter операцией на маске.

Перед production: что ещё обязательно доказать

До обработкиПосле обработкиЧего lint не доказывает
лимит width × height, allowlist формата, проверка geometry regionконтрольный pixel/histogram, непустой файл, повторный decodeналичие методов/констант и поведение ImageMagick версии
resource policy и timeout workerMIME по содержимому, атомарное перемещениеQ8/Q16/HDRI числа, визуальный эффект morphology

Примеры в этой главе проверены синтаксически. Для запуска установите совместимые Imagick и ImageMagick; наличие PNG-кодера и поведение методов зависят от сборки. Показанные изображения — отдельно подготовленные CLI-иллюстрации, а не подтверждение выполнения PHP.

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

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

ImagickKernel::addKernelприменить несколько связанных ядер одной операцией

доступно: PECL imagick >= 3.3.0 · imagick

ImagickKernel::addKernel(ImagickKernel $ImagickKernel): void

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

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickKernel::addKernel(ImagickKernel $ImagickKernel): void.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickKernel::addKernel(ImagickKernel $ImagickKernel): void

ПараметрТипСмысл
$ImagickKernelImagickKernelВторое ядро, присоединяемое к linked list.

Возвращает. Официальная страница не формулирует отдельный return-текст; точный тип берём из сигнатуры.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: список ядер отличается от арифметического сложения матриц.

Когда выбрать другое. несколько явных morphology-вызовов.

Минимум: применить несколько связанных ядер одной операциейПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
function brightPixels(Imagick $image): int {
    $total = 0;
    foreach ($image->getImageHistogram() as $color) {
        $rgb = $color->getColor(1);
        if ($rgb['r'] > 0.8 && $rgb['g'] > 0.8 && $rgb['b'] > 0.8) { $total += $color->getColorCount(); }
    }
    return $total;
}
$mask = new Imagick();
$mask->newImage(9, 9, new ImagickPixel('black'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white'));
$draw->rectangle(3, 3, 5, 5);
$mask->drawImage($draw);
$draw->clear();
$before = brightPixels($mask);
$kernel = ImagickKernel::fromBuiltIn(Imagick::KERNEL_DISK, '1');
$second = ImagickKernel::fromBuiltIn(Imagick::KERNEL_DIAMOND, '1');
$kernel->addKernel($second);
$linked = $kernel->separate();
if (!is_array($linked) || count($linked) !== 2) { throw new RuntimeException('Ожидались два связанных ядра'); }
$matrix = $kernel->getMatrix();
if (!is_array($matrix) || $matrix === []) { throw new RuntimeException('Пустая матрица'); }
$result = clone $mask;
$accepted = $result->morphology(Imagick::MORPHOLOGY_DILATE, 1, $kernel);
if ($accepted !== true) { throw new RuntimeException('Morphology не выполнена'); }
$after = brightPixels($result);
$path = $outDir . '/kernel-addkernel-minimal.png';
if (!$result->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Результат morphology не записан'); }
echo json_encode(['matrix' => $matrix, 'before_white' => $before, 'after_white' => $after, 'file' => basename($path)], JSON_THROW_ON_ERROR), PHP_EOL;
$result->clear();
$mask->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
function brightPixels(Imagick $image): int {
    $total = 0;
    foreach ($image->getImageHistogram() as $color) {
        $rgb = $color->getColor(1);
        if ($rgb['r'] > 0.8 && $rgb['g'] > 0.8 && $rgb['b'] > 0.8) { $total += $color->getColorCount(); }
    }
    return $total;
}
$mask = new Imagick();
$mask->newImage(13, 9, new ImagickPixel('black'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white'));
$draw->rectangle(5, 2, 7, 6);
$draw->setFillColor(new ImagickPixel('black'));
$draw->rectangle(6, 4, 6, 4);
$mask->drawImage($draw);
$draw->clear();
$gapBefore = $mask->getImagePixelColor(6, 4)->getColorValue(Imagick::COLOR_RED);
$before = brightPixels($mask);
$kernel = ImagickKernel::fromBuiltIn(Imagick::KERNEL_DISK, '1');
$second = ImagickKernel::fromMatrix([[0.0, 1.0, 0.0], [1.0, 1.0, 1.0], [0.0, 1.0, 0.0]]);
$kernel->addKernel($second);
$linked = $kernel->separate();
if (!is_array($linked) || count($linked) !== 2) { throw new RuntimeException('Ожидались два связанных ядра'); }
$matrix = $kernel->getMatrix();
if (!is_array($matrix) || $matrix === []) { throw new RuntimeException('Пустая матрица'); }
$result = clone $mask;
$accepted = $result->morphology(Imagick::MORPHOLOGY_CLOSE, 1, $kernel);
if ($accepted !== true) { throw new RuntimeException('Morphology не выполнена'); }
$after = brightPixels($result);
$gapAfter = $result->getImagePixelColor(6, 4)->getColorValue(Imagick::COLOR_RED);
if ($gapBefore > 0.01 || $gapAfter < 0.95 || $after <= $before) { throw new RuntimeException('Отверстие в маске не закрыто'); }
$path = $outDir . '/kernel-addkernel-workflow.png';
if (!$result->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Результат morphology не записан'); }
echo json_encode(['matrix' => $matrix, 'before_white' => $before, 'after_white' => $after, 'file' => basename($path)], JSON_THROW_ON_ERROR), PHP_EOL;
$result->clear();
$mask->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickKernel::addUnityKernel, ImagickKernel::scale, ImagickKernel::separate.

ImagickKernel::addUnityKernelподмешать исходный пиксель к blur/sharpen ядру

доступно: PECL imagick >= 3.3.0 · imagick

ImagickKernel::addUnityKernel(float $scale): void

Потребность. подмешать исходный пиксель к blur/sharpen ядру.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickKernel::addUnityKernel(float $scale): void.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickKernel::addUnityKernel(float $scale): void

ПараметрТипСмысл
$scalefloatКоэффициент масштаба или доля unity — по методу.

Возвращает. Официальная страница не формулирует отдельный return-текст; точный тип берём из сигнатуры.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: после изменения может понадобиться повторная normalization.

Когда выбрать другое. явная матрица с центральным коэффициентом.

Минимум: подмешать исходный пиксель к blur/sharpen ядруПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
function brightPixels(Imagick $image): int {
    $total = 0;
    foreach ($image->getImageHistogram() as $color) {
        $rgb = $color->getColor(1);
        if ($rgb['r'] > 0.8 && $rgb['g'] > 0.8 && $rgb['b'] > 0.8) { $total += $color->getColorCount(); }
    }
    return $total;
}
$mask = new Imagick();
$mask->newImage(9, 9, new ImagickPixel('black'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white'));
$draw->rectangle(3, 3, 5, 5);
$mask->drawImage($draw);
$draw->clear();
$before = brightPixels($mask);
$kernel = ImagickKernel::fromMatrix([[-1.0, 0.0, -1.0], [0.0, 4.0, 0.0], [-1.0, 0.0, -1.0]]);
$kernel->scale(1.0, Imagick::NORMALIZE_KERNEL_VALUE);
$kernel->addUnityKernel(0.5);
$matrix = $kernel->getMatrix();
$result = clone $mask;
$accepted = $result->morphology(Imagick::MORPHOLOGY_CONVOLVE, 1, $kernel);
if ($accepted !== true) { throw new RuntimeException('Morphology не выполнена'); }
$after = brightPixels($result);
$path = $outDir . '/kernel-addunitykernel-minimal.png';
if (!$result->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Результат morphology не записан'); }
echo json_encode(['matrix' => $matrix, 'before_white' => $before, 'after_white' => $after, 'file' => basename($path)], JSON_THROW_ON_ERROR), PHP_EOL;
$result->clear();
$mask->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
function brightPixels(Imagick $image): int {
    $total = 0;
    foreach ($image->getImageHistogram() as $color) {
        $rgb = $color->getColor(1);
        if ($rgb['r'] > 0.8 && $rgb['g'] > 0.8 && $rgb['b'] > 0.8) { $total += $color->getColorCount(); }
    }
    return $total;
}
$mask = new Imagick();
$mask->newImage(13, 9, new ImagickPixel('black'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white'));
$draw->rectangle(5, 2, 7, 6);
$draw->setFillColor(new ImagickPixel('black'));
$draw->rectangle(6, 4, 6, 4);
$mask->drawImage($draw);
$draw->clear();
$gapBefore = $mask->getImagePixelColor(6, 4)->getColorValue(Imagick::COLOR_RED);
$before = brightPixels($mask);
$kernel = ImagickKernel::fromMatrix([[-1.0, 0.0, -1.0], [0.0, 4.0, 0.0], [-1.0, 0.0, -1.0]]);
$kernel->scale(1.0, Imagick::NORMALIZE_KERNEL_VALUE);
$kernel->addUnityKernel(1.0);
$kernel->scale(1.0, Imagick::NORMALIZE_KERNEL_VALUE);
$matrix = $kernel->getMatrix();
$result = clone $mask;
$accepted = $result->morphology(Imagick::MORPHOLOGY_CONVOLVE, 1, $kernel);
if ($accepted !== true) { throw new RuntimeException('Morphology не выполнена'); }
$after = brightPixels($result);
$path = $outDir . '/kernel-addunitykernel-workflow.png';
if (!$result->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Результат morphology не записан'); }
echo json_encode(['matrix' => $matrix, 'before_white' => $before, 'after_white' => $after, 'file' => basename($path)], JSON_THROW_ON_ERROR), PHP_EOL;
$result->clear();
$mask->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickKernel::addKernel, ImagickKernel::scale, ImagickKernel::separate.

ImagickKernel::fromBuiltInполучить disk/diamond/gaussian без ручной матрицы

доступно: PECL imagick >= 3.3.0 · imagick

ImagickKernel::fromBuiltin(int $kernelType, string $kernelString): ImagickKernel

Потребность. получить disk/diamond/gaussian без ручной матрицы.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickKernel::fromBuiltin(int $kernelType, string $kernelString): ImagickKernel.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickKernel::fromBuiltin(int $kernelType, string $kernelString): ImagickKernel

ПараметрТипСмысл
$kernelTypeintКонстанта Imagick::KERNEL_*.
Формулировка PHP Manual

The type of kernel to build e.g. \Imagick::KERNEL_DIAMOND

$kernelStringstringПараметры built-in kernel в синтаксисе ImageMagick.
Формулировка PHP Manual

A string that describes the parameters e.g. "4,2.5"

Возвращает. Официальная страница не формулирует отдельный return-текст; точный тип берём из сигнатуры.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: kernelString — синтаксис ImageMagick, его проверяют на своей версии.

Когда выбрать другое. fromMatrix для точной матрицы.

Минимум: получить disk/diamond/gaussian без ручной матрицыПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
function brightPixels(Imagick $image): int {
    $total = 0;
    foreach ($image->getImageHistogram() as $color) {
        $rgb = $color->getColor(1);
        if ($rgb['r'] > 0.8 && $rgb['g'] > 0.8 && $rgb['b'] > 0.8) { $total += $color->getColorCount(); }
    }
    return $total;
}
$mask = new Imagick();
$mask->newImage(9, 9, new ImagickPixel('black'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white'));
$draw->rectangle(3, 3, 5, 5);
$mask->drawImage($draw);
$draw->clear();
$before = brightPixels($mask);
$kernel = ImagickKernel::fromBuiltIn(Imagick::KERNEL_DISK, '1');
$matrix = $kernel->getMatrix();
if (!is_array($matrix) || $matrix === []) { throw new RuntimeException('Пустая матрица'); }
$result = clone $mask;
$accepted = $result->morphology(Imagick::MORPHOLOGY_DILATE, 1, $kernel);
if ($accepted !== true) { throw new RuntimeException('Morphology не выполнена'); }
$after = brightPixels($result);
$path = $outDir . '/kernel-frombuiltin-minimal.png';
if (!$result->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Результат morphology не записан'); }
echo json_encode(['matrix' => $matrix, 'before_white' => $before, 'after_white' => $after, 'file' => basename($path)], JSON_THROW_ON_ERROR), PHP_EOL;
$result->clear();
$mask->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
function brightPixels(Imagick $image): int {
    $total = 0;
    foreach ($image->getImageHistogram() as $color) {
        $rgb = $color->getColor(1);
        if ($rgb['r'] > 0.8 && $rgb['g'] > 0.8 && $rgb['b'] > 0.8) { $total += $color->getColorCount(); }
    }
    return $total;
}
$mask = new Imagick();
$mask->newImage(13, 9, new ImagickPixel('black'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white'));
$draw->rectangle(5, 2, 7, 6);
$draw->setFillColor(new ImagickPixel('black'));
$draw->rectangle(6, 4, 6, 4);
$mask->drawImage($draw);
$draw->clear();
$gapBefore = $mask->getImagePixelColor(6, 4)->getColorValue(Imagick::COLOR_RED);
$before = brightPixels($mask);
$kernel = ImagickKernel::fromBuiltIn(Imagick::KERNEL_DIAMOND, '2');
$matrix = $kernel->getMatrix();
if (!is_array($matrix) || $matrix === []) { throw new RuntimeException('Пустая матрица'); }
$result = clone $mask;
$accepted = $result->morphology(Imagick::MORPHOLOGY_CLOSE, 1, $kernel);
if ($accepted !== true) { throw new RuntimeException('Morphology не выполнена'); }
$after = brightPixels($result);
$gapAfter = $result->getImagePixelColor(6, 4)->getColorValue(Imagick::COLOR_RED);
if ($gapBefore > 0.01 || $gapAfter < 0.95 || $after <= $before) { throw new RuntimeException('Отверстие в маске не закрыто'); }
$path = $outDir . '/kernel-frombuiltin-workflow.png';
if (!$result->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Результат morphology не записан'); }
echo json_encode(['matrix' => $matrix, 'before_white' => $before, 'after_white' => $after, 'file' => basename($path)], JSON_THROW_ON_ERROR), PHP_EOL;
$result->clear();
$mask->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickKernel::fromMatrix, ImagickKernel::getMatrix.

ImagickKernel::fromMatrixявно описать веса и пропущенные позиции

доступно: PECL imagick >= 3.3.0 · imagick

ImagickKernel::fromMatrix(array $matrix, array $origin = ?): ImagickKernel

Потребность. явно описать веса и пропущенные позиции.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickKernel::fromMatrix(array $matrix, array $origin = ?): ImagickKernel.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickKernel::fromMatrix(array $matrix, array $origin = ?): ImagickKernel

ПараметрТипСмысл
$matrixarrayПрямоугольный двумерный массив float/false.
$originarray; необязательный[x, y] центральной позиции; обязателен для чётного размера.

Возвращает. The generated ImagickKernel.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: нечётная матрица получает центр автоматически, чётной нужен origin.

Когда выбрать другое. fromBuiltin для стандартной формы.

Минимум: явно описать веса и пропущенные позицииПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
function brightPixels(Imagick $image): int {
    $total = 0;
    foreach ($image->getImageHistogram() as $color) {
        $rgb = $color->getColor(1);
        if ($rgb['r'] > 0.8 && $rgb['g'] > 0.8 && $rgb['b'] > 0.8) { $total += $color->getColorCount(); }
    }
    return $total;
}
$mask = new Imagick();
$mask->newImage(9, 9, new ImagickPixel('black'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white'));
$draw->rectangle(3, 3, 5, 5);
$mask->drawImage($draw);
$draw->clear();
$before = brightPixels($mask);
$matrixInput = [[false, 1.0, false], [1.0, 1.0, 1.0], [false, 1.0, false]];
$kernel = ImagickKernel::fromMatrix($matrixInput);
$matrix = $kernel->getMatrix();
if (!is_array($matrix) || $matrix === []) { throw new RuntimeException('Пустая матрица'); }
$result = clone $mask;
$accepted = $result->morphology(Imagick::MORPHOLOGY_DILATE, 1, $kernel);
if ($accepted !== true) { throw new RuntimeException('Morphology не выполнена'); }
$after = brightPixels($result);
$path = $outDir . '/kernel-frommatrix-minimal.png';
if (!$result->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Результат morphology не записан'); }
echo json_encode(['matrix' => $matrix, 'before_white' => $before, 'after_white' => $after, 'file' => basename($path)], JSON_THROW_ON_ERROR), PHP_EOL;
$result->clear();
$mask->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
function brightPixels(Imagick $image): int {
    $total = 0;
    foreach ($image->getImageHistogram() as $color) {
        $rgb = $color->getColor(1);
        if ($rgb['r'] > 0.8 && $rgb['g'] > 0.8 && $rgb['b'] > 0.8) { $total += $color->getColorCount(); }
    }
    return $total;
}
$mask = new Imagick();
$mask->newImage(13, 9, new ImagickPixel('black'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white'));
$draw->rectangle(5, 2, 7, 6);
$draw->setFillColor(new ImagickPixel('black'));
$draw->rectangle(6, 4, 6, 4);
$mask->drawImage($draw);
$draw->clear();
$gapBefore = $mask->getImagePixelColor(6, 4)->getColorValue(Imagick::COLOR_RED);
$before = brightPixels($mask);
$matrixInput = [[1.0, 0.5], [false, 1.0]];
$kernel = ImagickKernel::fromMatrix($matrixInput, [0, 0]);
$matrix = $kernel->getMatrix();
if (!is_array($matrix) || $matrix === []) { throw new RuntimeException('Пустая матрица'); }
$result = clone $mask;
$accepted = $result->morphology(Imagick::MORPHOLOGY_CLOSE, 1, $kernel);
if ($accepted !== true) { throw new RuntimeException('Morphology не выполнена'); }
$after = brightPixels($result);
$gapAfter = $result->getImagePixelColor(6, 4)->getColorValue(Imagick::COLOR_RED);
if ($gapBefore > 0.01 || $gapAfter < 0.95 || $after <= $before) { throw new RuntimeException('Отверстие в маске не закрыто'); }
$path = $outDir . '/kernel-frommatrix-workflow.png';
if (!$result->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Результат morphology не записан'); }
echo json_encode(['matrix' => $matrix, 'before_white' => $before, 'after_white' => $after, 'file' => basename($path)], JSON_THROW_ON_ERROR), PHP_EOL;
$result->clear();
$mask->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickKernel::fromBuiltIn, ImagickKernel::getMatrix.

ImagickKernel::getMatrixпроинспектировать фактические float/false перед фильтром

доступно: PECL imagick >= 3.3.0 · imagick

ImagickKernel::getMatrix(): array

Потребность. проинспектировать фактические float/false перед фильтром.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickKernel::getMatrix(): array.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickKernel::getMatrix(): array

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. A matrix (2d array) of the values that represent the kernel.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: матрица показывает веса, но не доказывает эффект на изображении.

Когда выбрать другое. применить morphology к тестовой маске.

В первом примере крест из положительных значений расширяет белую маску. Во втором отрицательные веса выделяют перепады яркости через CONVOLVE — свёртку: значения соседей умножаются на веса и складываются. Это другая операция, чем CLOSE, которая закрывает маленькие отверстия в форме. В сборке без HDRI отрицательные результаты могут обрезаться до нуля; для измерений нельзя считать такой PNG полным набором исходных чисел.

Минимум: проинспектировать фактические float/false перед фильтромПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
function brightPixels(Imagick $image): int {
    $total = 0;
    foreach ($image->getImageHistogram() as $color) {
        $rgb = $color->getColor(1);
        if ($rgb['r'] > 0.8 && $rgb['g'] > 0.8 && $rgb['b'] > 0.8) { $total += $color->getColorCount(); }
    }
    return $total;
}
$mask = new Imagick();
$mask->newImage(9, 9, new ImagickPixel('black'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white'));
$draw->rectangle(3, 3, 5, 5);
$mask->drawImage($draw);
$draw->clear();
$before = brightPixels($mask);
$kernel = ImagickKernel::fromMatrix([[false, 1.0, false], [1.0, 1.0, 1.0], [false, 1.0, false]]);
$matrix = $kernel->getMatrix();
if (!is_array($matrix) || count($matrix) < 2 || !is_array($matrix[0])) { throw new RuntimeException('Матрица не прочитана'); }
$result = clone $mask;
$accepted = $result->morphology(Imagick::MORPHOLOGY_DILATE, 1, $kernel);
if ($accepted !== true) { throw new RuntimeException('Morphology не выполнена'); }
$after = brightPixels($result);
$path = $outDir . '/kernel-getmatrix-minimal.png';
if (!$result->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Результат morphology не записан'); }
echo json_encode(['matrix' => $matrix, 'before_white' => $before, 'after_white' => $after, 'file' => basename($path)], JSON_THROW_ON_ERROR), PHP_EOL;
$result->clear();
$mask->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
function brightPixels(Imagick $image): int {
    $total = 0;
    foreach ($image->getImageHistogram() as $color) {
        $rgb = $color->getColor(1);
        if ($rgb['r'] > 0.8 && $rgb['g'] > 0.8 && $rgb['b'] > 0.8) { $total += $color->getColorCount(); }
    }
    return $total;
}
$mask = new Imagick();
$mask->newImage(13, 9, new ImagickPixel('black'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white'));
$draw->rectangle(5, 2, 7, 6);
$draw->setFillColor(new ImagickPixel('black'));
$draw->rectangle(6, 4, 6, 4);
$mask->drawImage($draw);
$draw->clear();
$gapBefore = $mask->getImagePixelColor(6, 4)->getColorValue(Imagick::COLOR_RED);
$before = brightPixels($mask);
$kernel = ImagickKernel::fromMatrix([[1.0, -1.0], [false, 1.0]], [1, 1]);
$matrix = $kernel->getMatrix();
if (!is_array($matrix) || count($matrix) < 2 || !is_array($matrix[0])) { throw new RuntimeException('Матрица не прочитана'); }
$result = clone $mask;
$accepted = $result->morphology(Imagick::MORPHOLOGY_CONVOLVE, 1, $kernel);
if ($accepted !== true) { throw new RuntimeException('Morphology не выполнена'); }
$after = brightPixels($result);
$path = $outDir . '/kernel-getmatrix-workflow.png';
if (!$result->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Результат morphology не записан'); }
echo json_encode(['matrix' => $matrix, 'before_white' => $before, 'after_white' => $after, 'file' => basename($path)], JSON_THROW_ON_ERROR), PHP_EOL;
$result->clear();
$mask->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickKernel::fromBuiltIn, ImagickKernel::fromMatrix.

ImagickKernel::scaleмасштабировать веса с выбранной normalization

доступно: PECL imagick >= 3.3.0 · imagick

ImagickKernel::scale(float $scale, int $normalizeFlag = ?): void

Потребность. масштабировать веса с выбранной normalization.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickKernel::scale(float $scale, int $normalizeFlag = ?): void.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickKernel::scale(float $scale, int $normalizeFlag = ?): void

ПараметрТипСмысл
$scalefloatКоэффициент масштаба или доля unity — по методу.
$normalizeFlagint; необязательныйОдна из Imagick::NORMALIZE_KERNEL_*.
Формулировка PHP Manual

Imagick::NORMALIZE_KERNEL_NONE Imagick::NORMALIZE_KERNEL_VALUE Imagick::NORMALIZE_KERNEL_CORRELATE Imagick::NORMALIZE_KERNEL_PERCENT

Возвращает. Официальная страница не формулирует отдельный return-текст; точный тип берём из сигнатуры.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: разные NORMALIZE_KERNEL_* меняют смысл суммы.

Когда выбрать другое. пересчитать матрицу вручную для учебной проверки.

Минимум: масштабировать веса с выбранной normalizationПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
function brightPixels(Imagick $image): int {
    $total = 0;
    foreach ($image->getImageHistogram() as $color) {
        $rgb = $color->getColor(1);
        if ($rgb['r'] > 0.8 && $rgb['g'] > 0.8 && $rgb['b'] > 0.8) { $total += $color->getColorCount(); }
    }
    return $total;
}
$mask = new Imagick();
$mask->newImage(9, 9, new ImagickPixel('black'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white'));
$draw->rectangle(3, 3, 5, 5);
$mask->drawImage($draw);
$draw->clear();
$before = brightPixels($mask);
$kernel = ImagickKernel::fromMatrix([[1.0, 1.0, 1.0], [1.0, 2.0, 1.0], [1.0, 1.0, 1.0]]);
$kernel->scale(1.0, Imagick::NORMALIZE_KERNEL_VALUE);
$matrix = $kernel->getMatrix();
$flat = array_merge(...$matrix);
$sum = array_sum(array_filter($flat, static fn ($v): bool => $v !== false));
if (!is_finite((float) $sum)) { throw new RuntimeException('Невалидная сумма ядра'); }
$result = clone $mask;
$accepted = $result->morphology(Imagick::MORPHOLOGY_CONVOLVE, 1, $kernel);
if ($accepted !== true) { throw new RuntimeException('Morphology не выполнена'); }
$after = brightPixels($result);
$path = $outDir . '/kernel-scale-minimal.png';
if (!$result->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Результат morphology не записан'); }
echo json_encode(['matrix' => $matrix, 'before_white' => $before, 'after_white' => $after, 'file' => basename($path)], JSON_THROW_ON_ERROR), PHP_EOL;
$result->clear();
$mask->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
function brightPixels(Imagick $image): int {
    $total = 0;
    foreach ($image->getImageHistogram() as $color) {
        $rgb = $color->getColor(1);
        if ($rgb['r'] > 0.8 && $rgb['g'] > 0.8 && $rgb['b'] > 0.8) { $total += $color->getColorCount(); }
    }
    return $total;
}
$mask = new Imagick();
$mask->newImage(13, 9, new ImagickPixel('black'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white'));
$draw->rectangle(5, 2, 7, 6);
$draw->setFillColor(new ImagickPixel('black'));
$draw->rectangle(6, 4, 6, 4);
$mask->drawImage($draw);
$draw->clear();
$gapBefore = $mask->getImagePixelColor(6, 4)->getColorValue(Imagick::COLOR_RED);
$before = brightPixels($mask);
$kernel = ImagickKernel::fromMatrix([[1.0, 1.0, 1.0], [1.0, 2.0, 1.0], [1.0, 1.0, 1.0]]);
$kernel->scale(0.5, Imagick::NORMALIZE_KERNEL_NONE);
$matrix = $kernel->getMatrix();
$flat = array_merge(...$matrix);
$sum = array_sum(array_filter($flat, static fn ($v): bool => $v !== false));
if (!is_finite((float) $sum)) { throw new RuntimeException('Невалидная сумма ядра'); }
$result = clone $mask;
$accepted = $result->morphology(Imagick::MORPHOLOGY_CONVOLVE, 1, $kernel);
if ($accepted !== true) { throw new RuntimeException('Morphology не выполнена'); }
$after = brightPixels($result);
$path = $outDir . '/kernel-scale-workflow.png';
if (!$result->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Результат morphology не записан'); }
echo json_encode(['matrix' => $matrix, 'before_white' => $before, 'after_white' => $after, 'file' => basename($path)], JSON_THROW_ON_ERROR), PHP_EOL;
$result->clear();
$mask->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickKernel::addKernel, ImagickKernel::addUnityKernel, ImagickKernel::separate.

ImagickKernel::separateразделить linked kernel list для диагностики

доступно: PECL imagick >= 3.3.0 · imagick

ImagickKernel::separate(): array

Потребность. разделить linked kernel list для диагностики.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickKernel::separate(): array.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickKernel::separate(): array

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Официальная страница не формулирует отдельный return-текст; точный тип берём из сигнатуры.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: возвращается массив ядер, не матрица.

Когда выбрать другое. getMatrix каждого элемента.

Минимум: разделить linked kernel list для диагностикиПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
function brightPixels(Imagick $image): int {
    $total = 0;
    foreach ($image->getImageHistogram() as $color) {
        $rgb = $color->getColor(1);
        if ($rgb['r'] > 0.8 && $rgb['g'] > 0.8 && $rgb['b'] > 0.8) { $total += $color->getColorCount(); }
    }
    return $total;
}
$mask = new Imagick();
$mask->newImage(9, 9, new ImagickPixel('black'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white'));
$draw->rectangle(3, 3, 5, 5);
$mask->drawImage($draw);
$draw->clear();
$before = brightPixels($mask);
$kernel = ImagickKernel::fromBuiltIn(Imagick::KERNEL_DISK, '1');
$second = ImagickKernel::fromBuiltIn(Imagick::KERNEL_DIAMOND, '1');
$kernel->addKernel($second);
$parts = $kernel->separate();
if (!is_array($parts) || count($parts) !== 2 || !$parts[0] instanceof ImagickKernel) { throw new RuntimeException('Список ядер не разделён'); }
$matrix = $parts[0]->getMatrix();
$result = clone $mask;
$accepted = $result->morphology(Imagick::MORPHOLOGY_DILATE, 1, $parts[0]);
if ($accepted !== true) { throw new RuntimeException('Morphology не выполнена'); }
$after = brightPixels($result);
$path = $outDir . '/kernel-separate-minimal.png';
if (!$result->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Результат morphology не записан'); }
echo json_encode(['matrix' => $matrix, 'before_white' => $before, 'after_white' => $after, 'file' => basename($path)], JSON_THROW_ON_ERROR), PHP_EOL;
$result->clear();
$mask->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
function brightPixels(Imagick $image): int {
    $total = 0;
    foreach ($image->getImageHistogram() as $color) {
        $rgb = $color->getColor(1);
        if ($rgb['r'] > 0.8 && $rgb['g'] > 0.8 && $rgb['b'] > 0.8) { $total += $color->getColorCount(); }
    }
    return $total;
}
$mask = new Imagick();
$mask->newImage(13, 9, new ImagickPixel('black'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white'));
$draw->rectangle(5, 2, 7, 6);
$draw->setFillColor(new ImagickPixel('black'));
$draw->rectangle(6, 4, 6, 4);
$mask->drawImage($draw);
$draw->clear();
$gapBefore = $mask->getImagePixelColor(6, 4)->getColorValue(Imagick::COLOR_RED);
$before = brightPixels($mask);
$kernel = ImagickKernel::fromBuiltIn(Imagick::KERNEL_DISK, '1');
$second = ImagickKernel::fromBuiltIn(Imagick::KERNEL_DIAMOND, '1');
$kernel->addKernel($second);
$parts = $kernel->separate();
if (!is_array($parts) || count($parts) !== 2 || !$parts[0] instanceof ImagickKernel) { throw new RuntimeException('Список ядер не разделён'); }
$matrix = $parts[0]->getMatrix();
$result = clone $mask;
$accepted = $result->morphology(Imagick::MORPHOLOGY_CLOSE, 1, $parts[0]);
if ($accepted !== true) { throw new RuntimeException('Morphology не выполнена'); }
$after = brightPixels($result);
$gapAfter = $result->getImagePixelColor(6, 4)->getColorValue(Imagick::COLOR_RED);
if ($gapBefore > 0.01 || $gapAfter < 0.95 || $after <= $before) { throw new RuntimeException('Отверстие в маске не закрыто'); }
$path = $outDir . '/kernel-separate-workflow.png';
if (!$result->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Результат morphology не записан'); }
echo json_encode(['matrix' => $matrix, 'before_white' => $before, 'after_white' => $after, 'file' => basename($path)], JSON_THROW_ON_ERROR), PHP_EOL;
$result->clear();
$mask->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickKernel::addKernel, ImagickKernel::addUnityKernel, ImagickKernel::scale.

ImagickPixel::clearосвободить временный объект цвета после чтения

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixel::clear(): bool

Потребность. освободить временный объект цвета после чтения.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::clear(): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::clear(): bool

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: после clear не используют старое состояние.

Когда выбрать другое. дать объекту выйти из области видимости.

Минимум: освободить временный объект цвета после чтенияПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$before = $pixel->getColor(1);
$accepted = $pixel->clear();
if ($accepted !== true) { throw new RuntimeException('Освобождение не подтверждено'); }
echo json_encode(['released' => true, 'before' => $before], JSON_THROW_ON_ERROR), PHP_EOL;

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$before = $pixel->getColor(1);
$accepted = $pixel->clear();
if ($accepted !== true) { throw new RuntimeException('Освобождение не подтверждено'); }
echo json_encode(['released' => true, 'before' => $before], JSON_THROW_ON_ERROR), PHP_EOL;
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::__construct, ImagickPixel::destroy.

ImagickPixel::__constructсоздать цвет фона, рамки или маски из строки

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixel::__construct(string $color = ?): mixed

Потребность. создать цвет фона, рамки или маски из строки.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::__construct(string $color = ?): mixed.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::__construct(string $color = ?): mixed

ПараметрТипСмысл
$colorstring; необязательныйСтрока цвета или константа канала — точный смысл виден из сигнатуры.
Формулировка PHP Manual

The optional color string to use as the initial value of this object.

Возвращает. Returns an ImagickPixel object on success, throwing ImagickPixelException on failure.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: невалидная строка приводит к ImagickPixelException.

Когда выбрать другое. получить pixel из уже декодированного Imagick.

Минимум: создать цвет фона, рамки или маски из строкиПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('#336699');
$rgba = $pixel->getColor(1);
if (!isset($rgba['r'], $rgba['g'], $rgba['b'], $rgba['a'])) { throw new RuntimeException('Цвет не создан'); }
echo json_encode(['value' => $rgba], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$pixel = new ImagickPixel('rgba(20, 80, 140, 0.65)');
$rgba = $pixel->getColor(1);
if (!isset($rgba['r'], $rgba['g'], $rgba['b'], $rgba['a'])) { throw new RuntimeException('Цвет не создан'); }
$swatch = new Imagick();
$swatch->newImage(64, 40, $pixel, 'png');
$path = $outDir . '/pixel-construct-workflow.png';
if (!$swatch->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('PNG не записан'); }
$swatch->clear();
$file = basename($path);
echo json_encode(['value' => $rgba, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::clear, ImagickPixel::destroy.

ImagickPixel::destroyявно завершить старый ресурсный объект

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixel::destroy(): bool

Потребность. явно завершить старый ресурсный объект.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::destroy(): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::destroy(): bool

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: destroy не заменяет проверку владельца объекта.

Когда выбрать другое. clear или естественное освобождение объекта.

Минимум: явно завершить старый ресурсный объектПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$before = $pixel->getColor(1);
$accepted = $pixel->destroy();
if ($accepted !== true) { throw new RuntimeException('Освобождение не подтверждено'); }
echo json_encode(['released' => true, 'before' => $before], JSON_THROW_ON_ERROR), PHP_EOL;

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$before = $pixel->getColor(1);
$accepted = $pixel->destroy();
if ($accepted !== true) { throw new RuntimeException('Освобождение не подтверждено'); }
echo json_encode(['released' => true, 'before' => $before], JSON_THROW_ON_ERROR), PHP_EOL;
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::clear, ImagickPixel::__construct.

ImagickPixel::getColorполучить сразу RGBA для ответа API

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixel::getColor(int $normalized = 0): array

Потребность. получить сразу RGBA для ответа API.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::getColor(int $normalized = 0): array.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::getColor(int $normalized = 0): array

ПараметрТипСмысл
$normalizedint; необязательныйРежим шкалы getColor: 0, 1 или 2; не смешивать результаты разных режимов.
Формулировка PHP Manual

Normalize the color values. Possible values are 0 , 1 or 2 . List of possible values for normalized normalized Description 0 The RGB values are returned as int s in the range 0 to 255 (inclusive.) The alpha value is returned as int and is either 0 or 1 . 1 The RGBA values are returned as float s in the range 0 to 1 (inclusive.) 2 The RGBA values are returned as int s in the range 0 to 255 (inclusive.)

По умолчанию: 0.

Возвращает. An array of channel values. Throws ImagickPixelException on error.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: режимы 0, 1 и 2 используют разные типы и диапазоны.

Когда выбрать другое. getColorValue для одного канала.

Минимум: получить сразу RGBA для ответа APIПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$value = $pixel->getColor(1);
if (!isset($value['r'], $value['g'], $value['b'], $value['a'])) { throw new RuntimeException('Нет RGBA'); }
foreach ($value as $channel) { if (!is_float($channel) || $channel < 0.0 || $channel > 1.0) { throw new RuntimeException('Ожидалась шкала 0..1'); } }
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$value = $pixel->getColor(2);
if (!isset($value['r'], $value['g'], $value['b'], $value['a'])) { throw new RuntimeException('Нет RGBA'); }
foreach ($value as $channel) { if (!is_int($channel) || $channel < 0 || $channel > 255) { throw new RuntimeException('Ожидалась шкала 0..255'); } }
$swatch = new Imagick();
$swatch->newImage(64, 40, $pixel, 'png');
$path = $outDir . '/pixel-getcolor-workflow.png';
if (!$swatch->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('PNG не записан'); }
$swatch->clear();
$file = basename($path);
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::getColorAsString, ImagickPixel::getColorQuantum, ImagickPixel::getColorValue, ImagickPixel::getColorValueQuantum.

ImagickPixel::getColorAsStringпоказать цвет человеку или записать диагностическую строку

доступно: PECL imagick 2 >= 2.1.0, PECL imagick 3 · imagick

ImagickPixel::getColorAsString(): string

Потребность. показать цвет человеку или записать диагностическую строку.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::getColorAsString(): string.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::getColorAsString(): string

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns the color of the ImagickPixel object as a string.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: формат строки зависит от ImageMagick и не годится как стабильный ключ.

Когда выбрать другое. нормализованный getColor плюс собственный JSON.

Минимум: показать цвет человеку или записать диагностическую строкуПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$value = $pixel->getColorAsString();
if ($value === '') { throw new RuntimeException('Пустое представление цвета'); }
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$value = $pixel->getColorAsString();
if ($value === '') { throw new RuntimeException('Пустое представление цвета'); }
$swatch = new Imagick();
$swatch->newImage(64, 40, $pixel, 'png');
$path = $outDir . '/pixel-getcolorasstring-workflow.png';
if (!$swatch->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('PNG не записан'); }
$swatch->clear();
$file = basename($path);
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::getColor, ImagickPixel::getColorQuantum, ImagickPixel::getColorValue, ImagickPixel::getColorValueQuantum.

ImagickPixel::getColorCountпрочитать частоту цвета из histogram

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixel::getColorCount(): int

Потребность. прочитать частоту цвета из histogram.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::getColorCount(): int.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::getColorCount(): int

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns the color count as an integer on success, throws ImagickPixelException on failure.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: у произвольного нового pixel это не число пикселей изображения.

Когда выбрать другое. count(getImageHistogram()) считает уникальные цвета.

Минимум: прочитать частоту цвета из histogramПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$pixel->setColorCount(17);
$value = $pixel->getColorCount();
if ($value < 0) { throw new RuntimeException('Отрицательная частота'); }
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$image->quantizeImage(4, Imagick::COLORSPACE_SRGB, 0, false, false);
$histogram = $image->getImageHistogram();
$pixel = $histogram[0];
$value = $pixel->getColorCount();
if ($value < 0) { throw new RuntimeException('Отрицательная частота'); }
$file = null;
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::getIndex, ImagickPixel::setColorCount, ImagickPixel::setIndex.

ImagickPixel::getColorQuantumпрочитать все каналы в нативной quantum-шкале

доступно: официальная страница не уточняет · imagick

ImagickPixel::getColorQuantum(): array

Потребность. прочитать все каналы в нативной quantum-шкале.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::getColorQuantum(): array.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::getColorQuantum(): array

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns an array with keys "r" , "g" , "b" , "a" .

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: Q8/Q16/HDRI нельзя угадать по серверу.

Когда выбрать другое. getColor(1) для переносимой шкалы 0…1.

Минимум: прочитать все каналы в нативной quantum-шкалеПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$value = $pixel->getColorQuantum();
$quantum = Imagick::getQuantum();
foreach (['r', 'g', 'b', 'a'] as $channel) { if (!array_key_exists($channel, $value) || !is_numeric($value[$channel]) || $value[$channel] < 0 || $value[$channel] > $quantum) { throw new RuntimeException('Канал вне quantum'); } }
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$value = $pixel->getColorQuantum();
$quantum = Imagick::getQuantum();
foreach (['r', 'g', 'b', 'a'] as $channel) { if (!array_key_exists($channel, $value) || !is_numeric($value[$channel]) || $value[$channel] < 0 || $value[$channel] > $quantum) { throw new RuntimeException('Канал вне quantum'); } }
$swatch = new Imagick();
$swatch->newImage(64, 40, $pixel, 'png');
$path = $outDir . '/pixel-getcolorquantum-workflow.png';
if (!$swatch->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('PNG не записан'); }
$swatch->clear();
$file = basename($path);
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::getColor, ImagickPixel::getColorAsString, ImagickPixel::getColorValue, ImagickPixel::getColorValueQuantum.

ImagickPixel::getColorValueпрочитать один нормализованный канал

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixel::getColorValue(int $color): float

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

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::getColorValue(int $color): float.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::getColorValue(int $color): float

ПараметрТипСмысл
$colorintСтрока цвета или константа канала — точный смысл виден из сигнатуры.
Формулировка PHP Manual

The color to get the value of, specified as one of the Imagick color constants. This can be one of the RGB colors, CMYK colors, alpha and opacity e.g (Imagick::COLOR_BLUE, Imagick::COLOR_MAGENTA).

Возвращает. The value of the channel, as a normalized floating-point number, throwing ImagickPixelException on error.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: COLOR_ALPHA и COLOR_OPACITY имеют разную семантику.

Когда выбрать другое. getColor(1) для набора каналов.

Минимум: прочитать один нормализованный каналПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$value = $pixel->getColorValue(Imagick::COLOR_BLUE);
if ($value < 0.0 || $value > 1.0) { throw new RuntimeException('Канал вне 0..1'); }
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$value = $pixel->getColorValue(Imagick::COLOR_ALPHA);
if ($value < 0.0 || $value > 1.0) { throw new RuntimeException('Канал вне 0..1'); }
$swatch = new Imagick();
$swatch->newImage(64, 40, $pixel, 'png');
$path = $outDir . '/pixel-getcolorvalue-workflow.png';
if (!$swatch->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('PNG не записан'); }
$swatch->clear();
$file = basename($path);
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::getColor, ImagickPixel::getColorAsString, ImagickPixel::getColorQuantum, ImagickPixel::getColorValueQuantum.

ImagickPixel::getColorValueQuantumсопоставить канал с нативной точностью сборки

доступно: PECL imagick 2 >= 2.3.0, PECL imagick 3 · imagick

ImagickPixel::getColorValueQuantum(int $color): int|float

Потребность. сопоставить канал с нативной точностью сборки.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::getColorValueQuantum(int $color): int|float.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::getColorValueQuantum(int $color): int|float

ПараметрТипСмысл
$colorintСтрока цвета или константа канала — точный смысл виден из сигнатуры.

Возвращает. The quantum value of the color element. Float if ImageMagick was compiled with HDRI, otherwise an int.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: HDRI может вернуть float, обычная сборка int.

Когда выбрать другое. getColorValue для логики 0…1.

Минимум: сопоставить канал с нативной точностью сборкиПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$value = $pixel->getColorValueQuantum(Imagick::COLOR_GREEN);
$quantum = Imagick::getQuantum();
if (!is_int($value) && !is_float($value)) { throw new RuntimeException('Ожидался int|float'); }
if ($value < 0 || $value > $quantum) { throw new RuntimeException('Канал вне quantum'); }
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$value = $pixel->getColorValueQuantum(Imagick::COLOR_BLUE);
$quantum = Imagick::getQuantum();
if (!is_int($value) && !is_float($value)) { throw new RuntimeException('Ожидался int|float'); }
if ($value < 0 || $value > $quantum) { throw new RuntimeException('Канал вне quantum'); }
$swatch = new Imagick();
$swatch->newImage(64, 40, $pixel, 'png');
$path = $outDir . '/pixel-getcolorvaluequantum-workflow.png';
if (!$swatch->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('PNG не записан'); }
$swatch->clear();
$file = basename($path);
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::getColor, ImagickPixel::getColorAsString, ImagickPixel::getColorQuantum, ImagickPixel::getColorValue.

ImagickPixel::getHSLразделить оттенок, насыщенность и светлоту

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixel::getHSL(): array

Потребность. разделить оттенок, насыщенность и светлоту.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::getHSL(): array.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::getHSL(): array

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns the HSL value in an array with the keys "hue", "saturation", and "luminosity". Throws ImagickPixelException on failure.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: все три значения нормализованы, hue циклический.

Когда выбрать другое. RGB для точного обмена с внешним API.

Минимум: разделить оттенок, насыщенность и светлотуПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$value = $pixel->getHSL();
foreach (['hue', 'saturation', 'luminosity'] as $key) { if (!isset($value[$key]) || $value[$key] < 0.0 || $value[$key] > 1.0) { throw new RuntimeException('Некорректный HSL'); } }
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$value = $pixel->getHSL();
foreach (['hue', 'saturation', 'luminosity'] as $key) { if (!isset($value[$key]) || $value[$key] < 0.0 || $value[$key] > 1.0) { throw new RuntimeException('Некорректный HSL'); } }
$swatch = new Imagick();
$swatch->newImage(64, 40, $pixel, 'png');
$path = $outDir . '/pixel-gethsl-workflow.png';
if (!$swatch->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('PNG не записан'); }
$swatch->clear();
$file = basename($path);
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::getColor, ImagickPixel::getColorAsString, ImagickPixel::getColorQuantum, ImagickPixel::getColorValue.

ImagickPixel::getIndexпрочитать индекс/служебный канал pixel-wand

доступно: PECL imagick 2 >= 2.3.0, PECL imagick 3 · imagick

ImagickPixel::getIndex(): int

Потребность. прочитать индекс/служебный канал pixel-wand.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::getIndex(): int.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::getIndex(): int

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Официальная страница не формулирует отдельный return-текст; точный тип берём из сигнатуры.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: это не координата и не позиция в PHP-массиве.

Когда выбрать другое. getIteratorRow и индекс foreach для координат.

Минимум: прочитать индекс/служебный канал pixel-wandПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$pixel->setIndex(3);
$value = $pixel->getIndex();
if ($value !== 3) { throw new RuntimeException('Index round-trip не совпал'); }
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$pixel->setIndex(11);
$value = $pixel->getIndex();
if ($value !== 11) { throw new RuntimeException('Index round-trip не совпал'); }
$file = null;
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::getColorCount, ImagickPixel::setColorCount, ImagickPixel::setIndex.

ImagickPixel::isPixelSimilarсравнить цвет с допуском в нормализованной метрике

доступно: PECL imagick 3 >= 3.3.0 · imagick

ImagickPixel::isPixelSimilar(ImagickPixel $color, float $fuzz): bool

Потребность. сравнить цвет с допуском в нормализованной метрике.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::isPixelSimilar(ImagickPixel $color, float $fuzz): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::isPixelSimilar(ImagickPixel $color, float $fuzz): bool

ПараметрТипСмысл
$colorImagickPixelСтрока цвета или константа канала — точный смысл виден из сигнатуры.
Формулировка PHP Manual

The ImagickPixel object to compare this object against.

$fuzzfloatМаксимально допустимое различие; шкала зависит от выбранного метода.
Формулировка PHP Manual

The maximum distance within which to consider these colors as similar. The theoretical maximum for this value is the square root of three (1.732).

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: порог 0 и слишком широкий порог дают разные классы ошибок.

Когда выбрать другое. сравнить каналы вручную по бизнес-правилу.

Минимум: сравнить цвет с допуском в нормализованной метрикеПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$other = new ImagickPixel('rgba(53, 103, 155, 0.75)');
$value = $pixel->isPixelSimilar($other, 0.04);
if (!is_bool($value)) { throw new RuntimeException('Ожидался bool'); }
$other->clear();
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$other = new ImagickPixel('rgba(242, 181, 68, 0.65)');
$value = $pixel->isPixelSimilar($other, 0.08);
if (!is_bool($value)) { throw new RuntimeException('Ожидался bool'); }
$other->clear();
$file = null;
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::isPixelSimilarQuantum, ImagickPixel::isSimilar.

ImagickPixel::isPixelSimilarQuantumсравнить цвет в quantum-допуске конкретной сборки

доступно: PECL imagick 3 >= 3.3.0 · imagick

ImagickPixel::isPixelSimilarQuantum(string $color, string $fuzz = ?): bool

Потребность. сравнить цвет в quantum-допуске конкретной сборки.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::isPixelSimilarQuantum(string $color, string $fuzz = ?): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::isPixelSimilarQuantum(string $color, string $fuzz = ?): bool

ПараметрТипСмысл
$colorstringСтрока цвета или константа канала — точный смысл виден из сигнатуры.
$fuzzstring; необязательныйМаксимально допустимое различие; шкала зависит от выбранного метода.

Возвращает. Официальная страница не формулирует отдельный return-текст; точный тип берём из сигнатуры.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: в сохранённой сигнатуре ошибочно указан string для fuzz; реализация принимает float в quantum-шкале.

Когда выбрать другое. isPixelSimilar с 0…1.

Минимум: сравнить цвет в quantum-допуске конкретной сборкиПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$value = $pixel->isPixelSimilarQuantum('rgba(53, 103, 155, 0.75)', Imagick::getQuantum() * 0.04);
if (!is_bool($value)) { throw new RuntimeException('Ожидался bool'); }
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$value = $pixel->isPixelSimilarQuantum('rgba(242, 181, 68, 0.65)', Imagick::getQuantum() * 0.08);
if (!is_bool($value)) { throw new RuntimeException('Ожидался bool'); }
$file = null;
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::isPixelSimilar, ImagickPixel::isSimilar.

ImagickPixel::isSimilarподдержать код со старым именем quantum-сравнения

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixel::isSimilar(ImagickPixel $color, float $fuzz): bool

Потребность. поддержать код со старым именем quantum-сравнения.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::isSimilar(ImagickPixel $color, float $fuzz): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::isSimilar(ImagickPixel $color, float $fuzz): bool

ПараметрТипСмысл
$colorImagickPixelСтрока цвета или константа канала — точный смысл виден из сигнатуры.
Формулировка PHP Manual

The ImagickPixel object to compare this object against.

$fuzzfloatМаксимально допустимое различие; шкала зависит от выбранного метода.
Формулировка PHP Manual

The maximum distance within which to consider these colors as similar. The theoretical maximum for this value is the square root of three (1.732).

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: isSimilar — alias isPixelSimilarQuantum и использует quantum-шкалу, не нормализованный порог.

Когда выбрать другое. isPixelSimilar с порогом 0…1 для нового кода.

Минимум: поддержать код со старым именем quantum-сравненияПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$other = new ImagickPixel('rgba(53, 103, 155, 0.75)');
$value = $pixel->isSimilar($other, Imagick::getQuantum() * 0.04);
if (!is_bool($value)) { throw new RuntimeException('Ожидался bool'); }
$other->clear();
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$other = new ImagickPixel('rgba(242, 181, 68, 0.65)');
$value = $pixel->isSimilar($other, Imagick::getQuantum() * 0.08);
if (!is_bool($value)) { throw new RuntimeException('Ожидался bool'); }
$other->clear();
$file = null;
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::isPixelSimilar, ImagickPixel::isPixelSimilarQuantum.

ImagickPixel::setColorзаменить цвет pixel-wand целиком

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixel::setColor(string $color): bool

Потребность. заменить цвет pixel-wand целиком.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::setColor(string $color): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::setColor(string $color): bool

ПараметрТипСмысл
$colorstringСтрока цвета или константа канала — точный смысл виден из сигнатуры.
Формулировка PHP Manual

The color definition to use in order to initialise the ImagickPixel object.

Возвращает. Returns true if the specified color was set, false otherwise.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: pixel из iterator попадёт в изображение только после syncIterator.

Когда выбрать другое. setColorValue для одного канала.

Минимум: заменить цвет pixel-wand целикомПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$accepted = $pixel->setColor('#ef476f');
if ($accepted !== true) { throw new RuntimeException('Цвет отклонён'); }
$value = $pixel->getColor(1);
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$accepted = $pixel->setColor('rgba(6, 214, 160, 0.8)');
if ($accepted !== true) { throw new RuntimeException('Цвет отклонён'); }
$value = $pixel->getColor(1);
$swatch = new Imagick();
$swatch->newImage(64, 40, $pixel, 'png');
$path = $outDir . '/pixel-setcolor-workflow.png';
if (!$swatch->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('PNG не записан'); }
$swatch->clear();
$file = basename($path);
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::setColorValue, ImagickPixel::setColorValueQuantum, ImagickPixel::setHSL.

ImagickPixel::setColorCountзадать служебную частоту histogram-записи

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixel::setcolorcount(int $colorCount): bool

Потребность. задать служебную частоту histogram-записи.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::setcolorcount(int $colorCount): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::setcolorcount(int $colorCount): bool

ПараметрТипСмысл
$colorCountintСлужебная частота цвета в histogram.

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: метод не рисует указанное число пикселей.

Когда выбрать другое. менять само изображение через iterator/draw.

Минимум: задать служебную частоту histogram-записиПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$accepted = $pixel->setColorCount(17);
if ($accepted !== true) { throw new RuntimeException('Частота отклонена'); }
$value = $pixel->getColorCount();
if ($value !== 17) { throw new RuntimeException('Частота не сохранена'); }
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$accepted = $pixel->setColorCount(96);
if ($accepted !== true) { throw new RuntimeException('Частота отклонена'); }
$value = $pixel->getColorCount();
if ($value !== 96) { throw new RuntimeException('Частота не сохранена'); }
$file = null;
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::getColorCount, ImagickPixel::getIndex, ImagickPixel::setIndex.

ImagickPixel::setColorValueпоменять один канал в переносимой шкале 0…1

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixel::setColorValue(int $color, float $value): bool

Потребность. поменять один канал в переносимой шкале 0…1.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::setColorValue(int $color, float $value): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::setColorValue(int $color, float $value): bool

ПараметрТипСмысл
$colorintСтрока цвета или константа канала — точный смысл виден из сигнатуры.
Формулировка PHP Manual

One of the Imagick color constants e.g. \Imagick::COLOR_GREEN or \Imagick::COLOR_ALPHA.

$valuefloatНовое значение канала: 0…1 либо quantum — по сигнатуре.
Формулировка PHP Manual

The value to set this channel to, ranging from 0 to 1.

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: значение вне диапазона и неверная константа нарушают контракт.

Когда выбрать другое. setColorValueQuantum для нативной шкалы.

Минимум: поменять один канал в переносимой шкале 0…1Пример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$accepted = $pixel->setColorValue(Imagick::COLOR_RED, 0.9);
if ($accepted !== true) { throw new RuntimeException('Канал отклонён'); }
$value = $pixel->getColorValue(Imagick::COLOR_RED);
if (abs($value - 0.9) > 0.01) { throw new RuntimeException('Setter не подтверждён getter'); }
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$accepted = $pixel->setColorValue(Imagick::COLOR_ALPHA, 0.4);
if ($accepted !== true) { throw new RuntimeException('Канал отклонён'); }
$value = $pixel->getColorValue(Imagick::COLOR_ALPHA);
if (abs($value - 0.4) > 0.01) { throw new RuntimeException('Setter не подтверждён getter'); }
$swatch = new Imagick();
$swatch->newImage(64, 40, $pixel, 'png');
$path = $outDir . '/pixel-setcolorvalue-workflow.png';
if (!$swatch->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('PNG не записан'); }
$swatch->clear();
$file = basename($path);
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::setColor, ImagickPixel::setColorValueQuantum, ImagickPixel::setHSL.

ImagickPixel::setColorValueQuantumзадать канал в quantum-точности текущей сборки

доступно: PECL imagick 2 >=2.3.0, PECL imagick 3 · imagick

ImagickPixel::setColorValueQuantum(int $color, int|float $value): bool

Потребность. задать канал в quantum-точности текущей сборки.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::setColorValueQuantum(int $color, int|float $value): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::setColorValueQuantum(int $color, int|float $value): bool

ПараметрТипСмысл
$colorintСтрока цвета или константа канала — точный смысл виден из сигнатуры.
Формулировка PHP Manual

Which color element to set e.g. \Imagick::COLOR_GREEN.

$valueint|floatНовое значение канала: 0…1 либо quantum — по сигнатуре.
Формулировка PHP Manual

The quantum value to set the color element to. This should be a float if ImageMagick was compiled with HDRI otherwise an int in the range 0 to Imagick::getQuantum().

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: нельзя жёстко считать quantum равным 255 или 65535.

Когда выбрать другое. setColorValue с нормализованным значением.

Минимум: задать канал в quantum-точности текущей сборкиПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$quantum = Imagick::getQuantum();
$rawTarget = $quantum * 0.25;
$sample = $pixel->getColorValueQuantum(Imagick::COLOR_GREEN);
$target = is_float($sample) ? $rawTarget : (int) round($rawTarget);
$accepted = $pixel->setColorValueQuantum(Imagick::COLOR_GREEN, $target);
if ($accepted !== true) { throw new RuntimeException('Quantum-канал отклонён'); }
$value = $pixel->getColorValueQuantum(Imagick::COLOR_GREEN);
if (abs((float) $value - $target) > max(1.0, $quantum * 0.002)) { throw new RuntimeException('Quantum round-trip не совпал'); }
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$quantum = Imagick::getQuantum();
$rawTarget = $quantum * 0.72;
$sample = $pixel->getColorValueQuantum(Imagick::COLOR_BLUE);
$target = is_float($sample) ? $rawTarget : (int) round($rawTarget);
$accepted = $pixel->setColorValueQuantum(Imagick::COLOR_BLUE, $target);
if ($accepted !== true) { throw new RuntimeException('Quantum-канал отклонён'); }
$value = $pixel->getColorValueQuantum(Imagick::COLOR_BLUE);
if (abs((float) $value - $target) > max(1.0, $quantum * 0.002)) { throw new RuntimeException('Quantum round-trip не совпал'); }
$swatch = new Imagick();
$swatch->newImage(64, 40, $pixel, 'png');
$path = $outDir . '/pixel-setcolorvaluequantum-workflow.png';
if (!$swatch->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('PNG не записан'); }
$swatch->clear();
$file = basename($path);
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::setColor, ImagickPixel::setColorValue, ImagickPixel::setHSL.

ImagickPixel::setHSLсобрать тематический цвет через оттенок/насыщенность/светлоту

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixel::setHSL(float $hue, float $saturation, float $luminosity): bool

Потребность. собрать тематический цвет через оттенок/насыщенность/светлоту.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::setHSL(float $hue, float $saturation, float $luminosity): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::setHSL(float $hue, float $saturation, float $luminosity): bool

ПараметрТипСмысл
$huefloatОттенок как доля цветового круга 0…1.
Формулировка PHP Manual

The normalized value for hue, described as a fractional arc (between 0 and 1) of the hue circle, where the zero value is red.

$saturationfloatНасыщенность 0…1.
Формулировка PHP Manual

The normalized value for saturation, with 1 as full saturation.

$luminosityfloatСветлота 0…1.
Формулировка PHP Manual

The normalized value for luminosity, on a scale from black at 0 to white at 1, with the full HS value at 0.5 luminosity.

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: hue — доля круга, а не градусы.

Когда выбрать другое. setColor для готовой CSS/ImageMagick строки.

Минимум: собрать тематический цвет через оттенок/насыщенность/светлотуПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$accepted = $pixel->setHSL(0.58, 0.70, 0.48);
if ($accepted !== true) { throw new RuntimeException('HSL отклонён'); }
$value = $pixel->getHSL();
foreach ($value as $channel) { if ($channel < 0.0 || $channel > 1.0) { throw new RuntimeException('HSL вне 0..1'); } }
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$accepted = $pixel->setHSL(0.12, 0.82, 0.55);
if ($accepted !== true) { throw new RuntimeException('HSL отклонён'); }
$value = $pixel->getHSL();
foreach ($value as $channel) { if ($channel < 0.0 || $channel > 1.0) { throw new RuntimeException('HSL вне 0..1'); } }
$swatch = new Imagick();
$swatch->newImage(64, 40, $pixel, 'png');
$path = $outDir . '/pixel-sethsl-workflow.png';
if (!$swatch->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('PNG не записан'); }
$swatch->clear();
$file = basename($path);
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::setColor, ImagickPixel::setColorValue, ImagickPixel::setColorValueQuantum.

ImagickPixel::setIndexзадать индекс/служебный канал при низкоуровневой работе

доступно: PECL imagick 2 >= 2.3.0, PECL imagick 3 · imagick

ImagickPixel::setIndex(int $index): bool

Потребность. задать индекс/служебный канал при низкоуровневой работе.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixel::setIndex(int $index): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixel::setIndex(int $index): bool

ПараметрТипСмысл
$indexintИндекс/служебный канал, не координата.

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: в DirectClass RGB это не создаёт palette mapping.

Когда выбрать другое. quantize/remap для управляемой палитры.

Минимум: задать индекс/служебный канал при низкоуровневой работеПример для указанного окружения
<?php
declare(strict_types=1);

$pixel = new ImagickPixel('rgba(51, 102, 153, 0.75)');
$accepted = $pixel->setIndex(5);
if ($accepted !== true) { throw new RuntimeException('Index отклонён'); }
$value = $pixel->getIndex();
if ($value !== 5) { throw new RuntimeException('Index не сохранён'); }
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(12, 8, new ImagickPixel('rgba(20, 80, 140, 0.65)'), 'png');
$pixel = $image->getImagePixelColor(4, 3);
$accepted = $pixel->setIndex(13);
if ($accepted !== true) { throw new RuntimeException('Index отклонён'); }
$value = $pixel->getIndex();
if ($value !== 13) { throw new RuntimeException('Index не сохранён'); }
$file = null;
echo json_encode(['value' => $value, 'file' => $file], JSON_THROW_ON_ERROR), PHP_EOL;
$pixel->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixel::getColorCount, ImagickPixel::getIndex, ImagickPixel::setColorCount.

ImagickPixelIterator::clearосвободить iterator после ограниченного прохода

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixelIterator::clear(): bool

Потребность. освободить iterator после ограниченного прохода.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixelIterator::clear(): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixelIterator::clear(): bool

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: очистка iterator не является записью изображения.

Когда выбрать другое. дать объекту выйти из области видимости.

Если пример меняет pixel-wand, он вызывает syncIterator() на каждой изменённой строке и затем читает контрольный пиксель из Imagick.

Минимум: освободить iterator после ограниченного проходаПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(6, 4, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(2, 1, 4, 2);
$image->drawImage($draw);
$draw->clear();
$iterator = new ImagickPixelIterator($image);
$before = ['row' => $iterator->getIteratorRow(), 'columns' => count($iterator->getCurrentIteratorRow())];
$accepted = $iterator->clear();
if ($accepted !== true) { throw new RuntimeException('Iterator не освобождён'); }
$value = ['released' => true, 'before' => $before];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$image->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(10, 6, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(3, 2, 7, 4);
$image->drawImage($draw);
$draw->clear();
$geometry = ['width' => $image->getImageWidth(), 'height' => $image->getImageHeight()];
if ($geometry !== ['width' => 10, 'height' => 6]) { throw new RuntimeException('Fixture имеет другую геометрию'); }
$image->setImageProperty('aen:fixture', 'service-region');
$iterator = new ImagickPixelIterator($image);
$before = ['row' => $iterator->getIteratorRow(), 'columns' => count($iterator->getCurrentIteratorRow())];
$accepted = $iterator->clear();
if ($accepted !== true) { throw new RuntimeException('Iterator не освобождён'); }
$value = ['released' => true, 'before' => $before];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixelIterator::__construct, ImagickPixelIterator::destroy, ImagickPixelIterator::newPixelIterator, ImagickPixelIterator::newPixelRegionIterator.

ImagickPixelIterator::__constructначать построчный обход программно созданного изображения

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixelIterator::__construct(Imagick $wand): mixed

Потребность. начать построчный обход программно созданного изображения.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixelIterator::__construct(Imagick $wand): mixed.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixelIterator::__construct(Imagick $wand): mixed

ПараметрТипСмысл
$wandImagickОбъект Imagick, пиксели которого будет обходить iterator.

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: пустой/повреждённый Imagick не даст полезных строк.

Когда выбрать другое. Imagick::getPixelIterator.

Если пример меняет pixel-wand, он вызывает syncIterator() на каждой изменённой строке и затем читает контрольный пиксель из Imagick.

Минимум: начать построчный обход программно созданного изображенияПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(6, 4, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(2, 1, 4, 2);
$image->drawImage($draw);
$draw->clear();
$iterator = new ImagickPixelIterator($image);
$row = $iterator->getCurrentIteratorRow();
if (!is_array($row) || count($row) !== 6) { throw new RuntimeException('Ширина строки не совпала'); }
$value = ['row' => $iterator->getIteratorRow(), 'columns' => count($row)];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(10, 6, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(3, 2, 7, 4);
$image->drawImage($draw);
$draw->clear();
$geometry = ['width' => $image->getImageWidth(), 'height' => $image->getImageHeight()];
if ($geometry !== ['width' => 10, 'height' => 6]) { throw new RuntimeException('Fixture имеет другую геометрию'); }
$image->setImageProperty('aen:fixture', 'service-region');
$iterator = new ImagickPixelIterator($image);
$row = $iterator->getCurrentIteratorRow();
if (!is_array($row) || count($row) !== 10) { throw new RuntimeException('Ширина строки не совпала'); }
$value = ['row' => $iterator->getIteratorRow(), 'columns' => count($row)];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixelIterator::clear, ImagickPixelIterator::destroy, ImagickPixelIterator::newPixelIterator, ImagickPixelIterator::newPixelRegionIterator.

ImagickPixelIterator::destroyявно завершить старый iterator

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixelIterator::destroy(): bool

Потребность. явно завершить старый iterator.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixelIterator::destroy(): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixelIterator::destroy(): bool

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: нельзя продолжать навигацию после destroy.

Когда выбрать другое. clear или естественное освобождение.

Если пример меняет pixel-wand, он вызывает syncIterator() на каждой изменённой строке и затем читает контрольный пиксель из Imagick.

Минимум: явно завершить старый iteratorПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(6, 4, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(2, 1, 4, 2);
$image->drawImage($draw);
$draw->clear();
$iterator = new ImagickPixelIterator($image);
$before = ['row' => $iterator->getIteratorRow(), 'columns' => count($iterator->getCurrentIteratorRow())];
$accepted = $iterator->destroy();
if ($accepted !== true) { throw new RuntimeException('Iterator не освобождён'); }
$value = ['released' => true, 'before' => $before];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$image->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(10, 6, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(3, 2, 7, 4);
$image->drawImage($draw);
$draw->clear();
$geometry = ['width' => $image->getImageWidth(), 'height' => $image->getImageHeight()];
if ($geometry !== ['width' => 10, 'height' => 6]) { throw new RuntimeException('Fixture имеет другую геометрию'); }
$image->setImageProperty('aen:fixture', 'service-region');
$iterator = new ImagickPixelIterator($image);
$before = ['row' => $iterator->getIteratorRow(), 'columns' => count($iterator->getCurrentIteratorRow())];
$accepted = $iterator->destroy();
if ($accepted !== true) { throw new RuntimeException('Iterator не освобождён'); }
$value = ['released' => true, 'before' => $before];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixelIterator::clear, ImagickPixelIterator::__construct, ImagickPixelIterator::newPixelIterator, ImagickPixelIterator::newPixelRegionIterator.

ImagickPixelIterator::getCurrentIteratorRowполучить пиксели выбранной строки

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixelIterator::getCurrentIteratorRow(): array

Потребность. получить пиксели выбранной строки.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixelIterator::getCurrentIteratorRow(): array.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixelIterator::getCurrentIteratorRow(): array

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns a row as an array of ImagickPixel objects that can themselves be iterated.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: изменения без syncIterator потеряются.

Когда выбрать другое. foreach по iterator для всех строк.

Если пример меняет pixel-wand, он вызывает syncIterator() на каждой изменённой строке и затем читает контрольный пиксель из Imagick.

Минимум: получить пиксели выбранной строкиПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(6, 4, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(2, 1, 4, 2);
$image->drawImage($draw);
$draw->clear();
$iterator = new ImagickPixelIterator($image);
if (!$iterator->setIteratorRow(1)) { throw new RuntimeException('Строка недоступна'); }
$row = $iterator->getCurrentIteratorRow();
if (!is_array($row) || count($row) !== 6) { throw new RuntimeException('Неверная ширина строки'); }
$value = ['row' => $iterator->getIteratorRow(), 'columns' => count($row), 'first' => $row[0]->getColor(1)];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: сохранить выбранную строку для диагностикиПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(10, 6, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(3, 2, 7, 4);
$image->drawImage($draw);
$draw->clear();
$geometry = ['width' => $image->getImageWidth(), 'height' => $image->getImageHeight()];
if ($geometry !== ['width' => 10, 'height' => 6]) { throw new RuntimeException('Fixture имеет другую геометрию'); }
$image->setImageProperty('aen:fixture', 'service-region');
$iterator = new ImagickPixelIterator($image);
if (!$iterator->setIteratorRow(3)) { throw new RuntimeException('Строка недоступна'); }
$row = $iterator->getCurrentIteratorRow();
if (!is_array($row) || count($row) !== 10) { throw new RuntimeException('Неверная ширина строки'); }
$value = ['row' => $iterator->getIteratorRow(), 'columns' => count($row), 'first' => $row[0]->getColor(1)];
$selectedY = $iterator->getIteratorRow();
$selectedPixels = $iterator->getCurrentIteratorRow();
$rgbRow = array_map(static fn (ImagickPixel $pixel): array => $pixel->getColor(0), $selectedPixels);
$strip = clone $image;
$strip->cropImage(10, 1, 0, $selectedY);
$strip->setImagePage(0, 0, 0, 0);
$path = $outDir . '/selected-row-getcurrentiteratorrow.png';
if (!$strip->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Полоса строки не записана'); }
$strip->clear();
$value = ['navigation' => $value, 'selected_y' => $selectedY, 'rgb_row' => $rgbRow, 'file' => basename($path)];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Во втором сценарии выбранная строка превращается в PNG-полосу высотой один пиксель и массив RGB: так проверяют цвет строки, рамки или артефакт импорта. Курсор определяет, какую строку диагностировать. PHP Imagick локально не выполнялся.

Соседние инструменты: ImagickPixelIterator::getIteratorRow, ImagickPixelIterator::getNextIteratorRow, ImagickPixelIterator::getPreviousIteratorRow, ImagickPixelIterator::resetIterator.

ImagickPixelIterator::getIteratorRowузнать текущий y курсора

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixelIterator::getIteratorRow(): int

Потребность. узнать текущий y курсора.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixelIterator::getIteratorRow(): int.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixelIterator::getIteratorRow(): int

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns the integer offset of the row, throwing ImagickPixelIteratorException on error.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: это строка, не x пикселя.

Когда выбрать другое. ключ foreach для последовательного обхода.

Если пример меняет pixel-wand, он вызывает syncIterator() на каждой изменённой строке и затем читает контрольный пиксель из Imagick.

Минимум: узнать текущий y курсораПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(6, 4, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(2, 1, 4, 2);
$image->drawImage($draw);
$draw->clear();
$iterator = new ImagickPixelIterator($image);
$iterator->setIteratorRow(2);
$value = $iterator->getIteratorRow();
if ($value !== 2) { throw new RuntimeException('Курсор строки не совпал'); }
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: сохранить выбранную строку для диагностикиПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(10, 6, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(3, 2, 7, 4);
$image->drawImage($draw);
$draw->clear();
$geometry = ['width' => $image->getImageWidth(), 'height' => $image->getImageHeight()];
if ($geometry !== ['width' => 10, 'height' => 6]) { throw new RuntimeException('Fixture имеет другую геометрию'); }
$image->setImageProperty('aen:fixture', 'service-region');
$iterator = new ImagickPixelIterator($image);
$iterator->setIteratorRow(4);
$value = $iterator->getIteratorRow();
if ($value !== 4) { throw new RuntimeException('Курсор строки не совпал'); }
$selectedY = $iterator->getIteratorRow();
$selectedPixels = $iterator->getCurrentIteratorRow();
$rgbRow = array_map(static fn (ImagickPixel $pixel): array => $pixel->getColor(0), $selectedPixels);
$strip = clone $image;
$strip->cropImage(10, 1, 0, $selectedY);
$strip->setImagePage(0, 0, 0, 0);
$path = $outDir . '/selected-row-getiteratorrow.png';
if (!$strip->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Полоса строки не записана'); }
$strip->clear();
$value = ['navigation' => $value, 'selected_y' => $selectedY, 'rgb_row' => $rgbRow, 'file' => basename($path)];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Во втором сценарии выбранная строка превращается в PNG-полосу высотой один пиксель и массив RGB: так проверяют цвет строки, рамки или артефакт импорта. Курсор определяет, какую строку диагностировать. PHP Imagick локально не выполнялся.

Соседние инструменты: ImagickPixelIterator::getCurrentIteratorRow, ImagickPixelIterator::getNextIteratorRow, ImagickPixelIterator::getPreviousIteratorRow, ImagickPixelIterator::resetIterator.

ImagickPixelIterator::getNextIteratorRowчитать строки по одной в streaming-подобном цикле

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixelIterator::getNextIteratorRow(): array

Потребность. читать строки по одной в streaming-подобном цикле.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixelIterator::getNextIteratorRow(): array.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixelIterator::getNextIteratorRow(): array

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns the next row as an array of ImagickPixel objects, throwing ImagickPixelIteratorException on error.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: на границе версии могут различаться по сигналу конца.

Когда выбрать другое. foreach по iterator.

Если пример меняет pixel-wand, он вызывает syncIterator() на каждой изменённой строке и затем читает контрольный пиксель из Imagick.

Минимум: читать строки по одной в streaming-подобном циклеПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(6, 4, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(2, 1, 4, 2);
$image->drawImage($draw);
$draw->clear();
$iterator = new ImagickPixelIterator($image);
$iterator->resetIterator();
$row = $iterator->getNextIteratorRow();
if (!is_array($row) || count($row) !== 6) { throw new RuntimeException('Первая строка не прочитана'); }
$value = ['row' => $iterator->getIteratorRow(), 'columns' => count($row), 'sample' => $row[0]->getColor(1)];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: сохранить выбранную строку для диагностикиПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(10, 6, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(3, 2, 7, 4);
$image->drawImage($draw);
$draw->clear();
$geometry = ['width' => $image->getImageWidth(), 'height' => $image->getImageHeight()];
if ($geometry !== ['width' => 10, 'height' => 6]) { throw new RuntimeException('Fixture имеет другую геометрию'); }
$image->setImageProperty('aen:fixture', 'service-region');
$iterator = new ImagickPixelIterator($image);
$iterator->resetIterator();
$row = $iterator->getNextIteratorRow();
if (!is_array($row) || count($row) !== 10) { throw new RuntimeException('Первая строка не прочитана'); }
$value = ['row' => $iterator->getIteratorRow(), 'columns' => count($row), 'sample' => $row[0]->getColor(1)];
$selectedY = $iterator->getIteratorRow();
$selectedPixels = $iterator->getCurrentIteratorRow();
$rgbRow = array_map(static fn (ImagickPixel $pixel): array => $pixel->getColor(0), $selectedPixels);
$strip = clone $image;
$strip->cropImage(10, 1, 0, $selectedY);
$strip->setImagePage(0, 0, 0, 0);
$path = $outDir . '/selected-row-getnextiteratorrow.png';
if (!$strip->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Полоса строки не записана'); }
$strip->clear();
$value = ['navigation' => $value, 'selected_y' => $selectedY, 'rgb_row' => $rgbRow, 'file' => basename($path)];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Во втором сценарии выбранная строка превращается в PNG-полосу высотой один пиксель и массив RGB: так проверяют цвет строки, рамки или артефакт импорта. Курсор определяет, какую строку диагностировать. PHP Imagick локально не выполнялся.

Соседние инструменты: ImagickPixelIterator::getCurrentIteratorRow, ImagickPixelIterator::getIteratorRow, ImagickPixelIterator::getPreviousIteratorRow, ImagickPixelIterator::resetIterator.

ImagickPixelIterator::getPreviousIteratorRowвернуться к предыдущей строке

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixelIterator::getPreviousIteratorRow(): array

Потребность. вернуться к предыдущей строке.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixelIterator::getPreviousIteratorRow(): array.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixelIterator::getPreviousIteratorRow(): array

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns the previous row as an array of ImagickPixelWand objects from the ImagickPixelIterator, throwing ImagickPixelIteratorException on error.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: сначала курсор должен находиться ниже неё.

Когда выбрать другое. setIteratorRow для прямого перехода.

Если пример меняет pixel-wand, он вызывает syncIterator() на каждой изменённой строке и затем читает контрольный пиксель из Imagick.

Минимум: вернуться к предыдущей строкеПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(6, 4, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(2, 1, 4, 2);
$image->drawImage($draw);
$draw->clear();
$iterator = new ImagickPixelIterator($image);
$iterator->setIteratorLastRow();
$iterator->getCurrentIteratorRow();
$row = $iterator->getPreviousIteratorRow();
if ($iterator->getIteratorRow() !== 2) { throw new RuntimeException('Курсор не перешёл на предыдущую строку'); }
if (!is_array($row) || count($row) !== 6) { throw new RuntimeException('Предыдущая строка не прочитана'); }
$value = ['row' => $iterator->getIteratorRow(), 'columns' => count($row)];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: сохранить выбранную строку для диагностикиПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(10, 6, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(3, 2, 7, 4);
$image->drawImage($draw);
$draw->clear();
$geometry = ['width' => $image->getImageWidth(), 'height' => $image->getImageHeight()];
if ($geometry !== ['width' => 10, 'height' => 6]) { throw new RuntimeException('Fixture имеет другую геометрию'); }
$image->setImageProperty('aen:fixture', 'service-region');
$iterator = new ImagickPixelIterator($image);
$iterator->setIteratorLastRow();
$iterator->getCurrentIteratorRow();
$row = $iterator->getPreviousIteratorRow();
if ($iterator->getIteratorRow() !== 4) { throw new RuntimeException('Курсор не перешёл на предыдущую строку'); }
if (!is_array($row) || count($row) !== 10) { throw new RuntimeException('Предыдущая строка не прочитана'); }
$value = ['row' => $iterator->getIteratorRow(), 'columns' => count($row)];
$selectedY = $iterator->getIteratorRow();
$selectedPixels = $iterator->getCurrentIteratorRow();
$rgbRow = array_map(static fn (ImagickPixel $pixel): array => $pixel->getColor(0), $selectedPixels);
$strip = clone $image;
$strip->cropImage(10, 1, 0, $selectedY);
$strip->setImagePage(0, 0, 0, 0);
$path = $outDir . '/selected-row-getpreviousiteratorrow.png';
if (!$strip->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Полоса строки не записана'); }
$strip->clear();
$value = ['navigation' => $value, 'selected_y' => $selectedY, 'rgb_row' => $rgbRow, 'file' => basename($path)];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Во втором сценарии выбранная строка превращается в PNG-полосу высотой один пиксель и массив RGB: так проверяют цвет строки, рамки или артефакт импорта. Курсор определяет, какую строку диагностировать. PHP Imagick локально не выполнялся.

Соседние инструменты: ImagickPixelIterator::getCurrentIteratorRow, ImagickPixelIterator::getIteratorRow, ImagickPixelIterator::getNextIteratorRow, ImagickPixelIterator::resetIterator.

ImagickPixelIterator::newPixelIteratorпереназначить iterator на другой Imagick

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixelIterator::newPixelIterator(Imagick $wand): bool

Потребность. переназначить iterator на другой Imagick.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixelIterator::newPixelIterator(Imagick $wand): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixelIterator::newPixelIterator(Imagick $wand): bool

ПараметрТипСмысл
$wandImagickОбъект Imagick, пиксели которого будет обходить iterator.

Возвращает. Returns true on success. Throwing ImagickPixelIteratorException.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: PHP Manual одновременно заявляет bool и описывает новый iterator.

Когда выбрать другое. конструктор или Imagick::getPixelIterator.

Если пример меняет pixel-wand, он вызывает syncIterator() на каждой изменённой строке и затем читает контрольный пиксель из Imagick.

Минимум: переназначить iterator на другой ImagickПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(6, 4, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(2, 1, 4, 2);
$image->drawImage($draw);
$draw->clear();
$iterator = new ImagickPixelIterator($image);
$extensionVersion = phpversion('imagick');
if (!is_string($extensionVersion) || $extensionVersion === '') { throw new RuntimeException('Не удалось определить версию imagick'); }
$replacement = new Imagick();
$replacement->newImage(5, 3, new ImagickPixel('#06d6a0'), 'png');
$factoryResult = $iterator->newPixelIterator($replacement);
if ($factoryResult instanceof ImagickPixelIterator) {
    $active = $factoryResult;
    $factoryMode = 'iterator-object';
} elseif ($factoryResult === true) {
    $active = $iterator;
    $factoryMode = 'bool-mutates-receiver';
} else {
    throw new RuntimeException('Версия вернула неподдерживаемый результат фабрики');
}
$active->resetIterator();
$row = [];
$seenRows = 0;
while (true) {
    try { $next = $active->getNextIteratorRow(); } catch (ImagickPixelIteratorException) { break; }
    if (!is_array($next) || $next === []) { break; }
    if ($seenRows === 0) { $row = $next; }
    if (count($next) !== 5) { throw new RuntimeException('Ширина области не совпала'); }
    $seenRows++;
    if ($seenRows > 3) { throw new RuntimeException('Iterator вышел за ожидаемую область'); }
}
if ($seenRows !== 3) { throw new RuntimeException('Число строк области не совпало'); }
$value = ['imagick_version' => $extensionVersion, 'factory_mode' => $factoryMode, 'columns' => count($row), 'rows' => $seenRows];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
if (isset($active) && $active !== $iterator) { $active->clear(); }
$replacement->clear();
$iterator->clear();
$image->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(10, 6, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(3, 2, 7, 4);
$image->drawImage($draw);
$draw->clear();
$geometry = ['width' => $image->getImageWidth(), 'height' => $image->getImageHeight()];
if ($geometry !== ['width' => 10, 'height' => 6]) { throw new RuntimeException('Fixture имеет другую геометрию'); }
$image->setImageProperty('aen:fixture', 'service-region');
$iterator = new ImagickPixelIterator($image);
$extensionVersion = phpversion('imagick');
if (!is_string($extensionVersion) || $extensionVersion === '') { throw new RuntimeException('Не удалось определить версию imagick'); }
$replacement = new Imagick();
$replacement->newImage(8, 5, new ImagickPixel('#f2b544'), 'png');
$factoryResult = $iterator->newPixelIterator($replacement);
if ($factoryResult instanceof ImagickPixelIterator) {
    $active = $factoryResult;
    $factoryMode = 'iterator-object';
} elseif ($factoryResult === true) {
    $active = $iterator;
    $factoryMode = 'bool-mutates-receiver';
} else {
    throw new RuntimeException('Версия вернула неподдерживаемый результат фабрики');
}
$active->resetIterator();
$row = [];
$seenRows = 0;
while (true) {
    try { $next = $active->getNextIteratorRow(); } catch (ImagickPixelIteratorException) { break; }
    if (!is_array($next) || $next === []) { break; }
    if ($seenRows === 0) { $row = $next; }
    if (count($next) !== 8) { throw new RuntimeException('Ширина области не совпала'); }
    $seenRows++;
    if ($seenRows > 5) { throw new RuntimeException('Iterator вышел за ожидаемую область'); }
}
if ($seenRows !== 5) { throw new RuntimeException('Число строк области не совпало'); }
$value = ['imagick_version' => $extensionVersion, 'factory_mode' => $factoryMode, 'columns' => count($row), 'rows' => $seenRows];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
if (isset($active) && $active !== $iterator) { $active->clear(); }
$replacement->clear();
$iterator->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixelIterator::clear, ImagickPixelIterator::__construct, ImagickPixelIterator::destroy, ImagickPixelIterator::newPixelRegionIterator.

ImagickPixelIterator::newPixelRegionIteratorобойти только прямоугольник интереса

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixelIterator::newPixelRegionIterator(Imagick $wand, int $x, int $y, int $columns, int $rows): bool

Потребность. обойти только прямоугольник интереса.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixelIterator::newPixelRegionIterator(Imagick $wand, int $x, int $y, int $columns, int $rows): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixelIterator::newPixelRegionIterator(Imagick $wand, int $x, int $y, int $columns, int $rows): bool

ПараметрТипСмысл
$wandImagickОбъект Imagick, пиксели которого будет обходить iterator.
$xintЛевая координата region.
$yintВерхняя координата region.
$columnsintШирина region в пикселях.
$rowsintВысота region в пикселях.

Возвращает. Returns a new ImagickPixelIterator on success; on failure, throws ImagickPixelIteratorException.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: Manual конфликтует: bool в сигнатуре, ImagickPixelIterator в return-тексте.

Когда выбрать другое. Imagick::getPixelRegionIterator при наличии в версии.

Если пример меняет pixel-wand, он вызывает syncIterator() на каждой изменённой строке и затем читает контрольный пиксель из Imagick.

Минимум: обойти только прямоугольник интересаПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(6, 4, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(2, 1, 4, 2);
$image->drawImage($draw);
$draw->clear();
$iterator = new ImagickPixelIterator($image);
$extensionVersion = phpversion('imagick');
if (!is_string($extensionVersion) || $extensionVersion === '') { throw new RuntimeException('Не удалось определить версию imagick'); }
$factoryResult = $iterator->newPixelRegionIterator($image, 1, 1, 3, 2);
if ($factoryResult instanceof ImagickPixelIterator) {
    $active = $factoryResult;
    $factoryMode = 'iterator-object';
} elseif ($factoryResult === true) {
    $active = $iterator;
    $factoryMode = 'bool-mutates-receiver';
} else {
    throw new RuntimeException('Версия вернула неподдерживаемый результат region-фабрики');
}
$active->resetIterator();
$row = [];
$seenRows = 0;
while (true) {
    try { $next = $active->getNextIteratorRow(); } catch (ImagickPixelIteratorException) { break; }
    if (!is_array($next) || $next === []) { break; }
    if ($seenRows === 0) { $row = $next; }
    if (count($next) !== 3) { throw new RuntimeException('Ширина области не совпала'); }
    $seenRows++;
    if ($seenRows > 2) { throw new RuntimeException('Iterator вышел за ожидаемую область'); }
}
if ($seenRows !== 2) { throw new RuntimeException('Число строк области не совпало'); }
$value = ['imagick_version' => $extensionVersion, 'factory_mode' => $factoryMode, 'columns' => count($row), 'rows' => $seenRows];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
if (isset($active) && $active !== $iterator) { $active->clear(); }
$iterator->clear();
$image->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(10, 6, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(3, 2, 7, 4);
$image->drawImage($draw);
$draw->clear();
$geometry = ['width' => $image->getImageWidth(), 'height' => $image->getImageHeight()];
if ($geometry !== ['width' => 10, 'height' => 6]) { throw new RuntimeException('Fixture имеет другую геометрию'); }
$image->setImageProperty('aen:fixture', 'service-region');
$iterator = new ImagickPixelIterator($image);
$extensionVersion = phpversion('imagick');
if (!is_string($extensionVersion) || $extensionVersion === '') { throw new RuntimeException('Не удалось определить версию imagick'); }
$factoryResult = $iterator->newPixelRegionIterator($image, 2, 2, 5, 3);
if ($factoryResult instanceof ImagickPixelIterator) {
    $active = $factoryResult;
    $factoryMode = 'iterator-object';
} elseif ($factoryResult === true) {
    $active = $iterator;
    $factoryMode = 'bool-mutates-receiver';
} else {
    throw new RuntimeException('Версия вернула неподдерживаемый результат region-фабрики');
}
$active->resetIterator();
$row = [];
$seenRows = 0;
while (true) {
    try { $next = $active->getNextIteratorRow(); } catch (ImagickPixelIteratorException) { break; }
    if (!is_array($next) || $next === []) { break; }
    if ($seenRows === 0) { $row = $next; }
    if (count($next) !== 5) { throw new RuntimeException('Ширина области не совпала'); }
    $seenRows++;
    if ($seenRows > 3) { throw new RuntimeException('Iterator вышел за ожидаемую область'); }
}
if ($seenRows !== 3) { throw new RuntimeException('Число строк области не совпало'); }
$value = ['imagick_version' => $extensionVersion, 'factory_mode' => $factoryMode, 'columns' => count($row), 'rows' => $seenRows];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
if (isset($active) && $active !== $iterator) { $active->clear(); }
$iterator->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixelIterator::clear, ImagickPixelIterator::__construct, ImagickPixelIterator::destroy, ImagickPixelIterator::newPixelIterator.

ImagickPixelIterator::resetIteratorвернуть курсор перед новым проходом

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixelIterator::resetIterator(): bool

Потребность. вернуть курсор перед новым проходом.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixelIterator::resetIterator(): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixelIterator::resetIterator(): bool

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: reset не записывает несинхронизированные изменения.

Когда выбрать другое. создать новый iterator.

Если пример меняет pixel-wand, он вызывает syncIterator() на каждой изменённой строке и затем читает контрольный пиксель из Imagick.

Минимум: вернуть курсор перед новым проходомПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(6, 4, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(2, 1, 4, 2);
$image->drawImage($draw);
$draw->clear();
$iterator = new ImagickPixelIterator($image);
$iterator->setIteratorLastRow();
$accepted = $iterator->resetIterator();
if ($accepted !== true) { throw new RuntimeException('Reset отклонён'); }
$first = $iterator->getNextIteratorRow();
if (!is_array($first) || count($first) !== 6) { throw new RuntimeException('После reset нет первой строки'); }
$value = ['accepted' => true, 'row_after_next' => $iterator->getIteratorRow()];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: сохранить выбранную строку для диагностикиПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(10, 6, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(3, 2, 7, 4);
$image->drawImage($draw);
$draw->clear();
$geometry = ['width' => $image->getImageWidth(), 'height' => $image->getImageHeight()];
if ($geometry !== ['width' => 10, 'height' => 6]) { throw new RuntimeException('Fixture имеет другую геометрию'); }
$image->setImageProperty('aen:fixture', 'service-region');
$iterator = new ImagickPixelIterator($image);
$iterator->setIteratorLastRow();
$accepted = $iterator->resetIterator();
if ($accepted !== true) { throw new RuntimeException('Reset отклонён'); }
$first = $iterator->getNextIteratorRow();
if (!is_array($first) || count($first) !== 10) { throw new RuntimeException('После reset нет первой строки'); }
$value = ['accepted' => true, 'row_after_next' => $iterator->getIteratorRow()];
$selectedY = $iterator->getIteratorRow();
$selectedPixels = $iterator->getCurrentIteratorRow();
$rgbRow = array_map(static fn (ImagickPixel $pixel): array => $pixel->getColor(0), $selectedPixels);
$strip = clone $image;
$strip->cropImage(10, 1, 0, $selectedY);
$strip->setImagePage(0, 0, 0, 0);
$path = $outDir . '/selected-row-resetiterator.png';
if (!$strip->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Полоса строки не записана'); }
$strip->clear();
$value = ['navigation' => $value, 'selected_y' => $selectedY, 'rgb_row' => $rgbRow, 'file' => basename($path)];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Во втором сценарии выбранная строка превращается в PNG-полосу высотой один пиксель и массив RGB: так проверяют цвет строки, рамки или артефакт импорта. Курсор определяет, какую строку диагностировать. PHP Imagick локально не выполнялся.

Соседние инструменты: ImagickPixelIterator::getCurrentIteratorRow, ImagickPixelIterator::getIteratorRow, ImagickPixelIterator::getNextIteratorRow, ImagickPixelIterator::getPreviousIteratorRow.

ImagickPixelIterator::setIteratorFirstRowперейти к первой строке

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixelIterator::setIteratorFirstRow(): bool

Потребность. перейти к первой строке.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixelIterator::setIteratorFirstRow(): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixelIterator::setIteratorFirstRow(): bool

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: пустое изображение не имеет полезной строки.

Когда выбрать другое. resetIterator затем getNextIteratorRow.

Если пример меняет pixel-wand, он вызывает syncIterator() на каждой изменённой строке и затем читает контрольный пиксель из Imagick.

Минимум: перейти к первой строкеПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(6, 4, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(2, 1, 4, 2);
$image->drawImage($draw);
$draw->clear();
$iterator = new ImagickPixelIterator($image);
$iterator->setIteratorLastRow();
$accepted = $iterator->setIteratorFirstRow();
if ($accepted !== true || $iterator->getIteratorRow() !== 0) { throw new RuntimeException('Не первая строка'); }
$value = ['accepted' => true, 'row' => $iterator->getIteratorRow()];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: сохранить выбранную строку для диагностикиПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(10, 6, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(3, 2, 7, 4);
$image->drawImage($draw);
$draw->clear();
$geometry = ['width' => $image->getImageWidth(), 'height' => $image->getImageHeight()];
if ($geometry !== ['width' => 10, 'height' => 6]) { throw new RuntimeException('Fixture имеет другую геометрию'); }
$image->setImageProperty('aen:fixture', 'service-region');
$iterator = new ImagickPixelIterator($image);
$iterator->setIteratorLastRow();
$accepted = $iterator->setIteratorFirstRow();
if ($accepted !== true || $iterator->getIteratorRow() !== 0) { throw new RuntimeException('Не первая строка'); }
$value = ['accepted' => true, 'row' => $iterator->getIteratorRow()];
$selectedY = $iterator->getIteratorRow();
$selectedPixels = $iterator->getCurrentIteratorRow();
$rgbRow = array_map(static fn (ImagickPixel $pixel): array => $pixel->getColor(0), $selectedPixels);
$strip = clone $image;
$strip->cropImage(10, 1, 0, $selectedY);
$strip->setImagePage(0, 0, 0, 0);
$path = $outDir . '/selected-row-setiteratorfirstrow.png';
if (!$strip->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Полоса строки не записана'); }
$strip->clear();
$value = ['navigation' => $value, 'selected_y' => $selectedY, 'rgb_row' => $rgbRow, 'file' => basename($path)];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Во втором сценарии выбранная строка превращается в PNG-полосу высотой один пиксель и массив RGB: так проверяют цвет строки, рамки или артефакт импорта. Курсор определяет, какую строку диагностировать. PHP Imagick локально не выполнялся.

Соседние инструменты: ImagickPixelIterator::getCurrentIteratorRow, ImagickPixelIterator::getIteratorRow, ImagickPixelIterator::getNextIteratorRow, ImagickPixelIterator::getPreviousIteratorRow.

ImagickPixelIterator::setIteratorLastRowначать обратный проход снизу

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixelIterator::setIteratorLastRow(): bool

Потребность. начать обратный проход снизу.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixelIterator::setIteratorLastRow(): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixelIterator::setIteratorLastRow(): bool

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: последний y равен height-1.

Когда выбрать другое. setIteratorRow(height-1).

Если пример меняет pixel-wand, он вызывает syncIterator() на каждой изменённой строке и затем читает контрольный пиксель из Imagick.

Минимум: начать обратный проход снизуПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(6, 4, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(2, 1, 4, 2);
$image->drawImage($draw);
$draw->clear();
$iterator = new ImagickPixelIterator($image);
$accepted = $iterator->setIteratorLastRow();
if ($accepted !== true || $iterator->getIteratorRow() !== 3) { throw new RuntimeException('Не последняя строка'); }
$value = ['accepted' => true, 'row' => $iterator->getIteratorRow()];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: сохранить выбранную строку для диагностикиПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(10, 6, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(3, 2, 7, 4);
$image->drawImage($draw);
$draw->clear();
$geometry = ['width' => $image->getImageWidth(), 'height' => $image->getImageHeight()];
if ($geometry !== ['width' => 10, 'height' => 6]) { throw new RuntimeException('Fixture имеет другую геометрию'); }
$image->setImageProperty('aen:fixture', 'service-region');
$iterator = new ImagickPixelIterator($image);
$accepted = $iterator->setIteratorLastRow();
if ($accepted !== true || $iterator->getIteratorRow() !== 5) { throw new RuntimeException('Не последняя строка'); }
$value = ['accepted' => true, 'row' => $iterator->getIteratorRow()];
$selectedY = $iterator->getIteratorRow();
$selectedPixels = $iterator->getCurrentIteratorRow();
$rgbRow = array_map(static fn (ImagickPixel $pixel): array => $pixel->getColor(0), $selectedPixels);
$strip = clone $image;
$strip->cropImage(10, 1, 0, $selectedY);
$strip->setImagePage(0, 0, 0, 0);
$path = $outDir . '/selected-row-setiteratorlastrow.png';
if (!$strip->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Полоса строки не записана'); }
$strip->clear();
$value = ['navigation' => $value, 'selected_y' => $selectedY, 'rgb_row' => $rgbRow, 'file' => basename($path)];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Во втором сценарии выбранная строка превращается в PNG-полосу высотой один пиксель и массив RGB: так проверяют цвет строки, рамки или артефакт импорта. Курсор определяет, какую строку диагностировать. PHP Imagick локально не выполнялся.

Соседние инструменты: ImagickPixelIterator::getCurrentIteratorRow, ImagickPixelIterator::getIteratorRow, ImagickPixelIterator::getNextIteratorRow, ImagickPixelIterator::getPreviousIteratorRow.

ImagickPixelIterator::setIteratorRowперейти к известному y без полного обхода

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixelIterator::setIteratorRow(int $row): bool

Потребность. перейти к известному y без полного обхода.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixelIterator::setIteratorRow(int $row): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixelIterator::setIteratorRow(int $row): bool

ПараметрТипСмысл
$rowintНулевой y строки; допустимо 0…height-1.

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: row вне 0…height-1 должен считаться ошибкой входа.

Когда выбрать другое. region iterator для прямоугольника.

Если пример меняет pixel-wand, он вызывает syncIterator() на каждой изменённой строке и затем читает контрольный пиксель из Imagick.

Минимум: перейти к известному y без полного обходаПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(6, 4, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(2, 1, 4, 2);
$image->drawImage($draw);
$draw->clear();
$iterator = new ImagickPixelIterator($image);
$accepted = $iterator->setIteratorRow(1);
if ($accepted !== true || $iterator->getIteratorRow() !== 1) { throw new RuntimeException('Переход не выполнен'); }
$value = ['accepted' => true, 'row' => $iterator->getIteratorRow(), 'columns' => count($iterator->getCurrentIteratorRow())];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: сохранить выбранную строку для диагностикиПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(10, 6, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(3, 2, 7, 4);
$image->drawImage($draw);
$draw->clear();
$geometry = ['width' => $image->getImageWidth(), 'height' => $image->getImageHeight()];
if ($geometry !== ['width' => 10, 'height' => 6]) { throw new RuntimeException('Fixture имеет другую геометрию'); }
$image->setImageProperty('aen:fixture', 'service-region');
$iterator = new ImagickPixelIterator($image);
$accepted = $iterator->setIteratorRow(4);
if ($accepted !== true || $iterator->getIteratorRow() !== 4) { throw new RuntimeException('Переход не выполнен'); }
$value = ['accepted' => true, 'row' => $iterator->getIteratorRow(), 'columns' => count($iterator->getCurrentIteratorRow())];
$selectedY = $iterator->getIteratorRow();
$selectedPixels = $iterator->getCurrentIteratorRow();
$rgbRow = array_map(static fn (ImagickPixel $pixel): array => $pixel->getColor(0), $selectedPixels);
$strip = clone $image;
$strip->cropImage(10, 1, 0, $selectedY);
$strip->setImagePage(0, 0, 0, 0);
$path = $outDir . '/selected-row-setiteratorrow.png';
if (!$strip->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('Полоса строки не записана'); }
$strip->clear();
$value = ['navigation' => $value, 'selected_y' => $selectedY, 'rgb_row' => $rgbRow, 'file' => basename($path)];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Во втором сценарии выбранная строка превращается в PNG-полосу высотой один пиксель и массив RGB: так проверяют цвет строки, рамки или артефакт импорта. Курсор определяет, какую строку диагностировать. PHP Imagick локально не выполнялся.

Соседние инструменты: ImagickPixelIterator::getCurrentIteratorRow, ImagickPixelIterator::getIteratorRow, ImagickPixelIterator::getNextIteratorRow, ImagickPixelIterator::getPreviousIteratorRow.

ImagickPixelIterator::syncIteratorзафиксировать изменённую строку в pixel cache

доступно: PECL imagick 2, PECL imagick 3 · imagick

ImagickPixelIterator::syncIterator(): bool

Потребность. зафиксировать изменённую строку в pixel cache.

Модель вызова
  1. Подготовить самодостаточный цвет/изображение/маску.
  2. Вызвать ImagickPixelIterator::syncIterator(): bool.
  3. Проверить return и наблюдаемый эффект; при изменении изображения записать и перечитать результат.

Сигнатура: ImagickPixelIterator::syncIterator(): bool

ПараметрТипСмысл
—нет параметровМетод работает с текущим состоянием объекта.

Возвращает. Returns true on success.

Ошибки и границы. Специальный errors-блок отсутствует; неверный цвет, geometry, состояние iterator или kernel может привести к Imagick*Exception либо false согласно конкретной версии. Практический риск: без вызова setColor может не попасть в итоговый файл.

Когда выбрать другое. ImagickDraw для геометрических примитивов.

Если пример меняет pixel-wand, он вызывает syncIterator() на каждой изменённой строке и затем читает контрольный пиксель из Imagick.

Минимум: зафиксировать изменённую строку в pixel cacheПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(6, 4, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(2, 1, 4, 2);
$image->drawImage($draw);
$draw->clear();
$iterator = new ImagickPixelIterator($image);
if (!$iterator->setIteratorRow(1)) { throw new RuntimeException('Строка 1 недоступна'); }
$row = $iterator->getCurrentIteratorRow();
$row[2]->setColor('#ffffff');
$accepted = $iterator->syncIterator();
if ($accepted !== true) { throw new RuntimeException('Строка не синхронизирована'); }
$actual = $image->getImagePixelColor(2, 1)->getColor(1);
if ($actual['r'] < 0.95 || $actual['g'] < 0.95 || $actual['b'] < 0.95) { throw new RuntimeException('Пиксель не изменился'); }
$path = $outDir . '/sync-iterator-single.png';
if (!$image->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('PNG не записан'); }
$value = ['accepted' => true, 'file' => basename($path), 'pixel' => $actual];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Код вызывает метод напрямую и проверяет тип, диапазон либо round-trip читаемым getter. Native Imagick runtime на этой машине не заявлен.

Практика: применение и наблюдаемый результатПример для указанного окружения
<?php
declare(strict_types=1);

$outDir = __DIR__ . '/out';
if (!is_dir($outDir) && !mkdir($outDir, 0775, true) && !is_dir($outDir)) {
    throw new RuntimeException('Не удалось создать каталог результата');
}
$image = new Imagick();
$image->newImage(10, 6, new ImagickPixel('#102a43'), 'png');
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#ef476f'));
$draw->rectangle(3, 2, 7, 4);
$image->drawImage($draw);
$draw->clear();
$geometry = ['width' => $image->getImageWidth(), 'height' => $image->getImageHeight()];
if ($geometry !== ['width' => 10, 'height' => 6]) { throw new RuntimeException('Fixture имеет другую геометрию'); }
$image->setImageProperty('aen:fixture', 'service-region');
$iterator = new ImagickPixelIterator($image);
$changed = 0;
foreach ($iterator as $y => $row) {
    foreach ($row as $x => $pixel) {
        if ($x >= 2 && $x <= 7 && $y >= 1 && $y <= 4) { $pixel->setColor('#06d6a0'); $changed++; }
    }
    $accepted = $iterator->syncIterator();
    if ($accepted !== true) { throw new RuntimeException('Строка не синхронизирована'); }
}
if ($changed !== 24) { throw new RuntimeException('Изменено не 24 пикселя'); }
$actual = $image->getImagePixelColor(3, 2)->getColor(1);
if ($actual['g'] < 0.7) { throw new RuntimeException('Region не перекрашен'); }
$path = $outDir . '/sync-iterator-region.png';
if (!$image->writeImage($path) || !is_file($path) || filesize($path) === 0) { throw new RuntimeException('PNG не записан'); }
$value = ['accepted' => true, 'file' => basename($path), 'pixel' => $actual];
echo json_encode(['value' => $value], JSON_THROW_ON_ERROR), PHP_EOL;
$iterator->clear();
$image->clear();

Вторая задача использует другое изображение, region или kernel. Там, где действие меняет изображение, код пишет непустой PNG и печатает наблюдаемые значения; фактический запуск отложен до совместимой Imagick-сборки.

Соседние инструменты: ImagickPixelIterator::getCurrentIteratorRow, ImagickPixelIterator::getIteratorRow, ImagickPixelIterator::getNextIteratorRow, ImagickPixelIterator::getPreviousIteratorRow.

Источники и обсуждения

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

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

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

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