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

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

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

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

Глава 353 · После цветовой стилизации

Imagick: общая палитра, заданные цвета и таблица преобразования

От ограничения цветов каталога до повторной палитры и покомпонентного lookup.

Получить иллюстрацию с понятным правилом цвета

Для каталога требуется уменьшить набор цветов, оформить иллюстрации фирменными красками или получить цветной тональный рисунок для памятки. Эти требования похожи на словах, но дают разные правила: автоматически подобрать до K цветов, использовать заданный набор либо прочитать упорядоченную таблицу. Исходный цвет товара сохраняем отдельно: это оформление, а не цветопроба.

RGB — три численных компоненты цвета: R, G, B. На наших сохранённых файлах каждая имеет значения 0..255. Q — QuantumRange, максимум внутреннего канала; в проверенной Q16-сборке Q = 65535. K — ограничение общего числа цветов, а не число ступеней каждой компоненты. Colorspace обозначает пространство выбора цветов; treedepth — глубину цветового дерева, здесь 0 выбирает её автоматически. True и false — логические значения; measureError = false означает, что внутренний расчёт ошибки не запрашивается. R′, G′ и B′ — компоненты результата. Палитра — набор разрешённых цветов; CLUT — упорядоченная таблица, в которой положение имеет смысл. v — исходное значение одной компоненты; table[v].R означает красную компоненту цвета в выбранной позиции таблицы. В полной реализации позиция масштабируется из диапазона 0..Q в длину таблицы; записи 0..255 здесь относятся к нашему 256-столбцовому входу. Интенсивность — численная яркость, полученная из цветовых компонентов; прямой CLUT сравнения ниже её не вычисляет. Dithering переносит ошибку выбора цвета в соседние пиксели, создавая узор. Интерполяция вычисляет промежуточное значение между точками таблицы.

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

Квантование: весь вход → группы похожих цветов → ограниченный набор представителей → назначение цвета пикселям. Remap: заданные четыре краски → ближайший доступный цвет для каждого пикселя. CLUT: значение каждой компоненты → позиция таблицы → новая компонента; серый вход сначала делает три индекса одинаковыми. Ни одна модель не распознаёт смысл SKU или товара; это качественный путь данных, не полный независимый алгоритм выбора палитры.

Модели всех трёх правил до первой полной программы
Модели всех трёх правил до первой полной программы

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

В $image уже загружена независимая копия. 8 — int-предел общего числа цветов; COLORSPACE_SRGB — именованная int-константа пространства; 0 — автоматическая глубина дерева; true — фактический NoDither этой сборки; последний false отключает внутренний расчёт ошибки. Все пять аргументов обязательны. $ начинает имя переменной; -> вызывает метод объекта, скобки содержат аргументы, запятые разделяют их, ; завершает команду. Imagick::ИМЯ без скобок читает константу класса.

$image->quantizeImage(8, Imagick::COLORSPACE_SRGB, 0, true, false);

$image = clone $source; создаёт отдельный объект; обычное присваивание объект не копирует. Метод меняет текущую картинку и возвращает true, поэтому нельзя присваивать этот bool вместо изображения. В полном коде if (!...) проверяет отказ, throw new RuntimeException прерывает цепочку; clear освобождает ресурсы после сохранения. Подготовка: объекты и методы, копирование clone, исключения.

Распакуйте example.php, palette-fixture.php и source.png.b64 рядом. Начало <?php включает PHP, declare(strict_types=1) требует строгих типов вызовов. Require подключает помощник из __DIR__, папки программы. LoadPaletteSource проверяет Base64 и SHA256, восстанавливает точный source.png и возвращает Imagick. SavePaletteComparison создаёт файл сравнения с исходником слева, печатает его имя; изображение открывают просмотрщиком. Ресурсы Imagick нужны при запуске, сеть и шрифты не нужны.

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

require __DIR__ . '/palette-fixture.php';
$source = loadPaletteSource();
$image = clone $source;
if (!$image->quantizeImage(8, Imagick::COLORSPACE_SRGB, 0, true, false)) {
    throw new RuntimeException('Не удалось применить quantizeImage');
}
savePaletteComparison([$source, $image], 'palette-first.png');
$source->clear();
$image->clear();

Результат: Исходник с 1663 RGB-сочетаниями и вариант с восемью общими цветами. Плашка (120,80,40) стала (129,117,88); это выбранный представитель, не равномерная поканальная ступень. Архив содержит example.php, palette-fixture.php и source.png.b64. Распакуйте рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов. PNG откройте просмотрщиком; stdout содержит фиксированное имя сравнения. Каждая панель 400×320 без изменения масштаба; надписи исходного растра не пересчитываются эффектом.

Ожидаемый вывод
palette-first.png
Полный переносимый помощник palette-fixture.php
<?php
declare(strict_types=1);

function loadPaletteSource(): 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 savePaletteComparison(array $panels, string $filename): void
{
    if ($panels === []) {
        throw new InvalidArgumentException('Нужна хотя бы одна панель');
    }
    $output = new Imagick();
    $output->newImage(400 * count($panels), 320, 'white');
    $output->setImageFormat('png');
    foreach ($panels as $index => $panel) {
        if (!$panel instanceof Imagick || $panel->getImageWidth() !== 400 || $panel->getImageHeight() !== 320) {
            throw new InvalidArgumentException('Панель должна быть Imagick 400 на 320 пикселей');
        }
        if (!$output->compositeImage($panel, Imagick::COMPOSITE_OVER, 400 * $index, 0)) {
            throw new RuntimeException('Не удалось собрать сравнение');
        }
    }
    $output->setImageDepth(8);
    $output->setOption('png:color-type', '2');
    if (!$output->writeImage(__DIR__ . '/' . $filename)) {
        throw new RuntimeException('Не удалось записать результат');
    }
    $output->clear();
    echo $filename, "\n";
}

