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

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

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

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

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

Imagick: яркость, контраст, насыщенность и гамма с видимым сравнением

Четыре тональные операции на одном переносимом исходнике: от короткого вызова и нейтральных параметров до каналов, гаммы и осознанных повторов.

Увидеть исходник и первое осветление

Для сайта нужна более светлая иллюстрация карточки товара, но важно видеть, что именно изменилось и не потерять исходник. Здесь четыре операции над яркостью, контрастом, насыщенностью и средними тонами. Вместо чужой фотографии возьмём собственный учебный рисунок: синяя коробка, оранжевая кружка, тени, плавная серая полоса и семь контрольных образцов. Он показывает преобразования воспроизводимо, но не имитирует все условия съёмки реального товара.

Исходный учебный PNG 400×280: собственная иллюстрация с градиентами и образцами 0/32/64/128/192/224/255; это входной файл, не фотография
Исходный учебный PNG 400×280: собственная иллюстрация с градиентами и образцами 0/32/64/128/192/224/255; это входной файл, не фотография
Слева исходник, справа результат brightnessContrastImage(15,0): света поднялись, некоторые светлые уровни слились в белый
Слева исходник, справа результат brightnessContrastImage(15,0): света поднялись, некоторые светлые уровни слились в белый

Главная операция короткая: $image->brightnessContrastImage(15, 0);. $image — переменная с загруженным изображением, стрелка вызывает метод, первое число повышает яркость, второе оставляет контраст без изменения. Метод меняет этот объект. Чтобы сохранить исходник, сначала делаем $image = clone $source;: это отдельная копия, обычное $image = $source; оставило бы два имени одного объекта.

$image = clone $source;
$image->brightnessContrastImage(15, 0);

Это поясняющий фрагмент: $source загружается в полной программе ниже. Здесь 15 — не 15 RGB-единиц и не абсолютный желаемый уровень;0 — нейтральный contrast. В полном коде if с ! проверяет false, RuntimeException сообщает отказ, а помощник сохраняет PNG со сравнением.

В строке saveToneComparison([$source, $image], 'first-brightness.png') квадратные скобки задают список двух картинок: исходник первым, копия второй. Помощник принимает этот список и имя выходного файла, ставит исходник слева, результат справа и записывает их рядом без масштабирования. Для замены входа своим файлом в этом первом опыте нужен тот же размер 400×280; иные размеры согласуйте с помощником сравнения. Сам эффект не требует этого размера — это условие нашего наглядного макета.

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

require __DIR__ . '/tone-fixture.php';
$source = loadToneSource();
$image = clone $source;
if (!$image->brightnessContrastImage(15, 0)) {
    throw new RuntimeException('Не удалось применить brightnessContrastImage');
}
saveToneComparison([$source, $image], 'first-brightness.png');
$source->clear();
$image->clear();

Результат: Справа brightness 15/contrast 0: серый 128 стал 166, чёрный 0 — 38; уровни 224 и 255 стали 255. Осветление не создало новых деталей в пересвеченных участках. Архив примера содержит example.php, tone-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; полученный PNG откройте обычным просмотрщиком. Слева всегда исходник, справа обработанная копия; при трёх панелях порядок указан в описании. Названия/стрелки на поясняющих иллюстрациях не рисуются PHP-программой. Файл имеет 800×280 пикселей, без изменения геометрии предметов.

Ожидаемый вывод
first-brightness.png

Тоны, каналы и сохранение исходника

Реальные образцы исходника и обработанной копии: операция меняет тона, сравнение сохраняет обе картинки
Реальные образцы исходника и обработанной копии: операция меняет тона, сравнение сохраняет обе картинки

Пиксель RGB содержит три составляющие: красную R, зелёную G и синюю B. На нашей 8-битной контрольной шкале 0 — чёрный,255 — белый, одинаковые R/G/B дают серый. Сам native-runtime работает с более высокой точностью; здесь читаем итоговый 8-битный PNG. Тональная операция меняет значения, не положение пикселей. Это отличает её от изменения размеров или геометрической резкости.

