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

Дерево руководства
Глава 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 переносит ошибку выбора цвета в соседние пиксели, создавая узор. Интерполяция вычисляет промежуточное значение между точками таблицы.


Квантование: весь вход → группы похожих цветов → ограниченный набор представителей → назначение цвета пикселям. 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 хранит номера палитры и требует отдельного выбора формата. Наша глава проверяет оформление и точные цвета, не обещает определённый размер или структуру индексированного файла.
Выбрать и повторно использовать палитру



На нашем входе оба режима квантования дали восемь цветов. Это не четыре RGB-ступени предыдущей главы и не гарантированное использование каждого K на любом изображении. В малом 256-пиксельном опыте запрос восьми дал семь. Определять качество только числом цветов нельзя: узор dithering способен мешать буквам, а без него заметны границы областей.
Обе программы remap используют одинаковые RGB/RGBA-пиксели палитры, созданной из тех же четырёх RGB. Байты сохранённых PNG могут различаться из-за метаданных; это не обещание идентичности файлов. Полный результат имеет четыре цвета; у локального варианта весь кадр содержит больше, поскольку неизменённые поля и шкалы сохраняют исходные цвета. Внутри ROI все цвета принадлежат reference; изменено 46464 пикселя, снаружи ноль. Палитра относится к обрабатываемой области, не требует перекрасить защищённую SKU.
Прочитать таблицу по значению компоненты
R′, G′ и B′ — компоненты результата. Для цветного RGB они читают разные позиции: (120,80,40) использует x = 120, 80, 40. После явного преобразования в серый три индекса равны, поэтому цвет берётся с одной позиции градиента. Это тонирование и тональная настройка, а не научное восстановление свойств товара.

В 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). Различие — в подготовке и маске, не в новом списке красок.
<?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. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