function createPaletteReference(): Imagick {
    $colors = [[24,46,67],[33,132,147],[224,155,59],[244,235,214]];
    $row = '';
    foreach ($colors as $rgb) { $row .= str_repeat(pack('C*', ...$rgb), 64); }
    $image = new Imagick();
    $image->readImageBlob("P6\n256 32\n255\n" . str_repeat($row, 32));
    return $image;
}
function createLookupTable(): Imagick {
    $row = '';
    for ($x = 0; $x < 256; $x++) {
        $row .= pack('C*', (int) round(16 + 224 * $x / 255),
            (int) round(32 + 176 * $x / 255), (int) round(64 + 64 * $x / 255));
    }
    $image = new Imagick();
    $image->readImageBlob("P6\n256 32\n255\n" . str_repeat($row, 32));
    return $image;
}
function savePaletteReference(Imagick $image, string $filename): void {
    $image->setImageFormat('png');
    $image->setImageDepth(8);
    $image->setOption('png:color-type', '2');
    if (!$image->writeImage(__DIR__ . '/' . $filename)) {
        throw new RuntimeException('Не удалось сохранить таблицу цветов');
    }
}

Function объявляет именованную функцию; Imagick после двоеточия — тип возвращаемого объекта, void означает отсутствие возвращаемого значения. Array хранит список, foreach перебирает элементы, for повторяет шаг для x от 0 до 255. Pack с C* собирает однобайтовые компоненты, str_repeat повторяет строку; P6 — простой двоичный RGB-растр в памяти, readImageBlob читает его без внешнего файла. Это инфраструктура двух маленьких reference, не скрытая обработка каталога. Помощник сохраняет PNG с 8 битами на компоненту RGB, color-type 2; число цветов ограничено обработкой, но формат не переключается в indexed PNG. Подготовка: массивы, циклы, файлы.

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

Фирменная палитра содержит четыре точных RGB: (24,46,67), (33,132,147), (224,155,59), (244,235,214). CreatePaletteReference создаёт 256×32, по 64 одинаковых столбца на цвет. Все 32 строки одинаковы; размеры удобны для просмотра, remap использует набор цветов. SavePaletteReference сохраняет этот реальный вход отдельно. Обеим программам remap передаётся та же палитра.

CreateLookupTable создаёт другой объект 256×32: в столбце x красный равен round(16+224×x/255), зелёный round(32+176×x/255), синий round(64+64×x/255). Round округляет до целого, (int) задаёт целочисленное значение. При x = 0 это (16,32,64), при 255 — (240,208,128); строки повторяются. CLUT трактует расположение как шкалу, remap — как набор; переставить столбцы CLUT означает изменить преобразование.

Перед следующей программой: $palette и $lookup создаются предоставленными функциями; $mapped и $colored — независимые clone исходника. TransformImageColorspace(GRAY) меняет сами значения, а не только метку. SetInterpolateMethod(BILINEAR) задаёт способ вычисления между точками таблицы. Похожий setImageInterpolateMethod в этой сборке меняет другую настройку, которую clutImage здесь не читает. Константы с :: — целые значения настроек, а не строки с цветами.

$image->quantizeImage(8, Imagick::COLORSPACE_SRGB, 0, true, false);
$palette = createPaletteReference();
$mapped->remapImage($palette, Imagick::DITHERMETHOD_NO);
$lookup = createLookupTable();
$colored->transformImageColorspace(Imagick::COLORSPACE_GRAY);
$colored->setInterpolateMethod(Imagick::INTERPOLATE_BILINEAR);
$colored->clutImage($lookup);
Сравнить три правила выбора цветаПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/palette-fixture.php';
$source = loadPaletteSource();
$image = clone $source;
if (!$image->quantizeImage(8, Imagick::COLORSPACE_SRGB, 0, true, false)) {
    throw new RuntimeException('Не удалось применить quantizeImage');
}
$palette = createPaletteReference();
savePaletteReference($palette, 'palette-reference.png');
$mapped = clone $source;
if (!$mapped->remapImage($palette, Imagick::DITHERMETHOD_NO)) {
    throw new RuntimeException('Не удалось применить remapImage');
}
$lookup = createLookupTable();
savePaletteReference($lookup, 'lookup-table.png');
$colored = clone $source;
if (!$colored->transformImageColorspace(Imagick::COLORSPACE_GRAY)) {
    throw new RuntimeException('Не удалось применить transformImageColorspace');
}
$colored->setInterpolateMethod(Imagick::INTERPOLATE_BILINEAR);
if (!$colored->clutImage($lookup)) {
    throw new RuntimeException('Не удалось применить clutImage');
}
savePaletteComparison([$source, $image, $mapped, $colored], 'palette-controls.png');
$source->clear();
$image->clear();
$mapped->clear();
$colored->clear();
$palette->clear();
$lookup->clear();

Результат: Исходник, восемь общих цветов, четыре фирменных цвета, затем GRAY → CLUT. Последний результат имеет 249 RGB-сочетаний: таблица не является ограничением до четырёх красок. Архив содержит example.php, palette-fixture.php и source.png.b64. Распакуйте рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов. PNG откройте просмотрщиком; stdout содержит фиксированное имя сравнения. Каждая панель 400×320 без изменения масштаба; надписи исходного растра не пересчитываются эффектом. Дополнительный вход, созданный самой программой: palette-reference.png, lookup-table.png; это PNG с 8 битами на компоненту RGB (color-type 2) размером 256×32, его также можно открыть.

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

Разобрать обязательность, единицы и версии

RGB — три численных компоненты цвета: R, G, B. На наших сохранённых файлах каждая имеет значения 0..255. Q — QuantumRange, максимум внутреннего канала; в проверенной Q16-сборке Q = 65535. K — ограничение общего числа цветов, а не число ступеней каждой компоненты. Colorspace обозначает пространство выбора цветов; treedepth — глубину цветового дерева, здесь 0 выбирает её автоматически. True и false — логические значения; measureError = false означает, что внутренний расчёт ошибки не запрашивается. R′, G′ и B′ — компоненты результата. Палитра — набор разрешённых цветов; CLUT — упорядоченная таблица, в которой положение имеет смысл. v — исходное значение одной компоненты; table[v].R означает красную компоненту цвета в выбранной позиции таблицы. В полной реализации позиция масштабируется из диапазона 0..Q в длину таблицы; записи 0..255 здесь относятся к нашему 256-столбцовому входу. Интенсивность — численная яркость, полученная из цветовых компонентов; прямой CLUT сравнения ниже её не вычисляет. Dithering переносит ошибку выбора цвета в соседние пиксели, создавая узор. Интерполяция вычисляет промежуточное значение между точками таблицы.