ПотребностьВыбор и нейтральная настройка
Сдвинуть яркость и отдельно численно изменить контрастbrightnessContrastImage:0,0 нейтрально; можно выбрать channel.
Яркость, насыщенность и поворот оттенкаmodulateImage:100,100,100 нейтрально; hue имеет процентную шкалу.
Нелинейно поднять/опустить средние тонаgammaImage:1 нейтрально; выбранный RGB-канал можно обработать отдельно.
Простой шаг усилить или смягчить различияcontrastImage:true усиливает,false уменьшает; нейтрального bool здесь нет.

Функция saveToneComparison получает массив [$source, $image]: первая картинка идёт слева, вторая справа. Она создаёт холст 800×280 и без масштабирования вставляет две панели 400×280. Внутри проверяются размеры панелей и запись файла. Это оформление результата, не дополнительная тональная коррекция. Echo сообщает только имя файла в терминале. Для HTTP-выдачи нужны отдельные Content-Type/заголовки и отсутствие лишнего текста; здесь работаем с CLI и файлами.

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

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

Если это первые объекты, массивы или подключаемые файлы, полезны объекты, clone, массивы и файлы. Переданная через return картинка — объект Imagick; каждый тональный метод возвращает bool и изменяет её на месте. Освобождаем копии clear после сохранения.

Нейтрально 0 или 100: не переносить числа по названию

Три независимые панели: исходник, brightnessContrastImage(0,0),modulateImage(100,100,100); нейтральные настройки дают одинаковые пиксели
Три независимые панели: исходник, brightnessContrastImage(0,0),modulateImage(100,100,100); нейтральные настройки дают одинаковые пиксели

Два похожих названия используют разные нейтральные числа. Проверим это до настройки эффекта: создадим обе копии из $source, применим 0,0 к первой и 100,100,100 ко второй. Поэтому их можно честно сравнивать с исходником, а не с результатом предыдущей обработки.

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

require __DIR__ . '/tone-fixture.php';
$source = loadToneSource();
$zero = clone $source;
$hundred = clone $source;
if (!$zero->brightnessContrastImage(0, 0) || !$hundred->modulateImage(100, 100, 100)) {
    throw new RuntimeException('Не удалось проверить нейтральные настройки');
}
saveToneComparison([$source, $zero, $hundred], 'neutral-controls.png');
$source->clear();
$zero->clear();
$hundred->clear();

Результат: Три панели одинаковы по RGB-пикселям: слева исходник, в центре нулевая brightness/contrast, справа процентные 100/100/100. Общий PNG 1200×280. 0 у saturation/hue в modulate не означает «ничего не менять». Архив примера содержит example.php, tone-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; полученный PNG откройте обычным просмотрщиком. Слева всегда исходник, справа обработанная копия; при трёх панелях порядок указан в описании. Названия/стрелки на поясняющих иллюстрациях не рисуются PHP-программой. Файл имеет 1200×280 пикселей, без изменения геометрии предметов.

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

Выбирать канал и понимать цветовой сдвиг

Для RGB канал — конкретная составляющая пикселя. CHANNEL_RED не означает «красные предметы»: он меняет красную составляющую каждого выбранного пикселя, включая серый фон. Поэтому серый 128/128/128 может стать 158/128/128 или 95/128/128. Это видно в практических примерах brightnessContrastImage и gammaImage. Для нескольких каналов используется битовое объединение |, а не сложение настроек одного эффекта.

У modulateImage нет channel-параметра: он работает через цветовую модель. Насыщенность и hue не независимые RGB-составляющие. Наш вход — RGB PNG с градиентами; CMYK, профили, alpha и HDR требуют собственного решения. Не удаляйте профиль вслепую, чтобы «совпали цвета».

Конкретные вызовы: изменить только R через brightnessContrastImage и нелинейно изменить R через gammaImage.

Менять пиксели и gamma-метаданные — разные действия

