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

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


Главная операция короткая: $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: не переносить числа по названию

Два похожих названия используют разные нейтральные числа. Проверим это до настройки эффекта: создадим обе копии из $source, применим 0,0 к первой и 100,100,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(float $brightness, float $contrast, int $channel = Imagick::CHANNEL_DEFAULT): boolМетод меняет текущие пиксели изображения: brightness и contrast преобразуются в наклон и смещение тональной функции. Нейтральная пара 0,0. Положительные значения увеличивают соответствующее действие, отрицательные уменьшают. Это не установка абсолютной «яркости файла».
| Аргумент | Значение и единицы |
|---|---|
| $brightness | float, процент изменения по шкале native-операции−100..100;0 нейтрально. В первом примере 15. Слишком сильное осветление сводит разные светлые значения к 255. |
| $contrast | float, процент изменения−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
Для условной обложки нужен цветовой вариант, при этом зелёный и синий каналы должны сохраниться. Это демонстрация выбора канала, не рецепт автоматического баланса белого фотографии.
<?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Нужно осветлить иллюстрацию или изменить её насыщенность и оттенок, понимая, какие два параметра оставить в покое.

Сигнатура и параметры
Imagick::modulateImage(float $brightness, float $saturation, float $hue): boolТри аргумента задаются процентами: brightness, saturation, hue. Нейтрально 100,100,100. В используемой сборке на RGB-изображении без отдельного modulate:colorspace действует преобразование HSL; можно явно выбирать и другой режим, и тогда смысл/вид результата меняется. Brightness здесь не равен brightnessContrastImage с таким же числом.
| Аргумент | Значение и единицы |
|---|---|
| $brightness | float,100 оставляет исходную светлоту,120 повышает её в этом примере, значение ниже 100 уменьшает. Это процентный коэффициент, а не прибавка 20 к каждому RGB-байту. |
| $saturation | float,100 сохраняет насыщенность,0 удаляет цветность в выбранной модели,65 уменьшает её. Уменьшение saturation не является универсальным цветоуправляемым переводом любой фотографии в чёрно-белый профиль. |
| $hue | float,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; это не исследование всех цветов, профилей и кадров анимации.
Первый управляемый результат
<?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(float $gamma, int $channel = Imagick::CHANNEL_DEFAULT): boolGamma корректирует выбранные каналы нелинейно. При gamma 1 изменений нет; в этой операции gamma больше 1 поднимает средние значения, от 0 до 1 снижает. В официальном описании типичные значения 0.8..2.3, это ориентир, не обязательная проверка PHP-типа. Для нормализованного неотрицательного канала поведение связано со степенью 1/gamma; реальный PNG имеет конечную точность и зависит от цветового режима.
| Аргумент | Значение и единицы |
|---|---|
| $gamma | float, величина гамма-коррекции. В примерах 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(bool $sharpen): boolАргумент sharpen имеет тип bool: true усиливает различие светлых и тёмных элементов, false уменьшает. Несмотря на имя параметра, это тональная операция, не фильтр повышения геометрической резкости. Величину шага здесь не передают: число 25 не является «контрастом 25 процентов» этого метода.
| Аргумент | Значение и единицы |
|---|---|
| $sharpen | bool, 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. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