ТребованиеИнструментЧего он не обещает
До K общих цветов из данныхquantizeImageНе K ступеней на каждый канал и не K заданных фирменных красок.
Только заданные краскиremapImageНе равная частота каждого цвета и не любой критерий художественного сходства.
Значение канала → таблицаclutImageНе ближайшая палитра, не распознавание класса по номеру и не автоматическая научная карта.

Quantize имеет пять обязательных аргументов; remap — объект и int enum, оба обязательны; у CLUT обязательна таблица и необязательна маска каналов. Bool quantize и int remap не взаимозаменяемы. Нельзя перенести совет о включении dithering из старой IM6-команды без проверки связки. В наших двух режимах quantize при K = 8 и автоматической глубине различаются и выбранные RGB-представители, и распределение; у remap reference фиксирован.

Предел цветов и хранение файла — разные вещи. Наши результаты содержат RGB с 8 битами на компоненту и color-type 2, даже когда используются всего два или четыре сочетания. Индексированный PNG хранит номера палитры и требует отдельного выбора формата. Наша глава проверяет оформление и точные цвета, не обещает определённый размер или структуру индексированного файла.

Выбрать и повторно использовать палитру

Два режима quantize при том же K и отдельная двухцветная задача
Два режима quantize при том же K и отдельная двухцветная задача
Фиксированные четыре краски и два варианта dithering
Фиксированные четыре краски и два варианта dithering
Та же палитра применяется к известной области товара
Та же палитра применяется к известной области товара

На нашем входе оба режима квантования дали восемь цветов. Это не четыре RGB-ступени предыдущей главы и не гарантированное использование каждого K на любом изображении. В малом 256-пиксельном опыте запрос восьми дал семь. Определять качество только числом цветов нельзя: узор dithering способен мешать буквам, а без него заметны границы областей.

Обе программы remap используют одинаковые RGB/RGBA-пиксели палитры, созданной из тех же четырёх RGB. Байты сохранённых PNG могут различаться из-за метаданных; это не обещание идентичности файлов. Полный результат имеет четыре цвета; у локального варианта весь кадр содержит больше, поскольку неизменённые поля и шкалы сохраняют исходные цвета. Внутри ROI все цвета принадлежат reference; изменено 46464 пикселя, снаружи ноль. Палитра относится к обрабатываемой области, не требует перекрасить защищённую SKU.

Прочитать таблицу по значению компоненты

R′, G′ и B′ — компоненты результата. Для цветного RGB они читают разные позиции: (120,80,40) использует x = 120, 80, 40. После явного преобразования в серый три индекса равны, поэтому цвет берётся с одной позиции градиента. Это тонирование и тональная настройка, а не научное восстановление свойств товара.

Реальная таблица, серый маршрут, прямой RGB и только RED
Реальная таблица, серый маршрут, прямой RGB и только RED

В Q16 таблица сопоставляется диапазону 0..65535, даже когда её PNG содержит 256 столбцов. Для таблицы произвольной длины значение канала не обязательно равно номеру столбца. Интерполяция смешивает соседние точки: ограничить вход дискретными метками и получить точный список красок — отдельное требование. Для набора разрешённых цветов удобнее remap; для CLUT заранее определяют шкалу, интерполяцию и политику alpha.

В основном вызове Bilinear задаётся через setInterpolateMethod: это способ вычисления между точками таблицы. Похожее setImageInterpolateMethod в этой сборке меняет другую настройку, которую clutImage здесь не читает. Выбор маски CHANNEL_RED не меняет геометрию; G/B в сохранённом результате совпали с исходником во всех пикселях.

Проверить потери, ошибки и прозрачность

Восемь программ выполнены в PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 Q16. Сохранены точные stdout, пустой stderr, восемь основных PNG и шесть PNG-reference. Исходник восстановлен побайтно во всех папках; панели сравнения не меняют масштаб. Это подтверждает реальные примеры и конкретные свойства, не полноту всего PHP Manual или художественную пригодность любого файла.

Отдельный малый RGBA-опыт показал сохранение alpha у выбранного quantize-вызова и у CLUT с CHANNEL_RED, но remap с непрозрачной палитрой сделал alpha непрозрачной. Это не проверка default CLUT alpha и не гарантия для любого прозрачного/ICC/CMYK/HDR/многокадрового входа. Основные программы намеренно используют непрозрачный RGB. Любую требуемую прозрачность проектируют и проверяют отдельно.

MeasureError — внутренний расчёт, без автоматического вывода метрик в PHP. В малом опыте оба значения флага дали одинаковые декодированные RGBA-пиксели при экспорте и после повторного чтения PNG; не выводим поведение всей цепочки из одного условия C. Размер, скорость и память зависят от данных, K, глубины и dithering. Для сервиса отдельно ограничивают файл и параметры, обрабатывают ошибки чтения/эффекта/записи и не раскрывают внутренние пути в ответах.

Выбрать инструмент и оформить свой макет

Выбор: общее число, заданные краски или шкала преобразования
Выбор: общее число, заданные краски или шкала преобразования
  • Нужен предел общего числа цветов — quantize с понятными K, пространством и глубиной.
  • Нужны конкретные разрешённые RGB — remap с явной палитрой и int dither enum.
  • Нужно связать уровень компоненты с новой компонентой — CLUT с заданными шкалой, интерполяцией и маской.
  • Нужен цвет по яркости — сначала явная серая подготовка, затем CLUT; не выдавать такой макет за научные измерения.

Упражнение: применить четыре фирменных цвета только к товарной области, сохранив артикул. Решение: createPaletteReference; clone; cropImage(352,132,24,88); setImagePage(0,0,0,0); remapImage($palette, DITHERMETHOD_NO); COMPOSITE_OVER в (24,88). Полный переносимый код — локальное применение общей палитры. Затем объясните, почему заменить палитру теми же четырьмя цветами в CLUT недостаточно для того же результата.

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

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

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