GammaImage перерабатывает тональные значения. SetImageGamma записывает gamma-атрибут изображения; сама эта установка не равна перерасчёту каждого RGB-пикселя. В нашей сборке setImageGamma(2.0) изменил атрибут, а сигнатура пикселей осталась исходной. Поэтому нельзя прочитать getImageGamma с одной картинки, записать его другой и считать, что их экспозиции выровнялись.

Разные просмотрщики учитывают gamma/ICC-профили и монитор. Наша иллюстрация и численные контрольные образцы нужны, чтобы понимать конкретную операцию, а не обещать одинаковое восприятие на любом устройстве. Если чужой редактор на gamma 2 затемняет, а Imagick осветляет, проверьте определение шкалы и цветовой pipeline. Описание отдельного атрибута: официальный setImageGamma.

Сравнение, обрезание светов и повторные проходы

Для выбора параметра каждый вариант начинайте с clone исходника. Повторный вызов меняет уже обработанную копию; он не является настройкой ползунка поверх сохранённого оригинала. Пример contrastImage(false) специально показывает один и два прохода. Два противоположных вызова не гарантируют возврат: квантизация и обрезание 0/255 теряют сведения.

Показанный источник — собственный тестовый макет, не фотография. Для реальной съёмки отдельно решают экспозицию, цветовую достоверность, профиль и задачу пользователя. Цветовая вариация hue уместна для иллюстрации и может быть недопустима для карточки реального товара. Делайте предпросмотр и храните оригинал.

Упражнение: получить более тёмную копию, сохранив нейтральные saturation/hue. Решение: clone исходника, затем modulateImage(85,100,100) и сохранение отдельного файла. Если нужны только более тёмные средние тона с сохранением чёрного/белого, сравните gammaImage(0.8) на другой независимой копии; эти операции не обязаны дать одинаковые пиксели.

Выбрать действие по задаче и двигаться дальше

  • Brightness/contrast отдельно численно: brightnessContrastImage с нейтральными 0,0.
  • Насыщенность и поворот оттенка: modulateImage с нейтральными 100,100,100.
  • Средние тона нелинейно: gammaImage с нейтральным 1, при необходимости с явным каналом.
  • Простой шаг контраста: contrastImage(true/false), где false тоже изменяет изображение.

Для первой программы нужен работающий PHP, для файлов — пути и права, для сохранения оригинала — копия объекта. После коррекции можно нанести схему или свой знак. Другие эффекты, фильтры и весь набор возможностей Imagick изучаются отдельными темами.

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

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

Imagick::brightnessContrastImageМакет слишком тусклый: нужно отдельно сдвинуть уровни и усилить различия, имея численные настройки для обоих действий.

PECL imagick 3 >= 3.3.0 · imagick

Imagick::brightnessContrastImage(float $brightness, float $contrast, int $channel = Imagick::CHANNEL_DEFAULT): bool

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

Реальная обработка одного исходника: Imagick::brightnessContrastImage
Реальная обработка одного исходника: Imagick::brightnessContrastImage

Сигнатура и параметры

Imagick::brightnessContrastImage(float $brightness, float $contrast, int $channel = Imagick::CHANNEL_DEFAULT): bool

Метод меняет текущие пиксели изображения: brightness и contrast преобразуются в наклон и смещение тональной функции. Нейтральная пара 0,0. Положительные значения увеличивают соответствующее действие, отрицательные уменьшают. Это не установка абсолютной «яркости файла».

АргументЗначение и единицы
$brightnessfloat, процент изменения по шкале native-операции−100..100;0 нейтрально. В первом примере 15. Слишком сильное осветление сводит разные светлые значения к 255.
$contrastfloat, процент изменения−100..100;0 нейтрально. Положительный контраст раздвигает тона, отрицательный приближает их к середине. Крайние параметры дают сильное обрезание/вырождение; в примерах умеренные 0/25.
$channelнеобязательный int, по официальной сигнатуре Imagick::CHANNEL_DEFAULT. Для нашего RGB PNG default обрабатывает цветовые каналы; явный Imagick::CHANNEL_RED меняет только R. Для нескольких каналов константы объединяют битовым |; не переносите RGB-обозначения на произвольный цветовой режим без проверки.

