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

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

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

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

Глава 358 · После уровней и alpha

Imagick: арифметика, цветовая матрица и функция канала

Цветовой вариант каталога, защищённый SKU и явные кривые цвета/alpha.

Сохранить цветовой вариант и прозрачную отметку

Нужен другой цветовой вариант каталога и полупрозрачная отметка поверх него, причём служебный SKU должен оставаться читаемым. Начнём с простой прибавки красного, затем смешаем компоненты и зададим свою кривую средних тонов. Готовые файлы можно вставить в памятку или передать как изображения; для одного внешнего вида страницы иногда достаточно CSS.

RGB хранит красную, зелёную и синюю компоненты. RGBA добавляет alpha — вклад пикселя от 0 до 1: 0 прозрачен, 1 непрозрачен. Исходный каталог — RGB, отдельный авторский слой — RGBA с известными промежуточными значениями и прозрачным отверстием.

Точный собственный каталог 400×320 со шкалой и цветными образцами. Старая надпись PNG8 здесь означает 8 бит на RGB-компоненту, color-type 2, а не индексированный PNG.
Точный собственный каталог 400×320 со шкалой и цветными образцами. Старая надпись PNG8 здесь означает 8 бит на RGB-компоненту, color-type 2, а не индексированный PNG.
Первый оформительский результат: красная компонента немного увеличена, геометрия каталога сохранена
Первый оформительский результат: красная компонента немного увеличена, геометрия каталога сохранена

Напечатанные RGB-числа, названия цветов и подписи шкалы — часть исходного рисунка. Методы меняют пиксели, но не переписывают текст; подпись под изменённой плашкой не является измерением её нового цвета. Актуальные значения задаются вызовами и сравнительной схемой. Слой overlay нарисован отдельно, без трёх изучаемых методов и без автоматического удаления фона.

Обозначение до схемыЗначение
c, Q и xc — текущее значение одной компоненты; Q=QuantumRange — внутренний максимум, в проверенной Q16-сборке 65535. x=c/Q — перевод в безразмерную шкалу 0..1. Выходной PNG имеет 8 бит на компоненту, то есть 0..255.
Оператор и константаADD прибавляет Quantum-значение: 0.04×Q=2621.4. MULTIPLY умножает на безразмерный фактор 1.2 или 0.45. Нельзя автоматически считать всякое число процентом.
МатрицаТаблица числовых коэффициентов: строка задаёт выходную компоненту, столбец — входную. Порядок R/G/B/K/A и смещение; K — чёрный CMYK, A — alpha. Коэффициент показывает, какую долю входа добавить. Смещение в шестом столбце умножается на Q.
ПолиномСумма степеней x с коэффициентами. x²=x×x, x³=x×x×x; y — результат в шкале 0..1, c′=Q×y. В [0.5,0.5,0] идут коэффициенты x², x и постоянного члена. Это математика значений, не движение или размытие края.

Матрица — таблица коэффициентов. Строку читаем слева направо; каждая её позиция умножает соответствующий вход. R′, G′ и B′ обозначают выходные значения красной, зелёной и синей компонент. Для RGB(120,80,40) первая строка [0.9,0.1,0,0,0,0.03] даёт R′=0.9×120+0.1×80+0.03×255=123.65 в шкале выходного 8-битного файла до округления. Остальные строки дают G′=80 и B′=40. Здесь 0.03 — доля диапазона, не прибавка 0.03 из 255. На внутренних значениях прибавляется 0.03×Q. Наша 6×6 таблица:

Выход / входRGBKAСмещение
R′0.90.10000.03
G′0.050.90.05000
B′00.10.8000
K′000100
A′000010
Служебная строка000001

В формулах знак ′ обозначает новое значение. Ограничение, или clamp, оставляет результат между 0 и Q; значения выше/ниже теряются. В строках K и A единица оставляет соответствующий вход, но у обычного sRGB нет K. Последняя строка 6×6 не создаёт отдельный выходной канал и не используется как делитель.

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

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

В $image уже есть независимая копия входа. $ начинает имя переменной, -> вызывает метод, скобки содержат аргументы, запятые их разделяют, ; завершает команду. Imagick::ИМЯ — константа класса; :: связывает имя класса и константу. Число 0.04 записано с десятичной точкой; * выполняет умножение. Выбранный оператор преобразует каждую выбранную компоненту с одной константой. ADD прибавляет значение, MULTIPLY умножает; это разные правила даже при похожем оформительском результате.

Сначала получаем Q у своей сборки: Imagick::getQuantumRange() — статический метод класса; $range["quantumRangeLong"] читает элемент возвращённого массива по ключу. Q16 в проверке равен 65535; код не предполагает этого для всех серверов.

$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$image->evaluateImage(Imagick::EVALUATE_ADD, 0.04 * $Q, Imagick::CHANNEL_RED);

Метод меняет $image и возвращает bool true, а не новый bitmap. Не присваивайте bool вместо изображения. Clone создаёт отдельную копию; обычное присваивание объекта даёт ему ещё одно имя. If с ! проверяет отказ, throw new RuntimeException прерывает цепочку. Связи: объект и метод, массивы, clone, исключения.

Полная программа начинается с <?php и declare(strict_types=1): PHP и строгая передача типов. Require подключает channel-fixture.php из __DIR__, папки программы. Две load-функции восстанавливают точные source.png и overlay.png по Base64/SHA256. Операция | объединяет маски RED, GREEN и BLUE в $rgbChannels; она не складывает значения пикселей. SaveChannelComparison собирает целые панели и печатает имя PNG. Для запуска нужны example.php, оба .b64 и helper; детали помощника открыты после результата.

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

require __DIR__ . '/channel-fixture.php';
$source = loadChannelSource();
$overlay = loadChannelOverlay();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$rgbChannels = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$image = clone $source;
if (!$image->evaluateImage(Imagick::EVALUATE_ADD, 0.04 * $Q, Imagick::CHANNEL_RED)) {
    throw new RuntimeException('Не выполнен evaluateImage');
}
saveChannelComparison([$source, $image], 'math-first.png');
$source->clear();
$image->clear();
$overlay->clear();

Результат: Слева исходник, справа прибавка 0.04×Q только к красной компоненте. Это простой оформительский вариант, не автоматическая коррекция баланса белого. Для запуска распакуйте example.php, channel-fixture.php, source.png.b64 и overlay.png.b64 вместе, сохранив остальные файлы архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Оба точных PNG восстанавливаются помощником по Base64/SHA256 во всех программах, без сети и шрифтов. Stdout содержит math-first.png и перевод строки. Откройте PNG просмотрщиком: полные панели 400×320 идут слева направо без изменения размеров. Отдельные RGBA-файлы не содержат фоновое изображение сравнения.