Imagick::quantizeImageВыбрать восемь общих цветов и способ передачи градиента

PECL imagick 2, PECL imagick 3 · imagick

Imagick::quantizeImage(int $numberColors, int $colorspace, int $treedepth, bool $dither, bool $measureError): bool

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

RGB — три численных компоненты цвета: R, G, B. На наших сохранённых файлах каждая имеет значения 0..255. Q — QuantumRange, максимум внутреннего канала; в проверенной Q16-сборке Q = 65535. K — ограничение общего числа цветов, а не число ступеней каждой компоненты. Colorspace обозначает пространство выбора цветов; treedepth — глубину цветового дерева, здесь 0 выбирает её автоматически. True и false — логические значения; measureError = false означает, что внутренний расчёт ошибки не запрашивается. R′, G′ и B′ — компоненты результата. Палитра — набор разрешённых цветов; CLUT — упорядоченная таблица, в которой положение имеет смысл. v — исходное значение одной компоненты; table[v].R означает красную компоненту цвета в выбранной позиции таблицы. В полной реализации позиция масштабируется из диапазона 0..Q в длину таблицы; записи 0..255 здесь относятся к нашему 256-столбцовому входу. Интенсивность — численная яркость, полученная из цветовых компонентов; прямой CLUT сравнения ниже её не вычисляет. Dithering переносит ошибку выбора цвета в соседние пиксели, создавая узор. Интерполяция вычисляет промежуточное значение между точками таблицы.

Выбор правила перед вызовом и полной программой
Выбор правила перед вызовом и полной программой

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

В $image уже загружена независимая копия. 8 — int-предел общего числа цветов; COLORSPACE_SRGB — именованная int-константа пространства; 0 — автоматическая глубина дерева; true — фактический NoDither этой сборки; последний false отключает внутренний расчёт ошибки. Все пять аргументов обязательны. $ начинает имя переменной; -> вызывает метод объекта, скобки содержат аргументы, запятые разделяют их, ; завершает команду. Imagick::ИМЯ без скобок читает константу класса.

$image->quantizeImage(8, Imagick::COLORSPACE_SRGB, 0, true, false);

$image = clone $source; создаёт отдельный объект; обычное присваивание объект не копирует. Метод меняет текущую картинку и возвращает true, поэтому нельзя присваивать этот bool вместо изображения. В полном коде if (!...) проверяет отказ, throw new RuntimeException прерывает цепочку; clear освобождает ресурсы после сохранения. Подготовка: объекты и методы, копирование clone, исключения.

Сигнатура и каждый параметр

Imagick::quantizeImage(int $numberColors, int $colorspace, int $treedepth, bool $dither, bool $measureError): bool

Анализирует весь текущий кадр, выбирает ограниченную общую палитру и назначает её цвета пикселям. В алгоритме цветовое пространство делится деревом, группы сокращаются до нужного количества, затем назначаются представители. Это качественная модель, не полный независимый алгоритм выбора каждого цвета. В отличие от posterize, K = 8 не означает восемь уровней каждого из R, G и B.

АргументСмысл, обязательность и единицы
$numberColorsОбязательный int: предел общего числа цветов. В программе K = 8, не обещание обязательно встретить все восемь; в малом контроле получилось семь. Ноль в Core означает MaxColormapSize, а не универсальную ошибку. Для внешнего ввода отдельно ограничивают положительное разумное K; в программах значения фиксированы.
$colorspaceОбязательный int-константа пространства для уменьшения цветов. COLORSPACE_SRGB — здесь цветной каталог, COLORSPACE_GRAY — отдельная нейтральная двухцветная задача. Пространство — не желаемый MIME-тип и не число бит файла.
$treedepthОбязательный int: глубина цветового дерева, не битовая глубина файла. Здесь 0 означает автоматический выбор. Комментарий библиотеки упоминает 0 или 1 вместе, но точный Core автоматически выбирает только при 0, а заданную глубину ограничивает 2..8. Поэтому 0 и 1 не учим как равнозначные режимы.
$ditherОбязательный bool. В этой Imagick 3.8.1/IM7-связке прямой аргумент попадает в DitherMethod: true = 1 = NoDither, false = 0 = Undefined, который идёт в Floyd–Steinberg. Это версионная особенность. При treedepth = 0 выбор глубины тоже зависит от dithering, поэтому сравниваем два режима при одном K, а не гарантированно одну палитру с иным узором.
$measureErrorОбязательный bool: просит внутренний расчёт ошибки квантования, не возвращает число вместо bool и сам не печатает отчёт. Основные программы используют false. В ограниченном опыте true и false дали одинаковые экспортированные RGBA-пиксели и декодированные пиксели повторно прочитанного PNG, семь цветов при запросе восьми. Один guard записи RGB в C не доказывает сохранение исходной картинки: затем выполняется SyncImage.

Возврат — bool true при успехе; текущий объект изменяется, новый Imagick не возвращается. Пустой исходник вызывает ImagickException; у remap/clut проверяется также пустой reference. Отказ ImageMagick преобразуется в исключение. Неверный тип или число аргументов также могут вызвать PHP-ошибку; пустая секция errors в XML не обещает отсутствие отказов. Доступность PHP Manual: PECL imagick 2, PECL imagick 3. Изменений в raw changelog не перечислено.

Параметры программ фиксированы. Для внешних значений нужна отдельная проверка положительного ограниченного K, выбранных констант и размеров reference, а также формата, площади и числа кадров входа. Здесь не реализована форма внешнего ввода. Копии и цветовое дерево требуют памяти; время и размер результата не измеряются как гарантированная выгода.