Возвращаемое значение, версии и отказ

Возвращается bool: true при успехе. Это не новая картинка — изменяются пиксели текущего объекта Imagick. Присваивание $result = $image->brightnessContrastImage(...) сохранит флаг, а не изображение; независимую картинку заранее создаёт clone. Доступность по официальному мануалу: PECL imagick 3 >= 3.3.0.

В проверенной обвязке Imagick 3.8.1 сначала требуется непустое изображение; native-отказ преобразуется в ImagickException. У метода и последующей записи файла отдельные точки отказа. Числовые ограничения интерфейса приложения выбирают и проверяют явно; не нужно приписывать PHP API несуществующий универсальный валидатор любого float. Все показанные настройки умеренные и применены к одному RGB PNG; это не исследование всех цветов, профилей и кадров анимации.

Первый управляемый результат

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

require __DIR__ . '/tone-fixture.php';
$source = loadToneSource();
$image = clone $source;
if (!$image->brightnessContrastImage(0, 25)) {
    throw new RuntimeException('Не удалось применить brightnessContrastImage');
}
saveToneComparison([$source, $image], 'brightness-contrast.png');
$source->clear();
$image->clear();

Результат: Слева исходник, справа контраст 25 при brightness 0: тёмный образец 64 стал 42, светлый 192 — 213; края шкалы могут обрезаться до 0/255. Размеры и расположение предметов остались прежними. Архив примера содержит example.php, tone-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; полученный PNG откройте обычным просмотрщиком. Слева всегда исходник, справа обработанная копия; при трёх панелях порядок указан в описании. Названия/стрелки на поясняющих иллюстрациях не рисуются PHP-программой. Файл имеет 800×280 пикселей, без изменения геометрии предметов.

Ожидаемый вывод
brightness-contrast.png

Практическая задача: Получить красноватый вариант иллюстрации, меняя только R

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

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

require __DIR__ . '/tone-fixture.php';
$source = loadToneSource();
$image = clone $source;
if (!$image->brightnessContrastImage(12, 0, Imagick::CHANNEL_RED)) {
    throw new RuntimeException('Не удалось применить brightnessContrastImage');
}
saveToneComparison([$source, $image], 'red-channel-brightness.png');
$source->clear();
$image->clear();

Результат: Справа изменён только красный канал: серый 128 превратился в RGB (158,128,128). По всему изображению G/B остались исходными. Нейтральные серые стали цветными — ожидаемое следствие выбора одного канала. Архив примера содержит example.php, tone-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; полученный PNG откройте обычным просмотрщиком. Слева всегда исходник, справа обработанная копия; при трёх панелях порядок указан в описании. Названия/стрелки на поясняющих иллюстрациях не рисуются PHP-программой. Файл имеет 800×280 пикселей, без изменения геометрии предметов.

Ожидаемый вывод
red-channel-brightness.png

Ошибки, ограничения и альтернативы

Brightness 0 у этого метода нейтрально, а у modulate brightness 0 не нейтрально. Обрезанные в 0/255 уровни не восстановятся обратным знаком. Не переносите готовые коэффициенты старой версии ImageMagick на новую, если нужен точный числовой результат. Float в PHP не означает обещание осмысленного результата для INF/NAN или любой величины за пределами рабочей шкалы.

Для своего обработчика заранее ограничьте размеры изображения, допустимые форматы, параметры и количество проходов. Native-память нужна для исходника, копий и результата; стоимость растёт с количеством пикселей и повторов. Четыре метода работают с текущим изображением объекта; анимированный/многостраничный вход требует явного решения по кадрам. Ни один эффект не делает все фотографии автоматически правильными.

Сравнить инструменты: modulateImage · gammaImage · contrastImage. Дальше: добавить собственные фигуры, обработка отказа.

Imagick::modulateImageНужно осветлить иллюстрацию или изменить её насыщенность и оттенок, понимая, какие два параметра оставить в покое.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::modulateImage(float $brightness, float $saturation, float $hue): bool