Ожидаемый вывод
math-first.png
Полный channel-fixture.php из каждого ZIP
<?php
declare(strict_types=1);

function loadChannelSource(): Imagick
{
    $encoded = file_get_contents(__DIR__ . '/source.png.b64');
    if ($encoded === false) {
        throw new RuntimeException('Не найден source.png.b64: распакуйте весь архив');
    }
    $bytes = base64_decode($encoded, true);
    if ($bytes === false || hash('sha256', $bytes) !== '453b22e19273f2fdd54ec6a7f0cd9e96a7b08c70cc4cc854838d1428fea207c6') {
        throw new RuntimeException('Повреждён исходный PNG');
    }
    $path = __DIR__ . '/source.png';
    if (file_put_contents($path, $bytes) !== strlen($bytes)) {
        throw new RuntimeException('Не удалось восстановить source.png');
    }
    return new Imagick($path);
}

function loadChannelOverlay(): Imagick
{
    $encoded = file_get_contents(__DIR__ . '/overlay.png.b64');
    if ($encoded === false) {
        throw new RuntimeException('Не найден overlay.png.b64: распакуйте весь архив');
    }
    $bytes = base64_decode($encoded, true);
    if ($bytes === false || hash('sha256', $bytes) !== 'ba7be41405eec777d3d0fc97f45aafb80637d90b0c883b1d4cfc684d26527866') {
        throw new RuntimeException('Повреждён исходный PNG');
    }
    $path = __DIR__ . '/overlay.png';
    if (file_put_contents($path, $bytes) !== strlen($bytes)) {
        throw new RuntimeException('Не удалось восстановить overlay.png');
    }
    return new Imagick($path);
}

function saveChannelComparison(array $panels, string $filename): void
{
    if ($panels === []) {
        throw new InvalidArgumentException('Нужна хотя бы одна панель');
    }
    $width = 0;
    $height = 0;
    foreach ($panels as $panel) {
        if (!$panel instanceof Imagick) {
            throw new InvalidArgumentException('Панель должна быть объектом Imagick');
        }
        $width += $panel->getImageWidth();
        $height = max($height, $panel->getImageHeight());
    }
    $output = new Imagick();
    $output->newImage($width, $height, 'white');
    $output->setImageFormat('png');
    $left = 0;
    foreach ($panels as $panel) {
        $top = intdiv($height - $panel->getImageHeight(), 2);
        if (!$output->compositeImage($panel, Imagick::COMPOSITE_OVER, $left, $top)) {
            throw new RuntimeException('Не удалось собрать полное сравнение');
        }
        $left += $panel->getImageWidth();
    }
    $output->setImageDepth(8);
    $output->setOption('png:color-type', '2');
    if (!$output->writeImage(__DIR__ . '/' . $filename)) {
        throw new RuntimeException('Не удалось записать результат');
    }
    $output->clear();
    echo $filename, "\n";
}

function channelPreview(Imagick $source, Imagick $overlay): Imagick
{
    $preview = clone $source;
    if (!$preview->compositeImage($overlay, Imagick::COMPOSITE_OVER, 0, 0)) {
        throw new RuntimeException('Не удалось собрать preview');
    }
    return $preview;
}

Function объявляет функцию, return возвращает её результат; : Imagick — тип изображения, void — отсутствие возвращаемого результата. Массив $panels хранит панели, foreach их перебирает. Base64_decode восстанавливает байты, hash проверяет SHA256, file_put_contents пишет PNG. ChannelPreview клонирует каталог и накладывает слой OVER: это отдельное непрозрачное сравнение, не фон самого RGBA-файла. Помощник не использует evaluate/colorMatrix/function для скрытой подготовки, не ищет шрифты и не обращается к сети. Основы: функции, массивы, alpha и OVER.

Различить прибавку, смешивание и собственную функцию

У арифметики один выбранный оператор и одна константа. При ADD красный ноль становится положительным; при MULTIPLY ноль остаётся нулём. У матрицы каждая выходная компонента может зависеть от нескольких входных. У function полином вычисляется отдельно по значению каждой выбранной компоненты; он не читает соседние пиксели.

До следующей полной программы: $image, $matrixImage и $curve — независимые clone каталога; $matrix — плоская таблица выше, $Q — максимум своей сборки. | объединяет маски. FUNCTION_POLYNOMIAL — числовая константа библиотеки, не PHP callable и не строка с формулой:

$image->evaluateImage(Imagick::EVALUATE_ADD, 0.04 * $Q, Imagick::CHANNEL_RED);
$matrixImage->colorMatrixImage($matrix);
$curve->functionImage(Imagick::FUNCTION_POLYNOMIAL, [0.5, 0.5, 0.0], $rgbChannels);
Разделить арифметику, смешивание каналов и тоновую кривуюПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/channel-fixture.php';
$source = loadChannelSource();
$overlay = loadChannelOverlay();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$rgbChannels = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$image = clone $source;
if (!$image->evaluateImage(Imagick::EVALUATE_ADD, 0.04 * $Q, Imagick::CHANNEL_RED)) {
    throw new RuntimeException('Не выполнен evaluateImage');
}
$matrix = [
    0.9, 0.1, 0.0, 0.0, 0.0, 0.03,
    0.05, 0.9, 0.05, 0.0, 0.0, 0.0,
    0.0, 0.1, 0.8, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 1.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 1.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 1.0,
];
$matrixImage = clone $source;
if (!$matrixImage->colorMatrixImage($matrix)) {
    throw new RuntimeException('Не выполнен colorMatrixImage');
}
$curve = clone $source;
if (!$curve->functionImage(Imagick::FUNCTION_POLYNOMIAL, [0.5, 0.5, 0.0], $rgbChannels)) {
    throw new RuntimeException('Не выполнен functionImage');
}
saveChannelComparison([$source, $image, $matrixImage, $curve], 'math-controls.png');
$source->clear();
$image->clear();
$matrixImage->clear();
$curve->clear();
$overlay->clear();

Результат: Исходник; прибавка к красному; смесь RGB по матрице; полином для трёх RGB-компонент. Все полные панели 400×320, слева направо именно в этом порядке. Для запуска распакуйте example.php, channel-fixture.php, source.png.b64 и overlay.png.b64 вместе, сохранив остальные файлы архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Оба точных PNG восстанавливаются помощником по Base64/SHA256 во всех программах, без сети и шрифтов. Stdout содержит math-controls.png и перевод строки. Откройте PNG просмотрщиком: полные панели 400×320 идут слева направо без изменения размеров. Отдельные RGBA-файлы не содержат фоновое изображение сравнения.

Ожидаемый вывод
math-controls.png

Выбрать единицы и сохранить прозрачное отверстие

