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

Дерево руководства
Глава 345 · После загрузки изображения
Imagick: цветовые варианты, полутона, негатив и сепия
От первого синего PNG до смешивания по каналам, tint на серой основе, осознанной инверсии и сепии отдельной области.
Получить первый цветовой вариант каталога
Для каталога нужны несколько оформительских вариантов одного рисунка: общий оттенок, окрашенные полутона, негатив для проверки и сепия. Начнём с полезного результата: сохраним рядом исходник и синий вариант. Учебный вход нарисован специально: коробка и кружка, плавные переходы, пять серых плашек 0/64/128/192/255 и шесть точных RGB/CMY-цветов. Это собственная иллюстрация 400×320, не фотография чужого товара.


Главная запись $image->colorizeImage('#2864c8', 'gray(35%)', false); примешивает синий цвет ко всем пикселям. $image — переменная с объектом изображения; стрелка вызывает его метод. Круглые скобки содержат три аргумента, запятые их отделяют. Кавычки ограничивают две строки, false отключает старый режим совместимости. Точка с запятой завершает команду.
$image = clone $source;
$image->colorizeImage('#2864c8', 'gray(35%)', false);В полном примере $source загружается из приложенного входа. Clone создаёт отдельное изображение; $image = $source оставило бы два имени одного объекта. Сила gray(35%) здесь значит 35% каждого канала цвета и 65% исходного канала. Так 128 превращается в (97,118,153), а чистый белый перестаёт быть белым. Это смешивание чисел, не распознавание белой бумаги или кружки.
SaveColorEffectsComparison([$source, $image], 'color-effects-first.png') получает список двух объектов: слева оригинал, справа вариант. Квадратные скобки создают массив; помощник собирает полотно, записывает PNG8 и выводит имя. If с ! проверяет отказ, clear после записи освобождает native-ресурсы. Полный помощник раскрывается в разделе о параметрах.
<?php
declare(strict_types=1);
require __DIR__ . '/color-effects-fixture.php';
$source = loadColorEffectsSource();
$image = clone $source;
if (!$image->colorizeImage('#2864c8', 'gray(35%)', false)) {
throw new RuntimeException('Не удалось применить colorizeImage');
}
saveColorEffectsComparison([$source, $image], 'color-effects-first.png');
$source->clear();
$image->clear();
Результат: Справа смешаны 65% исходного канала и 35% канала цвета RGB(40,100,200). В сохранённом PNG8 чёрная плашка стала (14,35,70), белая — (179,200,235), средняя 128 — (97,118,153). Чёрный и белый перестали быть крайними значениями: такое смешивание меняет контраст. Числа относятся именно к файлу после квантования в 8 бит. Архив содержит example.php, color-effects-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник проверит и восстановит точный source.png без интернета и шрифтов во время запуска; итоговый PNG откройте обычным просмотрщиком. Панели идут в указанном порядке; первая всегда исходник. Подписи поясняющих рисунков добавлены отдельно. Размер PNG 800×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
color-effects-first.png
Четыре операции и четыре разных смысла