Нужно осветлить иллюстрацию или изменить её насыщенность и оттенок, понимая, какие два параметра оставить в покое.

modulateImage(100,65,150): исходник слева, справа менее насыщенный вариант со сдвигом оттенка
modulateImage(100,65,150): исходник слева, справа менее насыщенный вариант со сдвигом оттенка

Сигнатура и параметры

Imagick::modulateImage(float $brightness, float $saturation, float $hue): bool

Три аргумента задаются процентами: brightness, saturation, hue. Нейтрально 100,100,100. В используемой сборке на RGB-изображении без отдельного modulate:colorspace действует преобразование HSL; можно явно выбирать и другой режим, и тогда смысл/вид результата меняется. Brightness здесь не равен brightnessContrastImage с таким же числом.

АргументЗначение и единицы
$brightnessfloat,100 оставляет исходную светлоту,120 повышает её в этом примере, значение ниже 100 уменьшает. Это процентный коэффициент, а не прибавка 20 к каждому RGB-байту.
$saturationfloat,100 сохраняет насыщенность,0 удаляет цветность в выбранной модели,65 уменьшает её. Уменьшение saturation не является универсальным цветоуправляемым переводом любой фотографии в чёрно-белый профиль.
$huefloat,100 не поворачивает оттенок;50 примерно−90°,150 примерно+90°,0 и 200 поворачивают на 180°. Это смещение относительно текущего положения, не градусы и не «оставить исходный hue=0».

Возвращаемое значение, версии и отказ

Возвращается bool: true при успехе. Это не новая картинка — изменяются пиксели текущего объекта Imagick. Присваивание $result = $image->modulateImage(...) сохранит флаг, а не изображение; независимую картинку заранее создаёт clone. Доступность по официальному мануалу: PECL imagick 2, PECL imagick 3.

В проверенной обвязке Imagick 3.8.1 сначала требуется непустое изображение; native-отказ преобразуется в ImagickException. У метода и последующей записи файла отдельные точки отказа. Числовые ограничения интерфейса приложения выбирают и проверяют явно; не нужно приписывать PHP API несуществующий универсальный валидатор любого float. Все показанные настройки умеренные и применены к одному RGB PNG; это не исследование всех цветов, профилей и кадров анимации.

Первый управляемый результат

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

require __DIR__ . '/tone-fixture.php';
$source = loadToneSource();
$image = clone $source;
if (!$image->modulateImage(120, 100, 100)) {
    throw new RuntimeException('Не удалось применить modulateImage');
}
saveToneComparison([$source, $image], 'modulate-brightness.png');
$source->clear();
$image->clear();

Результат: Справа brightness 120 при saturation 100 и hue 100: средний серый 128 стал 153, чёрный образец остался 0. Это другой способ осветления, чем прибавка brightnessContrastImage: одинаковые числа не означают одинаковый результат. Архив примера содержит example.php, tone-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; полученный PNG откройте обычным просмотрщиком. Слева всегда исходник, справа обработанная копия; при трёх панелях порядок указан в описании. Названия/стрелки на поясняющих иллюстрациях не рисуются PHP-программой. Файл имеет 800×280 пикселей, без изменения геометрии предметов.

Ожидаемый вывод
modulate-brightness.png

Практическая задача: Сделать менее насыщенный цветовой вариант рисунка

Вариант учебной иллюстрации нужен в другой палитре: оставляем brightness 100, уменьшаем saturation до 65 и сдвигаем hue до 150. Для товарной фотографии такое изменение цвета может исказить представление о товаре.

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

require __DIR__ . '/tone-fixture.php';
$source = loadToneSource();
$image = clone $source;
if (!$image->modulateImage(100, 65, 150)) {
    throw new RuntimeException('Не удалось применить modulateImage');
}
saveToneComparison([$source, $image], 'muted-hue-variant.png');
$source->clear();
$image->clear();