Первая практика сравнивает ADD и MULTIPLY только красного канала. Это помогает выбрать оформительское правило: прибавка поднимает тёмные красные значения на одну величину, множитель меняет их пропорционально. Ни один вариант автоматически не восстанавливает физически правильный цвет товара.

Прибавка 0.04×Q и множитель 1.2 — разные единицы и разные результаты, остальные RGB-компоненты сохранены
Прибавка 0.04×Q и множитель 1.2 — разные единицы и разные результаты, остальные RGB-компоненты сохранены

Другая задача — сделать готовую отметку менее заметной, сохранив её прозрачное отверстие. У исходного overlay есть alpha 0/64/128/192/255 в 8-битных образцах. MULTIPLY 0.45 применяется только к ALPHA, RGB остаются исходными; нулевой вклад остаётся нулевым. В сохранённом RGBA получились значения 0/28/57/86/114 с учётом квантования до 8 бит.

Исходный RGBA-слой и его ослабленная версия; вид поверх каталога показан отдельно от прозрачных файлов
Исходный RGBA-слой и его ослабленная версия; вид поверх каталога показан отдельно от прозрачных файлов

Это отличается от SET или глобального присваивания новой alpha: присваивание 0.45 всем пикселям заполнило бы прежде прозрачное место. Overlay-faded.png сохраняется отдельно в RGBA. Два полных запуска: арифметика красного и alpha слоя. Выбор маски — часть смысла операции, а не последний необязательный штрих.

Смешать цвет и защитить маркировку

Матрица полезна для повторяемого цветового оформления, где новое значение складывается из долей разных компонент. В нашей таблице красный смешивает 90% R и 10% G с прибавкой 0.03×Q; синий получает 10% G и 80% B. Это выбранная художественная смесь, не эталонная цветокоррекция или палитровое сопоставление.

Матрица всего каталога и та же матрица только у иллюстрации: вне ROI служебные пиксели сохранены
Матрица всего каталога и та же матрица только у иллюстрации: вне ROI служебные пиксели сохранены

Глобальная версия меняет и фон, и текст. Для согласованной карточки обрабатываем только область 352×132 в (24,88). CropImage принимает ширину, высоту, x, y; setImagePage(0,0,0,0) сбрасывает виртуальную позицию вырезки. Затем compositeImage возвращает её OVER в (24,88). SKU вне прямоугольника точен. ROI задан автором макета, не найден распознаванием. Программы: цветовая смесь и защищённый макет.

Единица на диагонали означает «взять этот вход целиком», нули — «не добавлять». Транспонирование строк и столбцов даст другой эффект. Пятая строка отвечает за alpha, четвёртая — за K; копировать чужую RGBA-матрицу из другой системы без проверки позиций нельзя. Матрица не является окном размытия, несмотря на похожий квадратный вид.

Задать свою кривую цвета или alpha

Собственная тоновая кривая y=0.5x²+0.5x делает средние значения темнее, сохраняя крайние 0/1. Например, x=0.5 становится 0.375. Это более явное правило, чем попытка угадать, что означает чужой регулятор «контраст». Коэффициенты записаны от старшей степени к свободному члену.

Полином для RGB и отдельная S-кривая alpha слоя; прозрачные крайние значения сохраняются
Полином для RGB и отдельная S-кривая alpha слоя; прозрачные крайние значения сохраняются

Во второй практике нужен другой профиль промежуточной alpha, а не равномерное ослабление. Полином [-2,3,0,0] даёт y=3x²−2x³: четверть становится примерно 0.156, три четверти — примерно 0.844, а 0/1 остаются. Исходные 8-битные образцы 64/128/192 дали сохранённые значения 40/128/215 с учётом квантования; крайние 0/255 сохранились. Это покомпонентная S-кривая alpha, не пространственное размытие контура и не гарантия «смягчить» любую картинку.

Overlay-curved.png хранит самостоятельный слой. Его RGB не перекрашены, меняется вклад при OVER поверх каталога. Программы: тоновые коэффициенты и профиль alpha. Для перемещения рисунка по карте затем нужна отдельная геометрическая операция; одна functionImage пиксели не переносит.

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

СитуацияЧто проверить
Вместо небольшой прибавки всё белоеКонстанта ADD имеет Quantum-единицы; множитель MULTIPLY безразмерен. Оператор определяет шкалу.
Матрица не принятаНужен один плоский массив из 25/36 чисел. Порядок R/G/B/K/A/bias отличается от Canvas/Flash и геометрической матрицы.
Из RGB не появилась прозрачностьМатрица не обязана активировать alpha. Подготовка активного непрозрачного канала проверена отдельно на контрольном изображении. Обе основные программы с матрицей меняют RGB; готовый RGBA-слой используется в программах evaluateImage и functionImage.
Прозрачное отверстие стало заметнымПроверьте, не присвоили ли alpha всем пикселям через SET. Умножение текущей alpha сохраняет нули.
Вернулось true с неожиданным чёрнымЧисловой enum может не проверяться как whitelist. В контроле неизвестные op/function дали чёрный RGB без исключения.
Нужно повторить браузерный фильтрСогласуйте точную формулу, каналы и цветовое пространство. Локальный PNG не является доказательством совпадения с любым CSS или Canvas-рендерером.

Default в контрольном RGBA-изображении менял и RGB, и alpha для evaluate/function. В главных программах маски заданы явно; это не универсальная гарантия для произвольных каналов или цвета. RGB и RGBA сохраняются с 8 битами на компоненту (PNG color-type 2/6), не как индексированная палитра. Отсечение и квантование необратимы; исходник нужно сохранять отдельно.

В программах фиксированные числовые массивы. Не утверждаем, что любой нечисловой элемент автоматически вызывает ошибку: обёртка умеет приводить значения к double. Внешняя finite/numeric-валидация — ваша отдельная политика. Пустые массивы/неверный размер/строка вместо function enum проверены отдельно. Не используйте неподтверждённую константу только потому, что её имя похоже на группу каналов.

Исторический recolorImage остаётся отдельным узлом руководства, deprecated с PECL 3.4.4. Его прежние размеры/поведение нельзя механически переносить на colorMatrixImage; новый блок не исключает старый метод из общего объёма. Проверена локальная обработка и запись PNG, без HTTP, скорости, печатной сертификации и загрузки недоверенных файлов.

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

Один оператор → evaluate; смесь компонент → matrix; собственная кривая → function; alpha и ROI задают область изменения
Один оператор → evaluate; смесь компонент → matrix; собственная кривая → function; alpha и ROI задают область изменения