| Потребность | Метод | Как отличить результат |
|---|---|---|
| Примешать цвет оформления | colorizeImage | Сдвигает и чёрный, и белый; одинаковая доля смешивания по выбранным компонентам. |
| Тонировать полутона | tintImage | Вес компоненты равен нулю на 0/1 и максимален в середине. |
| Получить негатив | negateImage | Вычитает выбранный канал из максимума; true ограничивает серые пиксели. |
| Сделать оформительскую сепию | sepiaToneImage | Отдельная тональная операция с интенсивностью, нормализацией и контрастом. |
Представьте для каждого канала свою линейку 0..255. Colorize передвигает все отметки к выбранному цвету; tint прибавляет сдвиг с разным весом; negate отражает отметку относительно середины. Это модель чисел. Она не означает, что PHP хранит рисунок как физическую краску, и не описывает восприятие цвета, ICC-профили или alpha. Для сравнения используем независимые копии одного исходника.
Перед общей программой разберём три главных вызова. У colorize второй цвет gray(35%) задаёт долю смешивания каждого RGB-канала. У tint gray(100%) задаёт полные канальные множители вектора, а вес зависит от исходной составляющей; false в обоих вызовах оставляет современное поведение. У negate(false) false разрешает все пиксели, канал пропущен и используется default-маска. Три clone-копии ниже получены из одного $source, поэтому одна операция не портит вход другой.
$image = clone $source;
$image->colorizeImage('#2864c8', 'gray(35%)', false);
$tinted = clone $source;
$tinted->tintImage('#2864c8', 'gray(100%)', false);
$negative = clone $source;
$negative->negateImage(false);Это поясняющий фрагмент: $source уже загружен; новая переменная именует отдельную clone-копию, стрелка вызывает её метод, скобки содержат аргументы, точка с запятой завершает команду. Полная программа далее дополнительно подключает файлы, проверяет результат каждого вызова и сохраняет четыре панели.
<?php
declare(strict_types=1);
require __DIR__ . '/color-effects-fixture.php';
$source = loadColorEffectsSource();
$image = clone $source;
if (!$image->colorizeImage('#2864c8', 'gray(35%)', false)) {
throw new RuntimeException('Не удалось применить colorizeImage');
}
$tinted = clone $source;
if (!$tinted->tintImage('#2864c8', 'gray(100%)', false)) {
throw new RuntimeException('Не удалось применить tintImage');
}
$negative = clone $source;
if (!$negative->negateImage(false)) {
throw new RuntimeException('Не удалось применить negateImage');
}
saveColorEffectsComparison([$source, $image, $tinted, $negative], 'color-effects-controls.png');
$source->clear();
$image->clear();
$tinted->clear();
$negative->clear();
Результат: Панели: исходник; colorize #2864c8 с gray(35%); tint того же цвета с gray(100%); negate(false). Параметры двух разных методов указаны явно: gray(35%) у colorize и gray(100%) у tint не являются одним ползунком. На точных плашках видно, какие края сохраняются. Архив содержит example.php, color-effects-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник проверит и восстановит точный source.png без интернета и шрифтов во время запуска; итоговый PNG откройте обычным просмотрщиком. Панели идут в указанном порядке; первая всегда исходник. Подписи поясняющих рисунков добавлены отдельно. Размер PNG 1600×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
color-effects-controls.png
Цвет, сила, quantum и переносимый запуск
RGB — три составляющие R/G/B; sRGB — конкретное нелинейное цветовое представление, обычное для экранных PNG. Linear RGB и sRGB не взаимозаменяемы: одинаковое число не гарантирует одинаковый свет. Учебный непрозрачный PNG загружается как sRGB; расчёты и наблюдения относятся к нему. TransformImageColorspace пересчитывает значения, тогда как смена метки через setImageColorspace сама по себе не заменяет такую конвертацию. ICC/CMYK требуют отдельной согласованной политики.
QuantumRange — максимум native-значения канала, в нашей Q16-сборке 65535. PNG8 на рисунке использует 0..255; библиотека разворачивает значения в свой диапазон. Для сепии PHP-wrapper уже переводит 80 в 80% quantum, то есть 52428: не выполняйте этот пересчёт второй раз в PHP. Gray(35%) — строка цвета для parser библиотеки, а не PHP-вызов и не float 0.35. Alpha показывает непрозрачность пикселя; она отличается от названия opacity у colorize/tint, где современная ветвь читает RGB-компоненты второго цвета.
Краткий официальный текст colorize/tint сохраняет историческое описание float 0..1 и изменение 2.1.0. Проверенная Imagick 3.8.1 с default legacy=false разбирает float 0.35 как цвет и отклоняет его; строка gray(35%) и ImagickPixel с ней работают одинаково. Legacy=true относится к поведению до 3.4.0 и даёт другие результаты. Не исправляйте перенос старого рецепта случайной заменой 0.35 на 35 или переключением legacy: задайте требуемый смысл и сравните изображение.
Полный помощник восстановления PNG и сохранения сравнения
<?php
declare(strict_types=1);
function loadColorEffectsSource(): 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) !== '6cf00b645055f5417c7d538be645956f20a1afb00d033981d3d60a2654f6cecf') {
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 saveColorEffectsComparison(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";
}
Помощник читает Base64 через file_get_contents, проверяет base64_decode и hash, пишет source.png через file_put_contents. CompositeImage переносит готовые панели без масштабирования. SetImageDepth(8) и png:color-type=2 явно сохраняют RGB PNG8; это устройство выходного файла, а не обещание наличия цветных пикселей. Папка должна быть доступна для записи. Вход уже содержит нарисованный текст, поэтому runtime-шрифт не нужен.
Подготовка: запуск PHP, массив и ключ, объект, копирование, исключения, файлы.
Не спутать серые пиксели, каналы и прозрачность

Gray=true отвечает на вопрос «какие пиксели допускаются к инверсии», channel — «какие составляющие этих пикселей изменить». Это две независимые настройки. Цветная красная плашка не станет серой от true. Для серого негатива сначала отдельно преобразуйте цвет в серый, затем инвертируйте нужные каналы. Для нужного участка потребуется вырезка или маска.
У прозрачного RGBA наша проверка default изменила и alpha; явная маска Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE оставила alpha без изменения на пяти контрольных пикселях. Это конкретное поведение ImageMagick 7.1.1-46, а не правило для любого исторического default. В учебном RGB-файле прозрачности нет. Не добавляйте ALPHA, если цель — сохранить вырезанный силуэт.
Чтобы перенести идею на свой макет, сначала зафиксируйте RGB/sRGB и проверьте alpha, затем выберите false/true и маску. Канал — составляющая каждого пикселя, а не красный предмет. Полезный запуск: негатив R/G с сохранённым B.
Разобраться с единицами сепии и областью обработки

Сепия не означает «перекрасить в коричневый». В текущей реализации сначала вычисляется интенсивность, затем каналы получают разные сдвиги и ограничения; после этого библиотека выполняет NormalizeImage и ContrastImage. Эти последние шаги зависят от изображения целиком. Поэтому применение к вырезке способно изменить внутренние тона иначе, чем обработка всего листа с последующей вырезкой.
В PHP Manual одновременно названы native-диапазон 0..QuantumRange и начальное значение 80. Сверка с точным wrapper устраняет неоднозначность для Imagick 3.8.1: он вычисляет threshold×QuantumRange/100. В нашем Q16 PHP 80 передаёт MagickCore 52428; PHP 0.8×65535=52428 приводит уже к 34358689.8, гораздо выше native-максимума. Именно повторный пересчёт дал cyan на контрольных пикселях. Raw XML-пример не делает умножения, он передаёт аргумент как есть. Ни float-тип, ни отсутствие исключения не проверяют уместность: приложение должно отклонять NaN/INF и ограничивать PHP-настройку 0..100 до вызова.
В отдельной проверке на RGBA при корректном PHP threshold=80 изменились некоторые промежуточные значения alpha после общей цепочки. Поэтому непрозрачный основной пример не является обещанием сохранения прозрачности: для такого макета нужна отдельная стратегия alpha и свой контрольный запуск. Сравните обычное смешивание и вес полутонов, если требуется более простой управляемый сдвиг.
Проверять качество по нужному свойству
Сначала выберите измеримый критерий: сохранить чёрный/белый, служебные цвета, alpha или только получить оформительский вариант. Colorize не гарантирует исходный контраст; tint не гарантирует один конечный hue для цветного входа; negate(true) не обесцвечивает; sepia не сохраняет достоверность цвета. Отдельный оригинал, независимые копии и одинаковый масштаб просмотра делают различия заметными.
В сервисе проверяйте формат, ширину/высоту, число кадров, наличие профиля и право записи до фильтра. Ограничьте разрешение и число копий: каждый clone и большое сравнение расходуют память. Цветовые эффекты проходят по пикселям; стоимость растёт с площадью, но точное время зависит от версии, каналов, формата и цепочки. Измеряйте реальные входы. Ошибка чтения, фильтра и записи должна давать понятный отказ пользователю.
Все десять скачиваемых программ выполнены на PHP 8.5.11, Imagick 3.8.1 и ImageMagick 7.1.1-46 Q16. Точный stdout — имя PNG, результат — сохранённые пиксели. Примеры со строками силы относятся к этой современной ветви; для другой сборки сравнивайте версии и изображение. Вид «серый» и хранение RGB/Gray в PNG — разные свойства; учебный помощник принудительно записывает RGB PNG8.
Квантование — запись значения в конечное число уровней. Внутри библиотека работает с Q16, итог здесь сохраняется с 8 битами на канал. Поэтому экспорт контрольного пикселя прямо из native-объекта и чтение сохранённого PNG8 могут различаться на один уровень. Все конкретные RGB-числа урока взяты из сохранённых файлов. В примере «серая основа → tint» средняя панель отдельно квантуется при записи: это наглядное изображение промежуточного шага, а не точная копия всех внутренних Q16-значений, поступивших в tint.
Выбрать эффект и сделать самостоятельный вариант

- Нужна примесь цвета ко всему: colorize с явно заданными долями каналов.
- Нужны цветные полутона с чистыми крайними компонентами: tint; при необходимости сначала получить серую основу.
- Нужна смена полярности: negate, затем осознанный выбор gray и каналов.
- Нужна сепия в Imagick 3.8.1: PHP threshold=80 для начала, без повторного умножения на quantum; затем контроль своего результата.
Упражнение: сделать синий вариант картинки товара, сохранив обе нижние шкалы и исходник. Предлагаемое решение: clone исходника; cropImage(352,184,24,36) отдельной области; colorizeImage с цветом #2864c8 и gray(35%), false; compositeImage обратно в (24,36); сохранить новый PNG. Проверка — все внешние пиксели и шкалы совпадают, внутри цвет изменился. Полная программа: colorize только области. Затем замените операцию внутри области на сепию и объясните, почему нормализация меняет её внутренний результат.
Продолжение: гамма и контраст, документ и двоичные пороги, собственная отметка поверх готовой картинки, сохранение производных файлов. Новую настройку начинайте с оригинала: повторные потери и обрезку канала нельзя надёжно убрать обратным эффектом.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Imagick::colorizeImageНужен общий цветовой вариант рисунка: примешать цвет оформления ко всем пикселям или к известной области макета.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::colorizeImage(mixed $colorize, mixed $opacity, bool $legacy = false): boolНужен общий цветовой вариант рисунка: примешать цвет оформления ко всем пикселям или к известной области макета.

Самая маленькая запись
В $image уже загружена отдельная копия рисунка. Стрелка вызывает метод объекта; запятые отделяют цвет, силу по каналам и режим совместимости. Кавычки обозначают строки: #2864c8 — синий цвет, gray(35%) — серое значение с каждой RGB-составляющей 35%. False — логическое «нет» старому режиму. На плашке 128 получим RGB(97,118,153). Точка с запятой завершает команду. Чтобы сохранить оригинал, до вызова создайте $image = clone $source; простое присваивание не копирует объект.
$image->colorizeImage('#2864c8', 'gray(35%)', false);Это пояснение главного вызова. Полная скачиваемая программа ниже также загрузит вход, проверит результат и запишет сравнение. Основы: объект и метод, копия объекта, аргументы.
Сигнатура и параметры
Imagick::colorizeImage(mixed $colorize, mixed $opacity, bool $legacy = false): boolColorize смешивает исходные каналы с заданным цветом. В современном вызове gray(35%) задаёт одинаковую долю 35% для R/G/B: result = original × 0.65 + color × 0.35. Даже крайние чёрный и белый сдвигаются; это ожидаемая потеря исходного размаха.
| Аргумент | Смысл и единицы |
|---|---|
| $colorize | Обязательный mixed в официальной сигнатуре: строка цвета, например #2864c8, либо ImagickPixel. Здесь это RGB(40,100,200). |
| $opacity | Обязательный mixed. Официальный текст описывает ImagickPixel или float 0..1, однако современная ветвь Imagick 3.8.1 с legacy=false разбирает аргумент как цвет. Надёжная запись в этих программах: gray(35%) либо ImagickPixel с таким цветом. RGB-компоненты определяют доли смешивания по каналам. |
| $legacy | Необязательный bool, default false. True выбирает совместимость со старым поведением до Imagick 3.4.0. Он меняет интерпретацию opacity; это не дополнительная сила эффекта. |
Возвращаемое значение, версии и отказ
Результат bool: true при успехе. Метод меняет текущий объект Imagick; $ok = $image->colorizeImage(...) сохраняет флаг, не новую картинку. Доступность по PHP Manual: PECL imagick 2, PECL imagick 3. Обязательность и default показаны в сигнатуре; у первого аргумента нет default.
В PECL imagick 2.1.0 официально добавлены строковый цвет первым аргументом и float opacity вторым; прежде допускались только ImagickPixel. Позднейшая ветвь с legacy=false в проверенной 3.8.1 использует цвет для opacity, поэтому историческое описание float нельзя переносить в современный вызов без проверки. Raw-сигнатура мануала сохранена выше; для этих программ выбираем строки/объекты и false. Имена Reflection отличаются, поэтому примеры вызывают позиционные аргументы.
Пустой Imagick в проверенной версии даёт ImagickException. Неверная строка цвета также даёт ImagickException. Обвязка превращает отказ native-операции в исключение; чтение и запись могут отказать отдельно. Проверка ! означает «вернулся false», throw создаёт понятный отказ. Необработанное исключение завершит CLI-программу; веб-обработчик должен перехватить его, не показывая клиенту внутренние пути. True свидетельствует о выполнении, а качество выбирают по изображению.
Первый управляемый результат
<?php
declare(strict_types=1);
require __DIR__ . '/color-effects-fixture.php';
$source = loadColorEffectsSource();
$image = clone $source;
if (!$image->colorizeImage('#2864c8', 'gray(35%)', false)) {
throw new RuntimeException('Не удалось применить colorizeImage');
}
saveColorEffectsComparison([$source, $image], 'colorize-basic.png');
$source->clear();
$image->clear();
Результат: Справа смешаны 65% исходного канала и 35% канала цвета RGB(40,100,200). В сохранённом PNG8 чёрная плашка стала (14,35,70), белая — (179,200,235), средняя 128 — (97,118,153). Чёрный и белый перестали быть крайними значениями: такое смешивание меняет контраст. Числа относятся именно к файлу после квантования в 8 бит. Архив содержит example.php, color-effects-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник проверит и восстановит точный source.png без интернета и шрифтов во время запуска; итоговый PNG откройте обычным просмотрщиком. Панели идут в указанном порядке; первая всегда исходник. Подписи поясняющих рисунков добавлены отдельно. Размер PNG 800×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
colorize-basic.png
Практическая задача: Изменить только иллюстрацию, сохранив контрольные шкалы
Макет содержит картинку товара и контрольные цвета печати. Общий оттенок нужен только прямоугольнику картинки. Обрабатываем известную область 352×184 с началом x=24,y=36 и возвращаем её на независимую копию.
CropImage получает ширину 352, высоту 184 и начало x=24,y=36; setImagePage сбрасывает смещение вырезки. После обработки compositeImage возвращает её в (24,36). Переменная $region содержит отдельный объект. Нижние шкалы y≥248 лежат за пределами области; размер и координаты заданы макетом, библиотека не ищет товары сама.
New ImagickPixel создаёт объект с разобранным цветом. $color хранит цвет заливки, $strength — цвет с компонентами 35%. Эти роли различны; clear вызывается у обоих после применения. Если нужно обрабатывать непрямоугольную форму, следующий шаг — явная маска, а не флаг канала.
<?php
declare(strict_types=1);
require __DIR__ . '/color-effects-fixture.php';
$source = loadColorEffectsSource();
$image = clone $source;
$region = clone $source;
$region->cropImage(352, 184, 24, 36);
$region->setImagePage(0, 0, 0, 0);
$color = new ImagickPixel('#2864c8');
$strength = new ImagickPixel('gray(35%)');
if (!$region->colorizeImage($color, $strength, false)) {
throw new RuntimeException('Не удалось применить colorizeImage');
}
if (!$image->compositeImage($region, Imagick::COMPOSITE_OVER, 24, 36)) {
throw new RuntimeException('Не удалось вернуть область');
}
$region->clear();
$color->clear();
$strength->clear();
saveColorEffectsComparison([$source, $image], 'colorize-region.png');
$source->clear();
$image->clear();
Результат: Справа изменена только область x=24..375,y=36..219. Все пиксели снаружи, включая нижние серые и цветные плашки, совпадают с исходником. Объекты ImagickPixel передают тот же цвет и ту же силу 35%, что строки в первом примере; геометрия, а не распознавание товара, ограничивает обработку. Архив содержит example.php, color-effects-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник проверит и восстановит точный source.png без интернета и шрифтов во время запуска; итоговый PNG откройте обычным просмотрщиком. Панели идут в указанном порядке; первая всегда исходник. Подписи поясняющих рисунков добавлены отдельно. Размер PNG 800×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
colorize-region.png
Ошибки, ограничения и альтернативы
В выполненной сборке modern float 0.35 вызывает ImagickException, а rgba(0,0,0,0.35) при legacy=false оставляет RGB исходными: сила берётся из нулевых RGB-компонент, не из alpha этой строки. Gray(100%) полностью заменяет RGB цветом заливки; gray(0%) оставляет исходные RGB. Параметр opacity здесь нельзя без проверки приравнивать прозрачности выходного файла.
Оба основных сценария используют один непрозрачный sRGB PNG. Для прозрачного файла проверяйте alpha отдельно до и после операции; непрозрачный учебный результат не доказывает её сохранение. Для профилированных CMYK/ICC, линейного RGB, HDR и последовательностей кадров сначала определите формат, преобразования и обработку каждого кадра. Эффект не сохраняет документальную точность цвета: оригинал нужен отдельно.
Соседние инструменты: tintImage · negateImage · sepiaToneImage. Для яркости и контраста: тональная коррекция; для двоичного документа: пороги и отсечки.
Imagick::tintImageНужен оттенок в полутонах с сохранением чистого чёрного и белого, например для серии иллюстраций каталога.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::tintImage(mixed $tint, mixed $opacity, bool $legacy = false): boolНужен оттенок в полутонах с сохранением чистого чёрного и белого, например для серии иллюстраций каталога.

Самая маленькая запись
В $image находится отдельная копия. Стрелка вызывает метод, первый аргумент — цвет, второй — строка множителей RGB-вектора, третий false оставляет современное поведение. Gray(100%) означает полные множители каналов; это не требование сделать всё изображение непрозрачным. Чёрная и белая плашки останутся прежними, середина 128 в сохранённом PNG8 станет RGB(73,133,233). Точка с запятой завершает команду. Чтобы сохранить оригинал, до вызова создайте $image = clone $source; простое присваивание не копирует объект.
$image->tintImage('#2864c8', 'gray(100%)', false);Это пояснение главного вызова. Полная скачиваемая программа ниже также загрузит вход, проверит результат и запишет сравнение. Основы: объект и метод, копия объекта, аргументы.
Сигнатура и параметры
Imagick::tintImage(mixed $tint, mixed $opacity, bool $legacy = false): boolTint прибавляет цветовой вектор с весом f(x)=1−4×(x−0.5)². x — отдельная составляющая, приведённая к 0..1; в проверенной реализации вес вычисляется отдельно для R, G и B. На 0 и 1 вес равен нулю, около 0.5 максимален. Поэтому крайние компоненты сохраняются даже у насыщенного цветного пикселя.
| Аргумент | Смысл и единицы |
|---|---|
| $tint | Обязательный mixed: цветовая строка либо ImagickPixel. Цвет задаёт направление вектора; результат не обязан совпасть с этим цветом. |
| $opacity | Обязательный mixed. В современном режиме используйте строку цвета либо ImagickPixel: компоненты задают множители вектора. Вектор также вычитает интенсивность tint-цвета, поэтому gray(35%) не является просто «35% результата gray(100%)». Для основной наглядной модели берём gray(100%). |
| $legacy | Необязательный bool, default false. True сохраняет старую интерпретацию второго аргумента до Imagick 3.4.0. Смена legacy может заметно изменить изображение; для нового материала явно оставляем false. |
Возвращаемое значение, версии и отказ
Результат bool: true при успехе. Метод меняет текущий объект Imagick; $ok = $image->tintImage(...) сохраняет флаг, не новую картинку. Доступность по PHP Manual: PECL imagick 2, PECL imagick 3. Обязательность и default показаны в сигнатуре; у первого аргумента нет default.
В PECL imagick 2.1.0 официально добавлены строковый цвет первым аргументом и float opacity вторым; прежде допускались только ImagickPixel. Позднейшая ветвь с legacy=false в проверенной 3.8.1 использует цвет для opacity, поэтому историческое описание float нельзя переносить в современный вызов без проверки. Raw-сигнатура мануала сохранена выше; для этих программ выбираем строки/объекты и false. Имена Reflection отличаются, поэтому примеры вызывают позиционные аргументы.
Пустой Imagick в проверенной версии даёт ImagickException. Неверная строка цвета также даёт ImagickException. Обвязка превращает отказ native-операции в исключение; чтение и запись могут отказать отдельно. Проверка ! означает «вернулся false», throw создаёт понятный отказ. Необработанное исключение завершит CLI-программу; веб-обработчик должен перехватить его, не показывая клиенту внутренние пути. True свидетельствует о выполнении, а качество выбирают по изображению.
Первый управляемый результат
<?php
declare(strict_types=1);
require __DIR__ . '/color-effects-fixture.php';
$source = loadColorEffectsSource();
$image = clone $source;
if (!$image->tintImage('#2864c8', 'gray(100%)', false)) {
throw new RuntimeException('Не удалось применить tintImage');
}
saveColorEffectsComparison([$source, $image], 'tint-basic.png');
$source->clear();
$image->clear();
Результат: Справа tint с цветом #2864c8 и множителями gray(100%). В сохранённом PNG8 чёрная и белая плашки сохранены; средняя 128 стала (73,133,233). Насыщенные контрольные RGB/CMY-плашки тоже сохранились: каждая их составляющая равна 0 или 255 и имеет нулевой вес. Метод не заменяет любой цвет выбранным синим. Архив содержит example.php, color-effects-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник проверит и восстановит точный source.png без интернета и шрифтов во время запуска; итоговый PNG откройте обычным просмотрщиком. Панели идут в указанном порядке; первая всегда исходник. Подписи поясняющих рисунков добавлены отдельно. Размер PNG 800×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
tint-basic.png
Практическая задача: Сначала убрать исходные оттенки, затем тонировать полутона
Для согласованной серии каталога исходные красные и зелёные детали не должны задавать оттенок конечной иллюстрации. Сначала сознательно преобразуем цвет в серое представление, затем возвращаем представление sRGB и тонируем независимую копию этой основы.
TransformImageColorspace(GRAY) сознательно удаляет исходную цветность по правилам библиотеки. Второй transform в SRGB делает серые значения RGB-основой для цветного tint. $gray = clone $image сохраняет промежуточную основу перед изменением, чтобы на выходе показать весь путь данных. Значения не вычисляются простым средним (R+G+B)/3.
<?php
declare(strict_types=1);
require __DIR__ . '/color-effects-fixture.php';
$source = loadColorEffectsSource();
$image = clone $source;
$image->transformImageColorspace(Imagick::COLORSPACE_GRAY);
$image->transformImageColorspace(Imagick::COLORSPACE_SRGB);
$gray = clone $image;
if (!$image->tintImage('#2864c8', 'gray(100%)', false)) {
throw new RuntimeException('Не удалось применить tintImage');
}
saveColorEffectsComparison([$source, $gray, $image], 'tint-grayscale.png');
$source->clear();
$gray->clear();
$image->clear();
Результат: Панели: цветной исходник, серая основа, tint с тем же #2864c8 и gray(100%). Цветные плашки в центре стали серыми, а справа получили оттенки через полутона. Чёрное и белое сохранены. Цвет удалён отдельным transformImageColorspace, а не аргументом tint и не negateImage(true). Архив содержит example.php, color-effects-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник проверит и восстановит точный source.png без интернета и шрифтов во время запуска; итоговый PNG откройте обычным просмотрщиком. Панели идут в указанном порядке; первая всегда исходник. Подписи поясняющих рисунков добавлены отдельно. Размер PNG 1200×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
tint-grayscale.png
Ошибки, ограничения и альтернативы
При legacy=false float 0.35 в нашей версии отклонён как нераспознанный цвет. Чёрный rgba(0,0,0,0.35) не задаёт обычную силу tint: его RGB множители нулевые и полутона темнеют. Tint не превращает цветное фото в одноцветное: для этого сначала осознанно получите серую основу. Формула веса не равна обещанию сохранить воспринимаемую яркость каждого цвета; возможна обрезка составляющих в 0/максимум.
Оба основных сценария используют один непрозрачный sRGB PNG. Для прозрачного файла проверяйте alpha отдельно до и после операции; непрозрачный учебный результат не доказывает её сохранение. Для профилированных CMYK/ICC, линейного RGB, HDR и последовательностей кадров сначала определите формат, преобразования и обработку каждого кадра. Эффект не сохраняет документальную точность цвета: оригинал нужен отдельно.
Соседние инструменты: colorizeImage · negateImage · sepiaToneImage. Для яркости и контраста: тональная коррекция; для двоичного документа: пороги и отсечки.
Imagick::negateImageНужно увидеть негатив макета, изменить полярность серой части либо исследовать конкретные цветовые каналы.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::negateImage(bool $gray, int $channel = Imagick::CHANNEL_DEFAULT): boolНужно увидеть негатив макета, изменить полярность серой части либо исследовать конкретные цветовые каналы.

Самая маленькая запись
В $image загружен наш непрозрачный RGB-рисунок. Стрелка вызывает метод, false в круглых скобках разрешает инверсию всех пикселей. Второй аргумент пропущен и имеет default CHANNEL_DEFAULT. Красная RGB-плашка станет cyan, серый 64 станет 191. True изменил бы только серые пиксели, сохранив цветные. Точка с запятой завершает команду. Чтобы сохранить оригинал, до вызова создайте $image = clone $source; простое присваивание не копирует объект.
$image->negateImage(false);Это пояснение главного вызова. Полная скачиваемая программа ниже также загрузит вход, проверит результат и запишет сравнение. Основы: объект и метод, копия объекта, аргументы.
Сигнатура и параметры
Imagick::negateImage(bool $gray, int $channel = Imagick::CHANNEL_DEFAULT): boolNegate заменяет выбранное значение на QuantumRange−значение. Для PNG8 на иллюстрации это 255−канал. Gray=true ограничивает операцию серыми пикселями; он не выполняет преобразование RGB в grayscale.
| Аргумент | Смысл и единицы |
|---|---|
| $gray | Обязательный bool без default. False разрешает инверсию всех пикселей, true — только пикселей, которые библиотека считает серыми. На наших точных RGB-плашках это R=G=B. |
| $channel | Необязательный int, default Imagick::CHANNEL_DEFAULT. Выберите константу, допустимую для текущего режима каналов. Для нескольких каналов объедините флаги побитовым |; в примере CHANNEL_RED | CHANNEL_GREEN. |
Возвращаемое значение, версии и отказ
Результат bool: true при успехе. Метод меняет текущий объект Imagick; $ok = $image->negateImage(...) сохраняет флаг, не новую картинку. Доступность по PHP Manual: PECL imagick 2, PECL imagick 3. Обязательность и default показаны в сигнатуре; у первого аргумента нет default.
Пустой Imagick в проверенной версии даёт ImagickException. Обвязка превращает отказ native-операции в исключение; чтение и запись могут отказать отдельно. Проверка ! означает «вернулся false», throw создаёт понятный отказ. Необработанное исключение завершит CLI-программу; веб-обработчик должен перехватить его, не показывая клиенту внутренние пути. True свидетельствует о выполнении, а качество выбирают по изображению.
Первый управляемый результат
<?php
declare(strict_types=1);
require __DIR__ . '/color-effects-fixture.php';
$source = loadColorEffectsSource();
$image = clone $source;
if (!$image->negateImage(false)) {
throw new RuntimeException('Не удалось применить negateImage');
}
$gray = clone $source;
if (!$gray->negateImage(true)) {
throw new RuntimeException('Не удалось применить negateImage');
}
saveColorEffectsComparison([$source, $image, $gray], 'negate-basic.png');
$source->clear();
$image->clear();
$gray->clear();
Результат: Панели: исходник, negateImage(false), negateImage(true). В центре каждый RGB-канал стал 255−исходное значение: красная плашка превратилась в cyan. Справа серые плашки 0/64/128/192/255 стали 255/191/127/63/0, а шесть цветных плашек остались прежними. True не обесцвечивает цветное изображение. Архив содержит example.php, color-effects-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник проверит и восстановит точный source.png без интернета и шрифтов во время запуска; итоговый PNG откройте обычным просмотрщиком. Панели идут в указанном порядке; первая всегда исходник. Подписи поясняющих рисунков добавлены отдельно. Размер PNG 1200×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
negate-basic.png
Практическая задача: Получить диагностический вариант двух RGB-каналов
В служебном просмотре макета нужно выделить изменение красной и зелёной составляющих, сохранив синюю. Это проверка цветовых каналов всего растра; она не выделяет красные предметы и не выбирает прямоугольную область.
Одна вертикальная черта | — побитовое объединение флагов, это не логическое ||. Маска содержит RED и GREEN. Метод применяется ко всему изображению, но меняет только эти составляющие. Для обычного RGB-негатива с сохранением alpha добавляют BLUE, не ALPHA.
<?php
declare(strict_types=1);
require __DIR__ . '/color-effects-fixture.php';
$source = loadColorEffectsSource();
$image = clone $source;
$channels = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN;
if (!$image->negateImage(false, $channels)) {
throw new RuntimeException('Не удалось применить negateImage');
}
saveColorEffectsComparison([$source, $image], 'negate-channels.png');
$source->clear();
$image->clear();
Результат: Справа R и G равны 255−исходный канал; B совпадает с исходником у всех пикселей. Красная плашка стала зелёной, синяя — белой. Символ | объединяет флаги каналов. Alpha в маску не включена; для инверсии только цвета у прозрачного RGB выбирают явную маску RED|GREEN|BLUE. Архив содержит example.php, color-effects-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник проверит и восстановит точный source.png без интернета и шрифтов во время запуска; итоговый PNG откройте обычным просмотрщиком. Панели идут в указанном порядке; первая всегда исходник. Подписи поясняющих рисунков добавлены отдельно. Размер PNG 800×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
negate-channels.png
Ошибки, ограничения и альтернативы
На прозрачном RGBA в нашей ImageMagick 7 default инвертировал и alpha: непрозрачное могло стать прозрачным. Для сохранения alpha RGB-изображения задавайте RED|GREEN|BLUE явно. CHANNEL_ALL также не означает «только цвет». True не является конвертацией в серый, а JPEG после сжатия может содержать почти серые цветные пиксели: не считайте их гарантированно той же группой, что точная учебная шкала.
Оба основных сценария используют один непрозрачный sRGB PNG. Для прозрачного файла проверяйте alpha отдельно до и после операции; непрозрачный учебный результат не доказывает её сохранение. Для профилированных CMYK/ICC, линейного RGB, HDR и последовательностей кадров сначала определите формат, преобразования и обработку каждого кадра. Эффект не сохраняет документальную точность цвета: оригинал нужен отдельно.
Соседние инструменты: colorizeImage · tintImage · sepiaToneImage. Для яркости и контраста: тональная коррекция; для двоичного документа: пороги и отсечки.
Imagick::sepiaToneImageНужен отдельный оформительский вариант иллюстрации с эффектом сепии или сепия внутри макета с сохранёнными служебными цветами.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::sepiaToneImage(float $threshold): boolНужен отдельный оформительский вариант иллюстрации с эффектом сепии или сепия внутри макета с сохранёнными служебными цветами.

Самая маленькая запись
В $image уже загружена независимая копия. Стрелка вызывает метод, число 80 в круглых скобках — единственный аргумент. В PHP-обвязке Imagick 3.8.1 оно пересчитывается в 80% QuantumRange: 80×65535/100=52428. Этот пересчёт уже выполняет расширение; дополнительное умножение в PHP не требуется. Справа будет оформительская сепия, а не двоичное чёрно-белое изображение. Точка с запятой завершает команду. Чтобы сохранить оригинал, до вызова создайте $image = clone $source; простое присваивание не копирует объект.
$image->sepiaToneImage(80);Это пояснение главного вызова. Полная скачиваемая программа ниже также загрузит вход, проверит результат и запишет сравнение. Основы: объект и метод, копия объекта, аргументы.
Сигнатура и параметры
Imagick::sepiaToneImage(float $threshold): boolСепия имитирует характер тонированного отпечатка. Raw-описание PHP Manual называет диапазон 0..QuantumRange и старт 80. Однако точная PHP-обвязка Imagick 3.8.1 вычисляет native threshold = PHP threshold × QuantumRange / 100. Поэтому для этой версии передаём PHP-значение 80 в шкале 0..100; на уровне MagickCore получается 52428 из 65535. Внутри также выполняются normalize/contrast.
| Аргумент | Смысл и единицы |
|---|---|
| $threshold | Единственный обязательный float без default. В выполненной PHP-версии используем процентную шкалу 0..100: 80 передаёт 80% native-диапазона. Raw-формулировка 0..QuantumRange сохранена и здесь явно отделена от реального пересчёта PHP-wrapper. Умножать 80% на QuantumRange перед этим PHP-вызовом не нужно. |
Возвращаемое значение, версии и отказ
Результат bool: true при успехе. Метод меняет текущий объект Imagick; $ok = $image->sepiaToneImage(...) сохраняет флаг, не новую картинку. Доступность по PHP Manual: PECL imagick 2, PECL imagick 3. Обязательность и default показаны в сигнатуре; у первого аргумента нет default.
Пустой Imagick в проверенной версии даёт ImagickException. Обвязка превращает отказ native-операции в исключение; чтение и запись могут отказать отдельно. Проверка ! означает «вернулся false», throw создаёт понятный отказ. Необработанное исключение завершит CLI-программу; веб-обработчик должен перехватить его, не показывая клиенту внутренние пути. True свидетельствует о выполнении, а качество выбирают по изображению.
Первый управляемый результат
<?php
declare(strict_types=1);
require __DIR__ . '/color-effects-fixture.php';
$source = loadColorEffectsSource();
$image = clone $source;
if (!$image->sepiaToneImage(80)) {
throw new RuntimeException('Не удалось применить sepiaToneImage');
}
saveColorEffectsComparison([$source, $image], 'sepia-basic.png');
$source->clear();
$image->clear();
Результат: Слева цветной оригинал, справа фактическая сепия с PHP-аргументом threshold=80. Imagick 3.8.1 переводит его в 80% QuantumRange: 52428 при Q16=65535. Библиотека получает интенсивность пикселей, перестраивает цветовые составляющие и затем выполняет нормализацию и усиление контраста. Результат не равен наложению одного полупрозрачного коричневого слоя. Архив содержит example.php, color-effects-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник проверит и восстановит точный source.png без интернета и шрифтов во время запуска; итоговый PNG откройте обычным просмотрщиком. Панели идут в указанном порядке; первая всегда исходник. Подписи поясняющих рисунков добавлены отдельно. Размер PNG 800×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
sepia-basic.png
Практическая задача: Оставить служебные поля цветными в макете с сепией
Исторический вариант изображения нужен в прямоугольнике товара, а цветные образцы и поля должны остаться пригодными для сравнения. Применяем сепию к вырезке; исходник и служебные поля сохраняем отдельно.
CropImage получает ширину 352, высоту 184 и начало x=24,y=36; setImagePage сбрасывает смещение вырезки. После обработки compositeImage возвращает её в (24,36). Переменная $region содержит отдельный объект. Нижние шкалы y≥248 лежат за пределами области; размер и координаты заданы макетом, библиотека не ищет товары сама.
<?php
declare(strict_types=1);
require __DIR__ . '/color-effects-fixture.php';
$source = loadColorEffectsSource();
$image = clone $source;
$region = clone $source;
$region->cropImage(352, 184, 24, 36);
$region->setImagePage(0, 0, 0, 0);
if (!$region->sepiaToneImage(80)) {
throw new RuntimeException('Не удалось применить sepiaToneImage');
}
if (!$image->compositeImage($region, Imagick::COMPOSITE_OVER, 24, 36)) {
throw new RuntimeException('Не удалось вернуть область');
}
$region->clear();
saveColorEffectsComparison([$source, $image], 'sepia-region.png');
$source->clear();
$image->clear();
Результат: Справа сепия с PHP threshold=80 только внутри x=24..375,y=36..219. Все внешние пиксели, в том числе две контрольные шкалы, сохранены точно. Нормализация сепии работает по обработанной вырезке: её результат внутри не обязан совпасть с тем же прямоугольником из сепии всего изображения. Архив содержит example.php, color-effects-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник проверит и восстановит точный source.png без интернета и шрифтов во время запуска; итоговый PNG откройте обычным просмотрщиком. Панели идут в указанном порядке; первая всегда исходник. Подписи поясняющих рисунков добавлены отдельно. Размер PNG 800×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
sepia-region.png
Ошибки, ограничения и альтернативы
Не переносите quantum-единицы MagickCore непосредственно в этот PHP-метод. В ограниченном preflight PHP 80 дал сепию, а 0.8×QuantumRange был повторно умножен внутри wrapper и дал ошибочный cyan-вариант. Файл официального XML-примера просто передаёт $sepia; он не выполняет умножения. Параметр не является двоичным порогом thresholdImage. Изменённые цвета и нормализация не восстанавливаются простым обратным вызовом.
Оба основных сценария используют один непрозрачный sRGB PNG. Для прозрачного файла проверяйте alpha отдельно до и после операции; непрозрачный учебный результат не доказывает её сохранение. Для профилированных CMYK/ICC, линейного RGB, HDR и последовательностей кадров сначала определите формат, преобразования и обработку каждого кадра. Эффект не сохраняет документальную точность цвета: оригинал нужен отдельно.
Соседние инструменты: colorizeImage · tintImage · negateImage. Для яркости и контраста: тональная коррекция; для двоичного документа: пороги и отсечки.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