Результат: Справа цвета коробки и кружки изменены и менее насыщенны, нейтральные серые образцы остались серыми с исходными значениями. Hue 150 означает сдвиг примерно+90°, а не 150°. Результат не обещает совпадение с CSS hue-rotate. Архив примера содержит example.php, tone-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; полученный PNG откройте обычным просмотрщиком. Слева всегда исходник, справа обработанная копия; при трёх панелях порядок указан в описании. Названия/стрелки на поясняющих иллюстрациях не рисуются PHP-программой. Файл имеет 800×280 пикселей, без изменения геометрии предметов.

Ожидаемый вывод
muted-hue-variant.png

Ошибки, ограничения и альтернативы

Частая ошибка — передать 0 для параметров, которые не хочется менять. Для нового brightness достаточно(120,100,100). Совпадение названий с CSS-фильтром не гарантирует одинаковую модель цвета. Метод не имеет отдельного channel-аргумента: не придумывайте четвёртый параметр. Для ярких областей возможны насыщение и потеря различий; цветовой вариант не следует выдавать за достоверную окраску реального товара.

Для своего обработчика заранее ограничьте размеры изображения, допустимые форматы, параметры и количество проходов. Native-память нужна для исходника, копий и результата; стоимость растёт с количеством пикселей и повторов. Четыре метода работают с текущим изображением объекта; анимированный/многостраничный вход требует явного решения по кадрам. Ни один эффект не делает все фотографии автоматически правильными.

Сравнить инструменты: brightnessContrastImage · gammaImage · contrastImage. Дальше: добавить собственные фигуры, обработка отказа.

Imagick::gammaImageТёмные и средние тона хочется изменить иначе, чем одинаковой прибавкой всем пикселям, не сдвигая идеальные чёрный и белый.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::gammaImage(float $gamma, int $channel = Imagick::CHANNEL_DEFAULT): bool

Тёмные и средние тона хочется изменить иначе, чем одинаковой прибавкой всем пикселям, не сдвигая идеальные чёрный и белый.

Реальная обработка одного исходника: Imagick::gammaImage
Реальная обработка одного исходника: Imagick::gammaImage

Сигнатура и параметры

Imagick::gammaImage(float $gamma, int $channel = Imagick::CHANNEL_DEFAULT): bool

Gamma корректирует выбранные каналы нелинейно. При gamma 1 изменений нет; в этой операции gamma больше 1 поднимает средние значения, от 0 до 1 снижает. В официальном описании типичные значения 0.8..2.3, это ориентир, не обязательная проверка PHP-типа. Для нормализованного неотрицательного канала поведение связано со степенью 1/gamma; реальный PNG имеет конечную точность и зависит от цветового режима.

АргументЗначение и единицы
$gammafloat, величина гамма-коррекции. В примерах 1.6 для подъёма средних тонов и 0.7 для снижения красного. В своём интерфейсе можно требовать конечное gamma>0 как понятную политику; не утверждайте, что native-метод обязательно бросает исключение при любом 0 или значении вне 0.8..2.3.
$channelнеобязательный int, Imagick::CHANNEL_DEFAULT. Явный Imagick::CHANNEL_RED выбирает только красный канал. Несколько подходящих channel-констант можно объединять |; выбор зависит от режима изображения.

Возвращаемое значение, версии и отказ

Возвращается bool: true при успехе. Это не новая картинка — изменяются пиксели текущего объекта Imagick. Присваивание $result = $image->gammaImage(...) сохранит флаг, а не изображение; независимую картинку заранее создаёт clone. Доступность по официальному мануалу: PECL imagick 2, PECL imagick 3.

В проверенной обвязке Imagick 3.8.1 сначала требуется непустое изображение; native-отказ преобразуется в ImagickException. У метода и последующей записи файла отдельные точки отказа. Числовые ограничения интерфейса приложения выбирают и проверяют явно; не нужно приписывать PHP API несуществующий универсальный валидатор любого float. Все показанные настройки умеренные и применены к одному RGB PNG; это не исследование всех цветов, профилей и кадров анимации.

Первый управляемый результат

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