Упражнение: сделать слой вдвое менее заметным, не изменяя его RGB и не заполняя отверстие. Решение: в evaluate-workflow заменить множитель 0.45 на 0.5, сохранив CHANNEL_ALPHA. Проверить, что alpha 0 осталась 0, RGB совпали с входом, а остальные значения приблизительно поделились на два с округлением. Это новая версия программы: после изменения её нужно выполнить, сохранённые здесь свидетельства относятся к исходным восьми определениям.

Для соседних задач: уровни и готовая S-кривая, выбор по цвету и связной области, фиксированная палитра и CLUT, сборка прозрачного слоя на карточке. Сначала определите, меняется цвет, вклад слоя или только известная часть макета.

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

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

Imagick::evaluateImageВыбранный оператор преобразует каждую выбранную компоненту с одной константой. ADD прибавляет значение, MULTIPLY умножает; это разные правила даже при похожем оформительском результате.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::evaluateImage(int $op, float $constant, int $channel = Imagick::CHANNEL_DEFAULT): bool

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

В $image уже есть независимая копия входа. $ начинает имя переменной, -> вызывает метод, скобки содержат аргументы, запятые их разделяют, ; завершает команду. Imagick::ИМЯ — константа класса; :: связывает имя класса и константу. Число 0.04 записано с десятичной точкой; * выполняет умножение. Выбранный оператор преобразует каждую выбранную компоненту с одной константой. ADD прибавляет значение, MULTIPLY умножает; это разные правила даже при похожем оформительском результате.

Сначала получаем Q у своей сборки: Imagick::getQuantumRange() — статический метод класса; $range["quantumRangeLong"] читает элемент возвращённого массива по ключу. Q16 в проверке равен 65535; код не предполагает этого для всех серверов.

$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$image->evaluateImage(Imagick::EVALUATE_ADD, 0.04 * $Q, Imagick::CHANNEL_RED);

Метод меняет $image и возвращает bool true, а не новый bitmap. Не присваивайте bool вместо изображения. Clone создаёт отдельную копию; обычное присваивание объекта даёт ему ещё одно имя. If с ! проверяет отказ, throw new RuntimeException прерывает цепочку. Связи: объект и метод, массивы, clone, исключения.

Полная официальная сигнатура

Imagick::evaluateImage(int $op, float $constant, int $channel = Imagick::CHANNEL_DEFAULT): bool
АргументЕдиницы и ограничения
$opОбязательный int-константа оператора, здесь EVALUATE_ADD или EVALUATE_MULTIPLY. Это не строка PHP-выражения. Числовые значения enum не стоит записывать вручную.
$constantОбязательный float; единицы зависят от op. ADD/SUBTRACT/SET/MIN/MAX/THRESHOLD используют Quantum-значение; MULTIPLY/DIVIDE — безразмерный фактор, POW — степень для c/Q. Логические/битовые и шумовые операторы имеют свои правила, не общую процентную шкалу.
$channelНеобязательная int-маска CHANNEL_DEFAULT. RED меняет красный, ALPHA — alpha. Маски сочетаются битовой операцией |; для RGB используем RED | GREEN | BLUE. В этой IM7-сборке константа CHANNEL_RGB отсутствует. Default может затронуть alpha, что показала отдельная проверка.

Официальная доступность: PECL imagick 2, PECL imagick 3. Операция изменяет текущий объект и возвращает bool true при успехе, размеры растра сохраняются. Пустое изображение и нативный отказ дают ImagickException; неправильные PHP-типы/число аргументов могут дать TypeError/ArgumentCountError. True сам по себе не подтверждает выбранную пользователем математику или наличие изменений.

Крайние результаты ограничиваются допустимым диапазоном, поэтому потерянные после отсечения оттенки не восстанавливаются обратной формулой. Во внешнем приложении отдельно нужны whitelist операторов/функций, конечные числовые коэффициенты, выбранные диапазоны и лимиты площади/кадров/памяти. Такая форма валидации здесь не реализована. Издержки зависят от площади, копий и формулы; скорость, размер файла и цветопроба печати не измерялись.

Полный официальный XML: описание, все параметры, return, ошибки, примеры и ссылки
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xml:id="imagick.evaluateimage" xmlns="http://docbook.org/ns/docbook">
 <refnamediv>
  <refname>Imagick::evaluateImage</refname>
  <refpurpose>Applies an expression to an image</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::evaluateImage</methodname>
   <methodparam><type>int</type><parameter>op</parameter></methodparam>
   <methodparam><type>float</type><parameter>constant</parameter></methodparam>
   <methodparam choice="opt"><type>int</type><parameter>channel</parameter><initializer>Imagick::CHANNEL_DEFAULT</initializer></methodparam>
  </methodsynopsis>
  <simpara>
   Applies an arithmetic, relational, or logical expression to an image.  Use
   these operators to lighten or darken an image, to increase or decrease
   contrast in an image, or to produce the "negative" of an image.
  </simpara>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>op</parameter></term>
     <listitem>
      <para>
      The evaluation operator
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>constant</parameter></term>
     <listitem>
      <para>
      The value of the operator
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>channel</parameter></term>
     <listitem>
      <para>
       Provide any channel constant that is valid for your channel mode. To
       apply to more than one channel, combine channeltype constants using
       bitwise operators. Refer to this
       list of  <link linkend="imagick.constants.channel">channel constants</link>.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

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

 <refsect1 role="errors">
  &reftitle.errors;
  <para>
   &imagick.imagick.throws;
  </para>
 </refsect1>
 
 <refsect1 role="examples">
  &reftitle.examples;
  <para>
  <example>
   <title>Using <function>Imagick::evaluateImage</function></title>
   <para>
    Using evaluateImage to reduce opacity in an image.
   </para>
   <programlisting role="php">
<![CDATA[
<?php
// Create new object with the image
$im = new Imagick('example-alpha.png');

// Reduce the alpha by 50%
$im->evaluateImage(Imagick::EVALUATE_DIVIDE, 2, Imagick::CHANNEL_ALPHA);

// Output the image
header("Content-Type: image/png");
echo $im;
?>
]]>
   </programlisting>
  </example>
 </para>
 </refsect1>

</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

Официальные HTTP-примеры сохранены целиком. Наши программы записывают локальные PNG; MIME header сам по себе изображение не перекодирует, HTTP-доставка здесь не проверялась. Основы: файлы и запись, HTTP-ответ.

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

require __DIR__ . '/channel-fixture.php';
$source = loadChannelSource();
$overlay = loadChannelOverlay();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$rgbChannels = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$image = clone $source;
if (!$image->evaluateImage(Imagick::EVALUATE_ADD, 0.04 * $Q, Imagick::CHANNEL_RED)) {
    throw new RuntimeException('Не выполнен evaluateImage');
}
$multiply = clone $source;
if (!$multiply->evaluateImage(Imagick::EVALUATE_MULTIPLY, 1.2, Imagick::CHANNEL_RED)) {
    throw new RuntimeException('Не выполнен evaluateImage');
}
saveChannelComparison([$source, $image, $multiply], 'evaluate-units.png');
$source->clear();
$image->clear();
$multiply->clear();
$overlay->clear();