Полный официальный XML без изменения raw-контракта
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.quantizeimage">
 <refnamediv>
  <refname>Imagick::quantizeImage</refname>
  <refpurpose>Analyzes the colors within a reference image</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::quantizeImage</methodname>
   <methodparam><type>int</type><parameter>numberColors</parameter></methodparam>
   <methodparam><type>int</type><parameter>colorspace</parameter></methodparam>
   <methodparam><type>int</type><parameter>treedepth</parameter></methodparam>
   <methodparam><type>bool</type><parameter>dither</parameter></methodparam>
   <methodparam><type>bool</type><parameter>measureError</parameter></methodparam>
  </methodsynopsis>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>numberColors</parameter></term>
     <listitem>
      <para>
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>colorspace</parameter></term>
     <listitem>
      <para>
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>treedepth</parameter></term>
     <listitem>
      <para>
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>dither</parameter></term>
     <listitem>
      <para>
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>measureError</parameter></term>
     <listitem>
      <para>
      </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> <function>Imagick::quantizeImage</function></title>
      <programlisting role="php">
      <![CDATA[
<?php
function quantizeImage($imagePath, $numberColors, $colorSpace, $treeDepth, $dither) {
    $imagick = new \Imagick(realpath($imagePath));
    $imagick->quantizeImage($numberColors, $colorSpace, $treeDepth, $dither, false);
    $imagick->setImageFormat('png');
    header("Content-Type: image/png");
    echo $imagick->getImageBlob();
}

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

</refentry>

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

Официальное описание дополнено выше по точным исходникам расширения и ImageMagick; исходная запись и XML сохранены полностью. Официальный quantize-пример показывает HTTP-ответ через header и getImageBlob, а clut-пример — запись файла; наши программы локальные CLI и не являются тестом HTTP. Связанные основы: функции, чтение и запись файлов, веб-ответ.

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

require __DIR__ . '/palette-fixture.php';
$source = loadPaletteSource();
$image = clone $source;
if (!$image->quantizeImage(8, Imagick::COLORSPACE_SRGB, 0, true, false)) {
    throw new RuntimeException('Не удалось применить quantizeImage');
}
$dithered = clone $source;
if (!$dithered->quantizeImage(8, Imagick::COLORSPACE_SRGB, 0, false, false)) {
    throw new RuntimeException('Не удалось применить quantizeImage');
}
savePaletteComparison([$source, $image, $dithered], 'palette-quantize-basic.png');
$source->clear();
$image->clear();
$dithered->clear();

Результат: Исходник, квантование с true (NoDither в этой сборке), затем false (Undefined → Floyd–Steinberg). Восемь — предел общего числа цветов, а не число уровней каждой RGB-компоненты. Архив содержит example.php, palette-fixture.php и source.png.b64. Распакуйте рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов. PNG откройте просмотрщиком; stdout содержит фиксированное имя сравнения. Каждая панель 400×320 без изменения масштаба; надписи исходного растра не пересчитываются эффектом.

Ожидаемый вывод
palette-quantize-basic.png

Когда меняется требование

Для одноцветной памятки нужны именно чёрный и белый, а не две произвольные RGB-краски. Сначала преобразуем значения в серый, затем зададим два цвета в GRAY.

Сначала transformImageColorspace(GRAY), затем quantizeImage(2, COLORSPACE_GRAY, 0, true, false). Это отдельная подготовка для двух нейтральных красок; две RGB-краски без GRAY не обязаны быть чёрной и белой. Фиксированная программа не проверяет сканирование штрихкода или принтер.

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

require __DIR__ . '/palette-fixture.php';
$source = loadPaletteSource();
$image = clone $source;
if (!$image->transformImageColorspace(Imagick::COLORSPACE_GRAY)) {
    throw new RuntimeException('Не удалось применить transformImageColorspace');
}
if (!$image->quantizeImage(2, Imagick::COLORSPACE_GRAY, 0, true, false)) {
    throw new RuntimeException('Не удалось применить quantizeImage');
}
savePaletteComparison([$source, $image], 'palette-quantize-print.png');
$source->clear();
$image->clear();

Результат: Исходник и подготовленный чёрно-белый рисунок. Он теряет оттенки и мелкие детали; посмотрите ярлык и тонкую маркировку. Это подготовка растра, а не проверка принтера или обещание пригодности любого штрихкода. Архив содержит example.php, palette-fixture.php и source.png.b64. Распакуйте рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов. PNG откройте просмотрщиком; stdout содержит фиксированное имя сравнения. Каждая панель 400×320 без изменения масштаба; надписи исходного растра не пересчитываются эффектом.

Ожидаемый вывод
palette-quantize-print.png

Сохраняйте оригинал и оценивайте мелкие буквы, градиент и светлые детали. Если нужны поканальные равномерные ступени, см. posterize и цветовая стилизация; для бинарного порога — пороговые методы; для изменения тонального диапазона — растяжение и нормализация. Соседние правила: remapImage · clutImage.

Imagick::remapImageИспользовать четыре заданных цвета фирменной палитры

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

Imagick::remapImage(Imagick $replacement, int $DITHER): bool

Практическая задача: Использовать четыре заданных цвета фирменной палитры. Затем: Повторно применить ту же палитру только к товарной части.

RGB — три численных компоненты цвета: R, G, B. На наших сохранённых файлах каждая имеет значения 0..255. Q — QuantumRange, максимум внутреннего канала; в проверенной Q16-сборке Q = 65535. K — ограничение общего числа цветов, а не число ступеней каждой компоненты. Colorspace обозначает пространство выбора цветов; treedepth — глубину цветового дерева, здесь 0 выбирает её автоматически. True и false — логические значения; measureError = false означает, что внутренний расчёт ошибки не запрашивается. R′, G′ и B′ — компоненты результата. Палитра — набор разрешённых цветов; CLUT — упорядоченная таблица, в которой положение имеет смысл. v — исходное значение одной компоненты; table[v].R означает красную компоненту цвета в выбранной позиции таблицы. В полной реализации позиция масштабируется из диапазона 0..Q в длину таблицы; записи 0..255 здесь относятся к нашему 256-столбцовому входу. Интенсивность — численная яркость, полученная из цветовых компонентов; прямой CLUT сравнения ниже её не вычисляет. Dithering переносит ошибку выбора цвета в соседние пиксели, создавая узор. Интерполяция вычисляет промежуточное значение между точками таблицы.

Выбор правила перед вызовом и полной программой
Выбор правила перед вызовом и полной программой

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

В $image уже загружена независимая копия. $palette — уже созданный объект с разрешёнными цветами. DITHERMETHOD_NO — int-константа перечисления, а не bool; оба аргумента обязательны. $ начинает имя переменной; -> вызывает метод объекта, скобки содержат аргументы, запятые разделяют их, ; завершает команду. Imagick::ИМЯ без скобок читает константу класса.

$image->remapImage($palette, Imagick::DITHERMETHOD_NO);

$image = clone $source; создаёт отдельный объект; обычное присваивание объект не копирует. Метод меняет текущую картинку и возвращает true, поэтому нельзя присваивать этот bool вместо изображения. В полном коде if (!...) проверяет отказ, throw new RuntimeException прерывает цепочку; clear освобождает ресурсы после сохранения. Подготовка: объекты и методы, копирование clone, исключения.

Сигнатура и каждый параметр

Imagick::remapImage(Imagick $replacement, int $DITHER): bool

Заменяет цвета текущего кадра цветами из reference-изображения. Core классифицирует цвета reference, берёт его пространство и назначает ближайшие доступные цвета. Позиции цветовых блоков — удобная форма хранения набора, а не координатная карта товара. Нельзя обещать, что численно ближайший цвет будет лучшим художественным выбором или совпадёт с произвольной метрикой восприятия.

АргументСмысл, обязательность и единицы
$replacementОбязательный Imagick с разрешёнными цветами. Здесь четыре заданных RGB: (24,46,67), (33,132,147), (224,155,59), (244,235,214). Все они присутствуют в сохранённом reference, но результат не обязан использовать каждый цвет одинаково часто.
$DITHERОбязательный int из DITHERMETHOD-констант: в примерах NO либо FLOYDSTEINBERG. Это настоящий enum-аргумент, в отличие от bool у quantizeImage. Не заменяйте его механически true/false по старым CLI-примерам.

Возврат — bool true при успехе; текущий объект изменяется, новый Imagick не возвращается. Пустой исходник вызывает ImagickException; у remap/clut проверяется также пустой reference. Отказ ImageMagick преобразуется в исключение. Неверный тип или число аргументов также могут вызвать PHP-ошибку; пустая секция errors в XML не обещает отсутствие отказов. Доступность PHP Manual: PECL imagick 2 >= 2.3.0, PECL imagick 3. Изменений в raw changelog не перечислено.

Параметры программ фиксированы. Для внешних значений нужна отдельная проверка положительного ограниченного K, выбранных констант и размеров reference, а также формата, площади и числа кадров входа. Здесь не реализована форма внешнего ввода. Копии и цветовое дерево требуют памяти; время и размер результата не измеряются как гарантированная выгода.

Полный официальный XML без изменения raw-контракта
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->

<refentry xml:id="imagick.remapimage" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
 <refnamediv>
  <refname>Imagick::remapImage</refname>
  <refpurpose>Remaps image colors</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::remapImage</methodname>
   <methodparam><type>Imagick</type><parameter>replacement</parameter></methodparam>
   <methodparam><type>int</type><parameter>DITHER</parameter></methodparam>
  </methodsynopsis>
  <para>
   Replaces colors an image with those defined by <parameter>replacement</parameter>. The colors
   are replaced with the closest possible color. &imagick.method.available.0x645;
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>replacement</parameter></term>
     <listitem>
      <para>
       An Imagick object containing the replacement colors
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>DITHER</parameter></term>
     <listitem>
      <para>
       Refer to this list of <link linkend="imagick.constants.dithermethod">dither method 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>
</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
-->

Официальное описание дополнено выше по точным исходникам расширения и ImageMagick; исходная запись и XML сохранены полностью. Официальный quantize-пример показывает HTTP-ответ через header и getImageBlob, а clut-пример — запись файла; наши программы локальные CLI и не являются тестом HTTP. Связанные основы: функции, чтение и запись файлов, веб-ответ.

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

require __DIR__ . '/palette-fixture.php';
$source = loadPaletteSource();
$image = clone $source;
$palette = createPaletteReference();
savePaletteReference($palette, 'palette-reference.png');
if (!$image->remapImage($palette, Imagick::DITHERMETHOD_NO)) {
    throw new RuntimeException('Не удалось применить remapImage');
}
$dithered = clone $source;
if (!$dithered->remapImage($palette, Imagick::DITHERMETHOD_FLOYDSTEINBERG)) {
    throw new RuntimeException('Не удалось применить remapImage');
}
savePaletteComparison([$source, $image, $dithered], 'palette-remap-basic.png');
$source->clear();
$image->clear();
$dithered->clear();
$palette->clear();

Результат: Исходник, ближайшие цвета без dithering, затем Floyd–Steinberg. Оба результата используют цвета сохранённой palette-reference.png; узор ошибки округления не добавляет новых цветов палитры. Архив содержит example.php, palette-fixture.php и source.png.b64. Распакуйте рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов. PNG откройте просмотрщиком; stdout содержит фиксированное имя сравнения. Каждая панель 400×320 без изменения масштаба; надписи исходного растра не пересчитываются эффектом. Дополнительный вход, созданный самой программой: palette-reference.png; это PNG с 8 битами на компоненту RGB (color-type 2) размером 256×32, его также можно открыть.

Ожидаемый вывод
palette-remap-basic.png

Когда меняется требование

Фирменные четыре цвета нужны рисунку товара, но исходные заголовок, SKU и шкалы должны остаться точными. Повторно создаём ту же палитру и ограничиваем обработку прямоугольником 352×132 в (24, 88).

CropImage(width,height,x,y) вырезает известную область; setImagePage(0,0,0,0) сбрасывает смещение. Remap применяется к вырезке, затем compositeImage(...,COMPOSITE_OVER,24,88) возвращает непрозрачный слой на независимую копию. Весь исходник остаётся отдельным; вне области сохраняются исходные значения пикселей, а не байты целого выходного PNG.

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

require __DIR__ . '/palette-fixture.php';
$source = loadPaletteSource();
$image = clone $source;
$palette = createPaletteReference();
savePaletteReference($palette, 'palette-reference.png');
$region = clone $source;
$region->cropImage(352, 132, 24, 88);
$region->setImagePage(0, 0, 0, 0);
if (!$region->remapImage($palette, Imagick::DITHERMETHOD_NO)) {
    throw new RuntimeException('Не удалось применить remapImage');
}
if (!$image->compositeImage($region, Imagick::COMPOSITE_OVER, 24, 88)) {
    throw new RuntimeException('Не удалось вернуть область в макет');
}
$region->clear();
savePaletteComparison([$source, $image], 'palette-remap-protected.png');
$source->clear();
$image->clear();
$palette->clear();

Результат: Исходник и локальный remap. Товарная область использует ту же палитру, что полный вариант; вне x=24..375, y=88..219 исходные значения пикселей сохранены. Это заранее известная область макета, а не автоматическое распознавание товара. Архив содержит example.php, palette-fixture.php и source.png.b64. Распакуйте рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов. PNG откройте просмотрщиком; stdout содержит фиксированное имя сравнения. Каждая панель 400×320 без изменения масштаба; надписи исходного растра не пересчитываются эффектом. Дополнительный вход, созданный самой программой: palette-reference.png; это PNG с 8 битами на компоненту RGB (color-type 2) размером 256×32, его также можно открыть.

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

Сохраняйте оригинал и оценивайте мелкие буквы, градиент и светлые детали. Если нужны поканальные равномерные ступени, см. posterize и цветовая стилизация; для бинарного порога — пороговые методы; для изменения тонального диапазона — растяжение и нормализация. Соседние правила: quantizeImage · clutImage.

Imagick::clutImageРаскрасить серый вариант каталога заданным градиентом

PECL imagick 2, PECL imagick 3 · imagick

Imagick::clutImage(Imagick $lookup_table, int $channel = Imagick::CHANNEL_DEFAULT): bool

Практическая задача: Раскрасить серый вариант каталога заданным градиентом. Затем: Применить таблицу к RGB либо только к красной компоненте.

RGB — три численных компоненты цвета: R, G, B. На наших сохранённых файлах каждая имеет значения 0..255. Q — QuantumRange, максимум внутреннего канала; в проверенной Q16-сборке Q = 65535. K — ограничение общего числа цветов, а не число ступеней каждой компоненты. Colorspace обозначает пространство выбора цветов; treedepth — глубину цветового дерева, здесь 0 выбирает её автоматически. True и false — логические значения; measureError = false означает, что внутренний расчёт ошибки не запрашивается. R′, G′ и B′ — компоненты результата. Палитра — набор разрешённых цветов; CLUT — упорядоченная таблица, в которой положение имеет смысл. v — исходное значение одной компоненты; table[v].R означает красную компоненту цвета в выбранной позиции таблицы. В полной реализации позиция масштабируется из диапазона 0..Q в длину таблицы; записи 0..255 здесь относятся к нашему 256-столбцовому входу. Интенсивность — численная яркость, полученная из цветовых компонентов; прямой CLUT сравнения ниже её не вычисляет. Dithering переносит ошибку выбора цвета в соседние пиксели, создавая узор. Интерполяция вычисляет промежуточное значение между точками таблицы.

Выбор правила перед вызовом и полной программой
Выбор правила перед вызовом и полной программой

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

В $image уже загружена независимая копия. $lookup — уже созданный объект-таблица. Второй аргумент опущен, поэтому действует CHANNEL_DEFAULT. Маску RED покажем отдельным вызовом. $ начинает имя переменной; -> вызывает метод объекта, скобки содержат аргументы, запятые разделяют их, ; завершает команду. Imagick::ИМЯ без скобок читает константу класса.

$image->clutImage($lookup);

$image = clone $source; создаёт отдельный объект; обычное присваивание объект не копирует. Метод меняет текущую картинку и возвращает true, поэтому нельзя присваивать этот bool вместо изображения. В полном коде if (!...) проверяет отказ, throw new RuntimeException прерывает цепочку; clear освобождает ресурсы после сохранения. Подготовка: объекты и методы, копирование clone, исключения.

Сигнатура и каждый параметр

Imagick::clutImage(Imagick $lookup_table, int $channel = Imagick::CHANNEL_DEFAULT): bool

Читает таблицу по значению каждой обновляемой компоненты: R′ = table[R].R, G′ = table[G].G, B′ = table[B].B. Это не поиск ближайшего цвета палитры и не чтение единой интенсивности цветного пикселя. Если заранее преобразовать вход в серый, R = G = B и они выберут одну позицию с тремя компонентами нового цвета. Core строит карту по диагонали таблицы; наши 32 строки одинаковы, поэтому она фактически одномерная.

АргументСмысл, обязательность и единицы
$lookup_tableОбязательный Imagick с таблицей цветов. Наш PNG 256×32 повторяет одну строку, x = 0..255. Для компоненты 0 берётся тёмный конец, для максимума — светлый; общий диапазон 0..Q масштабируется в размер CLUT. Это не прямые номера произвольных классов или дискретных меток.
$channelНеобязательный int с CHANNEL_DEFAULT по умолчанию. CHANNEL_RED ограничивает изменение красной компонентой; проверенный RED-контроль сохраняет G, B и alpha. Маска временно применяется, затем предыдущая настройка восстанавливается. Общей гарантии сохранения alpha при любом CLUT нет: Core учитывает UpdatePixelTrait, включая возможную alpha таблицы.

Возврат — bool true при успехе; текущий объект изменяется, новый Imagick не возвращается. Пустой исходник вызывает ImagickException; у remap/clut проверяется также пустой reference. Отказ ImageMagick преобразуется в исключение. Неверный тип или число аргументов также могут вызвать PHP-ошибку; пустая секция errors в XML не обещает отсутствие отказов. Доступность PHP Manual: PECL imagick 2, PECL imagick 3. Изменений в raw changelog не перечислено.

Параметры программ фиксированы. Для внешних значений нужна отдельная проверка положительного ограниченного K, выбранных констант и размеров reference, а также формата, площади и числа кадров входа. Здесь не реализована форма внешнего ввода. Копии и цветовое дерево требуют памяти; время и размер результата не измеряются как гарантированная выгода.

Полный официальный XML без изменения raw-контракта
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.clutimage">
 <refnamediv>
  <refname>Imagick::clutImage</refname>
  <refpurpose>Replaces colors in the image</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::clutImage</methodname>
   <methodparam><type>Imagick</type><parameter>lookup_table</parameter></methodparam>
   <methodparam choice="opt"><type>int</type><parameter>channel</parameter><initializer>Imagick::CHANNEL_DEFAULT</initializer></methodparam>
  </methodsynopsis>

  <para>
   Replaces colors in the image from a color lookup table. Optional second
   parameter to replace colors in a specific channel. &imagick.method.available.0x636;
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>lookup_table</parameter></term>
     <listitem>
      <para>
       Imagick object containing the color lookup table
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>channel</parameter></term>
     <listitem>
      <para>
       The <link linkend="imagick.constants.channel">Channeltype</link>
       constant. When not supplied, default channels are replaced.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>

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

 <refsect1 role="examples">
  &reftitle.examples;
  <para>
   <example>
    <title>Using <function>Imagick::clutImage</function>:</title>
    <para>
     Replace colors in the image from a color lookup table.
    </para>
    <programlisting role="php">
<![CDATA[
<?php
$image = new Imagick('test.jpg');
$clut = new Imagick();
$clut->newImage(1, 1, new ImagickPixel('black'));
$image->clutImage($clut);
$image->writeImage('test_out.jpg');
?>
]]>
    </programlisting>
   </example>
  </para>
 </refsect1>

 <refsect1 role="seealso">
  &reftitle.seealso;
  <para>
   <simplelist>
    <member><function>Imagick::adaptiveBlurImage</function></member>
    <member><function>Imagick::motionBlurImage</function></member>
    <member><function>Imagick::radialBlurImage</function></member>
   </simplelist>
  </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
-->

Официальное описание дополнено выше по точным исходникам расширения и ImageMagick; исходная запись и XML сохранены полностью. Официальный quantize-пример показывает HTTP-ответ через header и getImageBlob, а clut-пример — запись файла; наши программы локальные CLI и не являются тестом HTTP. Связанные основы: функции, чтение и запись файлов, веб-ответ.

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

require __DIR__ . '/palette-fixture.php';
$source = loadPaletteSource();
$image = clone $source;
$lookup = createLookupTable();
savePaletteReference($lookup, 'lookup-table.png');
if (!$image->transformImageColorspace(Imagick::COLORSPACE_GRAY)) {
    throw new RuntimeException('Не удалось применить transformImageColorspace');
}
$image->setInterpolateMethod(Imagick::INTERPOLATE_BILINEAR);
if (!$image->clutImage($lookup)) {
    throw new RuntimeException('Не удалось применить clutImage');
}
savePaletteComparison([$source, $image], 'palette-clut-basic.png');
$source->clear();
$image->clear();
$lookup->clear();

Результат: Исходник и GRAY → CLUT. Серые компоненты сначала равны, поэтому выбирают одну позицию градиента lookup-table.png, из которой берутся R, G и B. Это оформительский ложный цвет, не физическая температура или оценка материала. Архив содержит example.php, palette-fixture.php и source.png.b64. Распакуйте рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов. PNG откройте просмотрщиком; stdout содержит фиксированное имя сравнения. Каждая панель 400×320 без изменения масштаба; надписи исходного растра не пересчитываются эффектом. Дополнительный вход, созданный самой программой: lookup-table.png; это PNG с 8 битами на компоненту RGB (color-type 2) размером 256×32, его также можно открыть.

Ожидаемый вывод
palette-clut-basic.png

Когда меняется требование

Нужна тональная настройка красной компоненты без изменения зелёной и синей. Сравним прямое покомпонентное RGB-применение таблицы с явной маской CHANNEL_RED.

Две независимые копии читают одну lookup-table.png. В одной аргумент channel опущен, во второй передан CHANNEL_RED. Для исходного (120,80,40) прямой RGB-результат (121,87,74), RED-only (121,80,40), а отдельный серый маршрут дал (91,91,85). Различие — в подготовке и маске, не в новом списке красок.

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

require __DIR__ . '/palette-fixture.php';
$source = loadPaletteSource();
$image = clone $source;
$lookup = createLookupTable();
savePaletteReference($lookup, 'lookup-table.png');
$image->setInterpolateMethod(Imagick::INTERPOLATE_BILINEAR);
if (!$image->clutImage($lookup)) {
    throw new RuntimeException('Не удалось применить clutImage');
}
$red = clone $source;
$red->setInterpolateMethod(Imagick::INTERPOLATE_BILINEAR);
if (!$red->clutImage($lookup, Imagick::CHANNEL_RED)) {
    throw new RuntimeException('Не удалось применить clutImage');
}
savePaletteComparison([$source, $image, $red], 'palette-clut-channels.png');
$source->clear();
$image->clear();
$red->clear();
$lookup->clear();

Результат: Исходник, CLUT на RGB без серой подготовки, затем CLUT только RED. В третьей панели G и B совпадают с исходником; вторая панель использует разные индексы таблицы для разных компонент. Это отличается от серого маршрута минимального примера. Архив содержит example.php, palette-fixture.php и source.png.b64. Распакуйте рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без интернета и шрифтов. PNG откройте просмотрщиком; stdout содержит фиксированное имя сравнения. Каждая панель 400×320 без изменения масштаба; надписи исходного растра не пересчитываются эффектом. Дополнительный вход, созданный самой программой: lookup-table.png; это PNG с 8 битами на компоненту RGB (color-type 2) размером 256×32, его также можно открыть.

Ожидаемый вывод
palette-clut-channels.png

Сохраняйте оригинал и оценивайте мелкие буквы, градиент и светлые детали. Если нужны поканальные равномерные ступени, см. posterize и цветовая стилизация; для бинарного порога — пороговые методы; для изменения тонального диапазона — растяжение и нормализация. Соседние правила: quantizeImage · remapImage.

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

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

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

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

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