require __DIR__ . '/tone-fixture.php';
$source = loadToneSource();
$image = clone $source;
if (!$image->gammaImage(1.6)) {
    throw new RuntimeException('Не удалось применить gammaImage');
}
saveToneComparison([$source, $image], 'gamma-midtones.png');
$source->clear();
$image->clear();

Результат: Справа gamma 1.6: серые 64/128/192 стали 107/165/213; чёрный 0 и белый 255 сохранились. Изменение нелинейное: разные исходные тона изменились на разное число единиц. Архив примера содержит example.php, tone-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; полученный PNG откройте обычным просмотрщиком. Слева всегда исходник, справа обработанная копия; при трёх панелях порядок указан в описании. Названия/стрелки на поясняющих иллюстрациях не рисуются PHP-программой. Файл имеет 800×280 пикселей, без изменения геометрии предметов.

Ожидаемый вывод
gamma-midtones.png

Практическая задача: Ослабить средние значения только красного канала

Для цветового варианта требуется изменить нелинейно только красную составляющую. Используем положительную gamma 0.7 и явный канал; зелёный и синий не затрагиваем.

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

require __DIR__ . '/tone-fixture.php';
$source = loadToneSource();
$image = clone $source;
if (!$image->gammaImage(0.7, Imagick::CHANNEL_RED)) {
    throw new RuntimeException('Не удалось применить gammaImage');
}
saveToneComparison([$source, $image], 'red-channel-gamma.png');
$source->clear();
$image->clear();

Результат: Справа серый 128 стал RGB (95,128,128),64 —RGB (35,64,64),192 —RGB (170,192,192). Чёрный/белый края красного канала сохранились, G/B во всём изображении остались исходными. Архив примера содержит example.php, tone-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; полученный PNG откройте обычным просмотрщиком. Слева всегда исходник, справа обработанная копия; при трёх панелях порядок указан в описании. Названия/стрелки на поясняющих иллюстрациях не рисуются PHP-программой. Файл имеет 800×280 пикселей, без изменения геометрии предметов.

Ожидаемый вывод
red-channel-gamma.png

Ошибки, ограничения и альтернативы

GammaImage действительно меняет пиксели; setImageGamma задаёт gamma-метаданные и не выполняет ту же переработку RGB. Просмотрщик может интерпретировать метаданные/профиль иначе, поэтому одинаковый вид на всех мониторах не гарантируется одной gamma. Значения другого редактора иногда имеют обратную шкалу. Изменение одного канала окрашивает серые области и не заменяет измеренный баланс белого.

Для своего обработчика заранее ограничьте размеры изображения, допустимые форматы, параметры и количество проходов. Native-память нужна для исходника, копий и результата; стоимость растёт с количеством пикселей и повторов. Четыре метода работают с текущим изображением объекта; анимированный/многостраничный вход требует явного решения по кадрам. Ни один эффект не делает все фотографии автоматически правильными.

Сравнить инструменты: brightnessContrastImage · modulateImage · contrastImage. Дальше: добавить собственные фигуры, обработка отказа.

Imagick::contrastImageНужен простой шаг усиления или смягчения контраста без численной настройки величины.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::contrastImage(bool $sharpen): bool

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

Реальная обработка одного исходника: Imagick::contrastImage
Реальная обработка одного исходника: Imagick::contrastImage

Сигнатура и параметры

Imagick::contrastImage(bool $sharpen): bool

Аргумент sharpen имеет тип bool: true усиливает различие светлых и тёмных элементов, false уменьшает. Несмотря на имя параметра, это тональная операция, не фильтр повышения геометрической резкости. Величину шага здесь не передают: число 25 не является «контрастом 25 процентов» этого метода.

АргументЗначение и единицы
$sharpenbool, true — усилить контраст, false — уменьшить. Для понятного strict_types-кода передавайте именно true/false. Повторный вызов снова обрабатывает уже изменённые пиксели; это не переключатель, запоминающий исходную картинку.

Возвращаемое значение, версии и отказ