Результат: Исходник; ADD 0.04×Q в красном канале; MULTIPLY 1.2 в том же канале. У прибавки меняется и чёрный, у умножения ноль остаётся нулём; светлые значения могут ограничиваться максимумом. Для запуска распакуйте example.php, channel-fixture.php, source.png.b64 и overlay.png.b64 вместе, сохранив остальные файлы архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Оба точных PNG восстанавливаются помощником по Base64/SHA256 во всех программах, без сети и шрифтов. Stdout содержит evaluate-units.png и перевод строки. Откройте PNG просмотрщиком: полные панели 400×320 идут слева направо без изменения размеров. Отдельные RGBA-файлы не содержат фоновое изображение сравнения.

Ожидаемый вывод
evaluate-units.png
Ослабить прозрачный слой и сохранить отверстиеПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/channel-fixture.php';
$source = loadChannelSource();
$overlay = loadChannelOverlay();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$rgbChannels = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$faded = clone $overlay;
if (!$faded->evaluateImage(Imagick::EVALUATE_MULTIPLY, 0.45, Imagick::CHANNEL_ALPHA)) {
    throw new RuntimeException('Не выполнен evaluateImage');
}
$faded->setImageFormat('png');
$faded->setImageDepth(8);
$faded->setOption('png:color-type', '6');
if (!$faded->writeImage(__DIR__ . '/overlay-faded.png')) {
    throw new RuntimeException('Не записан overlay-faded.png');
}
$originalPreview = channelPreview($source, $overlay);
$fadedPreview = channelPreview($source, $faded);
saveChannelComparison([$source, $originalPreview, $fadedPreview], 'evaluate-layer.png');
$source->clear();
$originalPreview->clear();
$fadedPreview->clear();
$overlay->clear();
$faded->clear();

Результат: Исходный каталог; исходный слой поверх него; слой после умножения alpha на 0.45 поверх того же каталога. overlay-faded.png сохраняет собственную RGBA без фона просмотра и сохраняет нулевую alpha отверстия. Для запуска распакуйте example.php, channel-fixture.php, source.png.b64 и overlay.png.b64 вместе, сохранив остальные файлы архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Оба точных PNG восстанавливаются помощником по Base64/SHA256 во всех программах, без сети и шрифтов. Stdout содержит evaluate-layer.png и перевод строки. Откройте PNG просмотрщиком: полные панели 400×320 идут слева направо без изменения размеров. Отдельные RGBA-файлы не содержат фоновое изображение сравнения.

Ожидаемый вывод
evaluate-layer.png

Связанный путь: три математические модели, ошибки и ограничения.

Imagick::colorMatrixImageДля каждого пикселя умножает входные компоненты на коэффициенты строки и складывает их в одну выходную компоненту. Строка задаёт выход, столбец — вход; это не поиск цвета и не пространственное окно соседей.

PECL imagick 3 >= 3.3.0 · imagick

Imagick::colorMatrixImage(array $color_matrix): bool

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

В $image уже есть независимая копия входа. $ начинает имя переменной, -> вызывает метод, скобки содержат аргументы, запятые их разделяют, ; завершает команду. Imagick::ИМЯ — константа класса; :: связывает имя класса и константу. Число 0.04 записано с десятичной точкой; * выполняет умножение. Для каждого пикселя умножает входные компоненты на коэффициенты строки и складывает их в одну выходную компоненту. Строка задаёт выход, столбец — вход; это не поиск цвета и не пространственное окно соседей.

Матрица — таблица коэффициентов. Строку читаем слева направо; каждая её позиция умножает соответствующий вход. R′, G′ и B′ обозначают выходные значения красной, зелёной и синей компонент. Для RGB(120,80,40) первая строка [0.9,0.1,0,0,0,0.03] даёт R′=0.9×120+0.1×80+0.03×255=123.65 в шкале выходного 8-битного файла до округления. Остальные строки дают G′=80 и B′=40. Здесь 0.03 — доля диапазона, не прибавка 0.03 из 255. На внутренних значениях прибавляется 0.03×Q. Наша 6×6 таблица:

Выход / входRGBKAСмещение
R′0.90.10000.03
G′0.050.90.05000
B′00.10.8000
K′000100
A′000010
Служебная строка000001

Квадратные скобки создают PHP-массив; запятые отделяют числа. Переносы строк помогают видеть таблицу, но внутри это один плоский список. Присваивание = сохраняет список в $matrix, затем метод читает его.

$matrix = [
    0.9, 0.1, 0.0, 0.0, 0.0, 0.03,
    0.05, 0.9, 0.05, 0.0, 0.0, 0.0,
    0.0, 0.1, 0.8, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 1.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 1.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 1.0,
];
$image->colorMatrixImage($matrix);

Метод меняет $image и возвращает bool true, а не новый bitmap. Не присваивайте bool вместо изображения. Clone создаёт отдельную копию; обычное присваивание объекта даёт ему ещё одно имя. If с ! проверяет отказ, throw new RuntimeException прерывает цепочку. Связи: объект и метод, массивы, clone, исключения.

Полная официальная сигнатура

Imagick::colorMatrixImage(array $color_matrix): bool
АргументЕдиницы и ограничения
$color_matrixОбязательный плоский массив ровно 25 или 36 значений: текущий PHP-wrapper принимает только 5×5 или 6×6, хотя raw говорит о переменном размере. Числа идут строка за строкой; вложенные массивы строк не являются форматом этих примеров.
ПорядокСтолбцы и выходные строки R,G,B,K,A; шестой столбец — смещение, умножаемое на Q. K — чёрная компонента CMYK, не alpha; в sRGB она не используется. Alpha находится на пятой позиции. 5×5 не содержит столбца смещения; 6×6 содержит.
Шестая строкаПередаётся как часть 36 чисел, но не создаёт выходной канал и не делит результат. Это не геометрическая однородная матрица. В нашей матрице она равна [0,0,0,0,0,1]. Channel-аргумента у метода нет.

Официальная доступность: PECL imagick 3 >= 3.3.0. Операция изменяет текущий объект и возвращает bool true при успехе, размеры растра сохраняются. Пустое изображение и нативный отказ дают ImagickException; неправильные PHP-типы/число аргументов могут дать TypeError/ArgumentCountError. True сам по себе не подтверждает выбранную пользователем математику или наличие изменений.

