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

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

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

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

Глава 345 · После загрузки изображения

Imagick: цветовые варианты, полутона, негатив и сепия

От первого синего PNG до смешивания по каналам, tint на серой основе, осознанной инверсии и сепии отдельной области.

Получить первый цветовой вариант каталога

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

Собственный цветной исходник: коробка, кружка, пять нейтральных и шесть насыщенных цветных плашек
Собственный цветной исходник: коробка, кружка, пять нейтральных и шесть насыщенных цветных плашек
Первый результат colorize: исходник и фактическая смесь с RGB(40,100,200) на 35%; чёрный и белый тоже сдвигаются
Первый результат colorize: исходник и фактическая смесь с RGB(40,100,200) на 35%; чёрный и белый тоже сдвигаются

Главная запись $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

Четыре операции и четыре разных смысла

Конкретная серая шкала: смешивание затрагивает края, tint сильнее меняет середину, негатив переставляет значения
Конкретная серая шкала: смешивание затрагивает края, tint сильнее меняет середину, негатив переставляет значения
ПотребностьМетодКак отличить результат
Примешать цвет оформления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, массив и ключ, объект, копирование, исключения, файлы.

Не спутать серые пиксели, каналы и прозрачность

False инвертирует весь рисунок, true только серые пиксели; маска R|G сохраняет B
False инвертирует весь рисунок, true только серые пиксели; маска R|G сохраняет B

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.

Разобраться с единицами сепии и областью обработки

PHP threshold=80: Imagick сам переводит его в 80% QuantumRange; область и служебные поля выбраны явно
PHP threshold=80: Imagick сам переводит его в 80% QuantumRange; область и служебные поля выбраны явно

Сепия не означает «перекрасить в коричневый». В текущей реализации сначала вычисляется интенсивность, затем каналы получают разные сдвиги и ограничения; после этого библиотека выполняет 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): bool

Colorize смешивает исходные каналы с заданным цветом. В современном вызове 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

Нужен оттенок в полутонах с сохранением чистого чёрного и белого, например для серии иллюстраций каталога.

Tint цветного входа и отдельной серой основы: края компоненты сохраняются, полутона меняются
Tint цветного входа и отдельной серой основы: края компоненты сохраняются, полутона меняются

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

В $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): bool

Tint прибавляет цветовой вектор с весом 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

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

Полный негатив, только серые пиксели и выбранные R/G-каналы на том же входе
Полный негатив, только серые пиксели и выбранные R/G-каналы на том же входе

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

В $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): bool

Negate заменяет выбранное значение на 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.

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