Возвращается bool: true при успехе. Это не новая картинка — изменяются пиксели текущего объекта Imagick. Присваивание $result = $image->contrastImage(...) сохранит флаг, а не изображение; независимую картинку заранее создаёт clone. Доступность по официальному мануалу: PECL imagick 2, PECL imagick 3.

В проверенной обвязке Imagick 3.8.1 сначала требуется непустое изображение; native-отказ преобразуется в ImagickException. У метода и последующей записи файла отдельные точки отказа. Числовые ограничения интерфейса приложения выбирают и проверяют явно; не нужно приписывать PHP API несуществующий универсальный валидатор любого float. Все показанные настройки умеренные и применены к одному RGB PNG; это не исследование всех цветов, профилей и кадров анимации.

Первый управляемый результат

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

require __DIR__ . '/tone-fixture.php';
$source = loadToneSource();
$image = clone $source;
if (!$image->contrastImage(true)) {
    throw new RuntimeException('Не удалось применить contrastImage');
}
saveToneComparison([$source, $image], 'contrast-direction.png');
$source->clear();
$image->clear();

Результат: Справа contrastImage(true): серый 64 стал 50,192 — 205, средний 128 почти не сместился. Никакой геометрической резкости или нового контура метод не создаёт: sharpen здесь имя флага направления контраста. Архив примера содержит example.php, tone-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; полученный PNG откройте обычным просмотрщиком. Слева всегда исходник, справа обработанная копия; при трёх панелях порядок указан в описании. Названия/стрелки на поясняющих иллюстрациях не рисуются PHP-программой. Файл имеет 800×280 пикселей, без изменения геометрии предметов.

Ожидаемый вывод
contrast-direction.png

Практическая задача: Смягчить контраст и увидеть накопление повторного вызова

Резко выделенные тёмные и светлые элементы хочется смягчить. Сравним исходник, один false и второй false поверх уже изменённой копии. Для сравнения разных настроек обычно клонируют исходник заново; здесь накопление сделано намеренно.

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

require __DIR__ . '/tone-fixture.php';
$source = loadToneSource();
$image = clone $source;
if (!$image->contrastImage(false)) {
    throw new RuntimeException('Не удалось применить contrastImage');
}
$twice = clone $image;
if (!$twice->contrastImage(false)) {
    throw new RuntimeException('Не удалось применить contrastImage');
}
saveToneComparison([$source, $image, $twice], 'soften-once-twice.png');
$source->clear();
$image->clear();
$twice->clear();

Результат: Три панели слева направо: исходник, одно снижение контраста, два последовательных снижения. После первого серый 64 стал 77,192 — 178; после второго значения приблизились к середине ещё сильнее. false не отменяет предыдущее true и не восстанавливает потерянные при обрезании детали. Архив примера содержит example.php, tone-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; полученный PNG откройте обычным просмотрщиком. Слева всегда исходник, справа обработанная копия; при трёх панелях порядок указан в описании. Названия/стрелки на поясняющих иллюстрациях не рисуются PHP-программой. Файл имеет 1200×280 пикселей, без изменения геометрии предметов.

Ожидаемый вывод
soften-once-twice.png

Ошибки, ограничения и альтернативы

False не нейтральный режим и не команда «отменить». Повторы накапливают эффект и могут ухудшить градации. Для численного уровня и отдельной яркости удобнее brightnessContrastImage. Для резкости контуров существует другой набор операций; не объясняйте contrastImage как sharpenImage. Сохраняйте исходник для новой попытки.

Для своего обработчика заранее ограничьте размеры изображения, допустимые форматы, параметры и количество проходов. Native-память нужна для исходника, копий и результата; стоимость растёт с количеством пикселей и повторов. Четыре метода работают с текущим изображением объекта; анимированный/многостраничный вход требует явного решения по кадрам. Ни один эффект не делает все фотографии автоматически правильными.

Сравнить инструменты: brightnessContrastImage · modulateImage · gammaImage. Дальше: добавить собственные фигуры, обработка отказа.

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

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

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

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

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