Доступен с PECL Imagick 3.3.0; точный wrapper собирается при IM > 6.6.1. Полный raw с формулировкой variable-sized сохранён ниже, но PHP проверяет ровно 25/36 чисел. Официальное сравнение с Flash требует перенести смещение в шестой столбец и нормировать его: offset/255. Скопированная Canvas-матрица из 20 чисел не становится готовым аргументом PHP. Для RGB→alpha нужно подготовить активную alpha: в пробе неподготовленный RGB остался без alpha, а после ALPHACHANNEL_OPAQUE вычисленные значения появились. Это отдельная подготовка, не свойство любой матрицы.

Крайние результаты ограничиваются допустимым диапазоном, поэтому потерянные после отсечения оттенки не восстанавливаются обратной формулой. Во внешнем приложении отдельно нужны whitelist операторов/функций, конечные числовые коэффициенты, выбранные диапазоны и лимиты площади/кадров/памяти. Такая форма валидации здесь не реализована. Издержки зависят от площади, копий и формулы; скорость, размер файла и цветопроба печати не измерялись.

Полный официальный XML: описание, все параметры, return, ошибки, примеры и ссылки
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->

<refentry xml:id="imagick.colormatriximage" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
 <refnamediv>
  <refname>Imagick::colorMatrixImage</refname>
  <refpurpose>Apply color transformation to an image</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::colorMatrixImage</methodname>
   <methodparam><type>array</type><parameter>color_matrix</parameter></methodparam>
  </methodsynopsis>
  <para>
   Apply color transformation to an image. The method permits saturation changes, hue rotation, luminance to alpha, and various other effects. Although variable-sized transformation matrices can be used, typically one uses a 5x5 matrix for an RGBA image and a 6x6 for CMYKA (or RGBA with offsets). The matrix is similar to those used by Adobe Flash except offsets are in column 6 rather than 5 (in support of CMYKA images) and offsets are normalized (divide Flash offset by 255)
  </para>


 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <variablelist>
   <varlistentry>
    <term><parameter>color_matrix</parameter></term>
    <listitem>
     <para>
      
     </para>
    </listitem>
   </varlistentry>
  </variablelist>
 </refsect1>

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




 <refsect1 role="examples">
  &reftitle.examples;
  <para>
    <example>
      <title> <function>Imagick::colorMatrixImage</function></title>
      <programlisting role="php">
      <![CDATA[
<?php
function colorMatrixImage($imagePath, $colorMatrix) {
    $imagick = new \Imagick(realpath($imagePath));
    $imagick->setImageOpacity(1);

    //A color matrix should look like:
    //    $colorMatrix = [
    //        1.5, 0.0, 0.0, 0.0, 0.0, -0.157,
    //        0.0, 1.0, 0.5, 0.0, 0.0, -0.157,
    //        0.0, 0.0, 1.5, 0.0, 0.0, -0.157,
    //        0.0, 0.0, 0.0, 1.0, 0.0,  0.0,
    //        0.0, 0.0, 0.0, 0.0, 1.0,  0.0,
    //        0.0, 0.0, 0.0, 0.0, 0.0,  1.0
    //    ];

    $background = new \Imagick();
    $background->newPseudoImage($imagick->getImageWidth(), $imagick->getImageHeight(),  "pattern:checkerboard");

    $background->setImageFormat('png');

    $imagick->setImageFormat('png');
    $imagick->colorMatrixImage($colorMatrix);
    
    $background->compositeImage($imagick, \Imagick::COMPOSITE_ATOP, 0, 0);

    header("Content-Type: image/png");
    echo $background->getImageBlob();
}

?>
]]>
      </programlisting>
    </example>
  </para>
 </refsect1>

</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

Официальные HTTP-примеры сохранены целиком. Наши программы записывают локальные PNG; MIME header сам по себе изображение не перекодирует, HTTP-доставка здесь не проверялась. Основы: файлы и запись, HTTP-ответ.

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

require __DIR__ . '/channel-fixture.php';
$source = loadChannelSource();
$overlay = loadChannelOverlay();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$rgbChannels = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$matrix = [
    0.9, 0.1, 0.0, 0.0, 0.0, 0.03,
    0.05, 0.9, 0.05, 0.0, 0.0, 0.0,
    0.0, 0.1, 0.8, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 1.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 1.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 1.0,
];
$image = clone $source;
if (!$image->colorMatrixImage($matrix)) {
    throw new RuntimeException('Не выполнен colorMatrixImage');
}
saveChannelComparison([$source, $image], 'matrix-catalogue.png');
$source->clear();
$image->clear();
$overlay->clear();

Результат: Исходник и конкретная смесь каналов с нормированным смещением в красном. Матрица меняет также фон и маркировку всего кадра; это видимый результат глобального правила. Для запуска распакуйте example.php, channel-fixture.php, source.png.b64 и overlay.png.b64 вместе, сохранив остальные файлы архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Оба точных PNG восстанавливаются помощником по Base64/SHA256 во всех программах, без сети и шрифтов. Stdout содержит matrix-catalogue.png и перевод строки. Откройте PNG просмотрщиком: полные панели 400×320 идут слева направо без изменения размеров. Отдельные RGBA-файлы не содержат фоновое изображение сравнения.

Ожидаемый вывод
matrix-catalogue.png
Изменить иллюстрацию и сохранить SKUПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/channel-fixture.php';
$source = loadChannelSource();
$overlay = loadChannelOverlay();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$rgbChannels = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$matrix = [
    0.9, 0.1, 0.0, 0.0, 0.0, 0.03,
    0.05, 0.9, 0.05, 0.0, 0.0, 0.0,
    0.0, 0.1, 0.8, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 1.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 1.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 1.0,
];
$image = clone $source;
$region = clone $source;
$region->cropImage(352, 132, 24, 88);
$region->setImagePage(0, 0, 0, 0);
if (!$region->colorMatrixImage($matrix)) {
    throw new RuntimeException('Не выполнен colorMatrixImage');
}
if (!$image->compositeImage($region, Imagick::COMPOSITE_OVER, 24, 88)) {
    throw new RuntimeException('Не выполнен compositeImage');
}
saveChannelComparison([$source, $image], 'matrix-protected.png');
$source->clear();
$image->clear();
$overlay->clear();
$region->clear();

Результат: Та же цветовая матрица применена только к иллюстрации 352×132 в (24,88). Вне прямоугольника, включая SKU, исходные пиксели точны. Для запуска распакуйте example.php, channel-fixture.php, source.png.b64 и overlay.png.b64 вместе, сохранив остальные файлы архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Оба точных PNG восстанавливаются помощником по Base64/SHA256 во всех программах, без сети и шрифтов. Stdout содержит matrix-protected.png и перевод строки. Откройте PNG просмотрщиком: полные панели 400×320 идут слева направо без изменения размеров. Отдельные RGBA-файлы не содержат фоновое изображение сравнения.

Ожидаемый вывод
matrix-protected.png

Связанный путь: три математические модели, ошибки и ограничения.

Imagick::functionImageПрименяет выбранную математическую функцию к нормированному значению x=c/Q каждой выбранной компоненты и возвращает результат в Q-шкалу. Function — int enum, не имя PHP-функции и не callable.

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

Imagick::functionImage(int $function, array $arguments, int $channel = Imagick::CHANNEL_DEFAULT): bool

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

В $image уже есть независимая копия входа. $ начинает имя переменной, -> вызывает метод, скобки содержат аргументы, запятые их разделяют, ; завершает команду. Imagick::ИМЯ — константа класса; :: связывает имя класса и константу. Число 0.04 записано с десятичной точкой; * выполняет умножение. Применяет выбранную математическую функцию к нормированному значению x=c/Q каждой выбранной компоненты и возвращает результат в Q-шкалу. Function — int enum, не имя PHP-функции и не callable.

c — текущее значение одной компоненты, Q=QuantumRange — внутренний максимум. Здесь x=c/Q — вход в шкале 0..1; библиотека нормирует его сама, дополнительно получать Q в этом PHP-фрагменте не требуется. Квадрат x² означает x×x. Квадратные скобки [] создают плоский массив; [0.5,0.5,0.0] содержит коэффициенты квадрата, первой степени и свободного, или постоянного, члена — прибавки, не зависящей от x. Для x=0.5 получается 0.375. Значения 0 и 1 остаются на месте. | объединяет три маски RGB, не складывает значения пикселей.

$rgbChannels = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$image->functionImage(Imagick::FUNCTION_POLYNOMIAL, [0.5, 0.5, 0.0], $rgbChannels);

Метод меняет $image и возвращает bool true, а не новый bitmap. Не присваивайте bool вместо изображения. Clone создаёт отдельную копию; обычное присваивание объекта даёт ему ещё одно имя. If с ! проверяет отказ, throw new RuntimeException прерывает цепочку. Связи: объект и метод, массивы, clone, исключения.

Полная официальная сигнатура

Imagick::functionImage(int $function, array $arguments, int $channel = Imagick::CHANNEL_DEFAULT): bool
АргументЕдиницы и ограничения
$functionОбязательный int из FUNCTION_*: POLYNOMIAL, SINUSOID, ARCSIN, ARCTAN. Не передавайте "sin" или замыкание. Доступность констант зависит от версии библиотеки.
$argumentsОбязательный непустой плоский массив параметров. POLYNOMIAL читает коэффициенты по убыванию степени: [0.5,0.5,0] означает 0.5x²+0.5x, [-2,3,0,0] означает −2x³+3x². Коэффициенты и x безразмерны.
$channelНеобязательная int-маска CHANNEL_DEFAULT. В тоновой программе явно RED | GREEN | BLUE, в программе слоя — ALPHA. В контрольном изображении default менял и alpha; отдельная маска нужна для сохранения других компонент.

Официальная доступность: PECL imagick 2 >= 2.3.0, PECL imagick 3. Операция изменяет текущий объект и возвращает bool true при успехе, размеры растра сохраняются. Пустое изображение и нативный отказ дают ImagickException; неправильные PHP-типы/число аргументов могут дать TypeError/ArgumentCountError. True сам по себе не подтверждает выбранную пользователем математику или наличие изменений.

Требует компиляции с IM 6.4.9 или новее; ARCSIN/ARCTAN экспортируются при IM ≥ 6.5.3. Метод работает не только с pseudoimage: наши входы — обычные PNG. Сохранённый raw содержит три полных примера градиентов, но имя function не означает вызов PHP-функции.

В следующей таблице указаны значения по умолчанию внутри Core — вычислительной части ImageMagick. PHP всё равно требует непустой массив: [] не запрашивает все эти значения автоматически. При передаче части параметров оставшийся хвост дополняется библиотекой.

ВидПорядок параметров, смысл и единицы
POLYNOMIALЛюбое непустое число коэффициентов от старшей степени к свободному члену. Выход Q×P(c/Q), затем ограничение в диапазон.
SINUSOIDfrequency, phase, amplitude, bias; значения по умолчанию 1, 0°, 0.5, 0.5. Частота — число циклов по шкале c/Q, фаза в градусах; amplitude — высота колебания в нормированной шкале, bias — постоянный сдвиг выхода. Выход Q×(amplitude×sin(2π×(frequency×c/Q+phase/360))+bias). Sin — математический синус, π — число пи.
ARCSINwidth, center, range, bias; значения 1, 0.5, 1, 0.5. Width — ширина входного перехода, center — входной центр в шкале 0..1, range — размах нормированного выхода, bias — его смещение/центр. Это безразмерные величины. Обратный синус ограничивается за пределами области определения; это математическая кривая значений.
ARCTANslope, center, range, bias; значения 1, 0.5, 1, 0.5. Slope — крутизна перехода, center — входной центр в шкале 0..1, range — размах нормированного выхода, bias — его смещение/центр. Это безразмерные величины. Метод строит нормированную кривую обратного тангенса.

Пустой массив вызвал ImagickException, строка "sin" вместо enum дала TypeError. Неизвестный числовой function в контроле вернул true и чёрный RGB; не обещаем автоматическую проверку enum. Код преобразования массива может приводить значения к double: нечисловые элементы не объявляем гарантированной ошибкой API. В программах все коэффициенты заданы числами.

Крайние результаты ограничиваются допустимым диапазоном, поэтому потерянные после отсечения оттенки не восстанавливаются обратной формулой. Во внешнем приложении отдельно нужны whitelist операторов/функций, конечные числовые коэффициенты, выбранные диапазоны и лимиты площади/кадров/памяти. Такая форма валидации здесь не реализована. Издержки зависят от площади, копий и формулы; скорость, размер файла и цветопроба печати не измерялись.

Полный официальный XML: описание, все параметры, return, ошибки, примеры и ссылки
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->

<refentry xml:id="imagick.functionimage" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
 <refnamediv>
  <refname>Imagick::functionImage</refname>
  <refpurpose>Applies a function on the image</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::functionImage</methodname>
   <methodparam><type>int</type><parameter>function</parameter></methodparam>
   <methodparam><type>array</type><parameter>arguments</parameter></methodparam>
   <methodparam choice="opt"><type>int</type><parameter>channel</parameter><initializer>Imagick::CHANNEL_DEFAULT</initializer></methodparam>
  </methodsynopsis>
  <para>
   Applies an arithmetic, relational, or logical expression to a pseudo image.
  </para>
  <para>
   See also <link xlink:href="&url.imagemagick.usage.transform.function;">ImageMagick
   v6 Examples - Image Transformations — Function, Multi-Argument Evaluate</link>
  </para>
  <para>
   &imagick.method.available.0x649;
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>function</parameter></term>
     <listitem>
      <para>
       Refer to this list of <link linkend="imagick.constants.function">function constants</link>
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>arguments</parameter></term>
     <listitem>
      <para>
       Array of arguments to pass to this function.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

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

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

 <refsect1 role="examples">
  &reftitle.examples;
  <para>
   <example>
    <title>Create a sinusoidal gradient</title>
    <programlisting role="php">
<![CDATA[
<?php
$imagick = new Imagick();
$imagick->newPseudoImage(200, 200, 'gradient:black-white');
$arguments = array(3, -90);
$imagick->functionImage(Imagick::FUNCTION_SINUSOID, $arguments);

header("Content-Type: image/png");
$imagick->setImageFormat("png");
echo $imagick->getImageBlob();
?>
]]>
    </programlisting>
    &example.outputs.similar;
    <mediaobject>
     <alt>Output of create a sinusoidal gradient</alt>
     <imageobject>
      <imagedata fileref="en/reference/imagick/figures/functionImage_sinusoidal.png"/>
     </imageobject>
    </mediaobject>
   </example>
   
   <example>
    <title>Create a gradient from the polynomial (4x^2 - 4x + 1) </title>
    <programlisting role="php">
<![CDATA[
<?php
$imagick = new Imagick();
$imagick->newPseudoImage(200, 200, 'gradient:black-white');
$arguments = array(4, -4, 1);
$imagick->functionImage(Imagick::FUNCTION_POLYNOMIAL, $arguments);

header("Content-Type: image/png");
$imagick->setimageformat("png");
echo $imagick->getImageBlob();
?>
]]>
    </programlisting>
    &example.outputs.similar;
    <mediaobject>
     <alt>Output of create a polynomial gradient</alt>
     <imageobject>
      <imagedata fileref="en/reference/imagick/figures/functionImage_polynomial.png"/>
     </imageobject>
    </mediaobject>
   </example>

   <example>
    <title>
     Create a complex gradient from the
     polynomial (4x^2 - 4x^2 + 1) modulated by a sinusoidal gradient
    </title>
    <programlisting role="php">
<![CDATA[
<?php
$imagick1 = new Imagick();
$imagick1->newPseudoImage(200, 200, 'gradient:black-white');
$arguments = array(9, -90);
$imagick1->functionImage(Imagick::FUNCTION_SINUSOID, $arguments);

$imagick2 = new Imagick();
$imagick2->newPseudoImage(200, 200, 'gradient:black-white');
$arguments = array(0.5, 0);
$imagick2->functionImage(Imagick::FUNCTION_SINUSOID, $arguments);
$imagick1->compositeimage($imagick2, Imagick::COMPOSITE_MULTIPLY, 0, 0);

header("Content-Type: image/png");
$imagick1->setImageFormat("png");
echo $imagick1->getImageBlob();
?>
]]>
    </programlisting>
    &example.outputs.similar;
    <mediaobject>
     <alt>Output of create complex gradient</alt>
     <imageobject>
      <imagedata fileref="en/reference/imagick/figures/functionImage_multiplied.png"/>
     </imageobject>
    </mediaobject>
   </example>

  </para>
 </refsect1>

</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

Официальные HTTP-примеры сохранены целиком. Наши программы записывают локальные PNG; MIME header сам по себе изображение не перекодирует, HTTP-доставка здесь не проверялась. Основы: файлы и запись, HTTP-ответ.

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

require __DIR__ . '/channel-fixture.php';
$source = loadChannelSource();
$overlay = loadChannelOverlay();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$rgbChannels = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$image = clone $source;
if (!$image->functionImage(Imagick::FUNCTION_POLYNOMIAL, [0.5, 0.5, 0.0], $rgbChannels)) {
    throw new RuntimeException('Не выполнен functionImage');
}
saveChannelComparison([$source, $image], 'function-tone.png');
$source->clear();
$image->clear();
$overlay->clear();

Результат: Для каждой RGB-компоненты применяется y=0.5x²+0.5x, где x=c/Q. Средние значения темнее, 0 и максимум сохраняются. Это преобразование значений, а не размытие или перемещение. Для запуска распакуйте example.php, channel-fixture.php, source.png.b64 и overlay.png.b64 вместе, сохранив остальные файлы архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Оба точных PNG восстанавливаются помощником по Base64/SHA256 во всех программах, без сети и шрифтов. Stdout содержит function-tone.png и перевод строки. Откройте PNG просмотрщиком: полные панели 400×320 идут слева направо без изменения размеров. Отдельные RGBA-файлы не содержат фоновое изображение сравнения.

Ожидаемый вывод
function-tone.png
Перераспределить промежуточную alpha слояПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/channel-fixture.php';
$source = loadChannelSource();
$overlay = loadChannelOverlay();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$rgbChannels = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$curved = clone $overlay;
if (!$curved->functionImage(Imagick::FUNCTION_POLYNOMIAL, [-2.0, 3.0, 0.0, 0.0], Imagick::CHANNEL_ALPHA)) {
    throw new RuntimeException('Не выполнен functionImage');
}
$curved->setImageFormat('png');
$curved->setImageDepth(8);
$curved->setOption('png:color-type', '6');
if (!$curved->writeImage(__DIR__ . '/overlay-curved.png')) {
    throw new RuntimeException('Не записан overlay-curved.png');
}
$originalPreview = channelPreview($source, $overlay);
$curvedPreview = channelPreview($source, $curved);
saveChannelComparison([$source, $originalPreview, $curvedPreview], 'function-alpha.png');
$source->clear();
$originalPreview->clear();
$curvedPreview->clear();
$overlay->clear();
$curved->clear();

Результат: Каталог; исходный слой поверх него; слой с alpha-кривой y=3x²−2x³. Крайние 0/1 сохранены, промежуточные значения изменены. overlay-curved.png — отдельная RGBA. Кривая не размывает край в пространстве и не гарантирует более мягкий вид любой картинки. Для запуска распакуйте example.php, channel-fixture.php, source.png.b64 и overlay.png.b64 вместе, сохранив остальные файлы архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Оба точных PNG восстанавливаются помощником по Base64/SHA256 во всех программах, без сети и шрифтов. Stdout содержит function-alpha.png и перевод строки. Откройте PNG просмотрщиком: полные панели 400×320 идут слева направо без изменения размеров. Отдельные RGBA-файлы не содержат фоновое изображение сравнения.

Ожидаемый вывод
function-alpha.png

Связанный путь: три математические модели, ошибки и ограничения.

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

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

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

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

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