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

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

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

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

Глава 356 · После растяжения диапазона

Imagick: уровни, гистограмма и тоновая S-кривая

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

Сделать тусклый каталог читаемым

Поставщик прислал тусклый каталог: тёмный фон стал серым, светлые участки тоже серые, маркировка сливается с коробкой. Нужна читаемая скачиваемая карточка, которую можно вставить в памятку. Начнём с известного дефекта диапазона, затем сравним автоматическую гистограмму и более мягкую тоновую кривую.

Печатные подписи на рисунке унаследованы от первоначального каталога и не пересчитываются при изменении пикселей. Подпись «Серый: 0..255» описывала старую шкалу; в этом новом входе фактический диапазон 64..192, есть повторяющиеся уровни. Контрольные значения теперь 64/96/128/160/192; актуальные числа после операций приведены в сравнительной схеме.

Учебный каталог 400×320: собственный рисунок с искусственно сжатым диапазоном каждой RGB-компоненты 64..192. Надпись PNG8 на старом рисунке означает здесь 8 бит на компоненту RGB, color-type 2, а не индексированный PNG.
Учебный каталог 400×320: собственный рисунок с искусственно сжатым диапазоном каждой RGB-компоненты 64..192. Надпись PNG8 на старом рисунке означает здесь 8 бит на компоненту RGB, color-type 2, а не индексированный PNG.
Полезный результат: тот же полный каталог с расширенным диапазоном, без изменения геометрии
Полезный результат: тот же полный каталог с расширенным диапазоном, без изменения геометрии

Вход подготовлен заранее: старое значение c заменено на ближайшее целое 64+128×c/255. Это контролируемая учебная имитация тусклого изображения, не фотография с измеренной экспозицией. При таком 8-битном сохранении часть оттенков уже склеилась. Коррекция поднимет контраст, но не восстановит точные цвета старого рисунка или потерянные детали.

ОбозначениеСмысл до схемы
RGB, c и c′RGB — красная, зелёная и синяя компоненты. c — одно входное значение, c′ — его результат. Серый имеет равные R/G/B; интенсивность — численная яркость, вычисленная из компонент.
Q, B и WQ — QuantumRange, внутренний максимум. В проверенной Q16-сборке Q=65535. B/W — входные чёрная/белая границы, в единицах Q. Здесь B=16448 и W=49344; выходной файл имеет 8 бит на компоненту, 0..255.
gamma, alpha, betaGamma — безразмерная степень управления средними тонами; используется показатель 1/gamma. У sigmoid alpha — безразмерная сила контраста, не прозрачность; beta — входная середина в Q, здесь 0.5×Q=32767.5.
Гистограмма и CDFГистограмма считает пиксели каждого уровня. CDF накапливает их число от тёмных уровней к светлым. В условной серой модели одна шкала, у цветного изображения поведение зависит от каналов и настроек библиотеки.

В математической схеме x — нормированное значение 0..1; a — сила контраста alpha, b = beta/Q. Clamp ограничивает значение допустимыми границами. Знак ^ означает степень в формуле рисунка; в PHP этот знак означает другую операцию, поэтому формулу не копируют как PHP-код. В CDF(t) буква t обозначает рассматриваемый уровень. Нормирование означает перевод значения в шкалу 0..1.

Три разных механизма: заданные B/W и gamma; накопление CDF; нормированная S-кривая. Схема не обещает восстановления утраченных оттенков.
Три разных механизма: заданные B/W и gamma; накопление CDF; нормированная S-кривая. Схема не обещает восстановления утраченных оттенков.

Перед первым полным кодом достаточно одного действия. В $image уже есть изображение; $Q — внутренний максимум. Деление / и умножение * переводят известные 64 и 192 из шкалы 0..255 в Q. Присваивание = сохраняет число; десятичная точка в 1.0 записывает float.

$black = 64 / 255 * $Q;
$white = 192 / 255 * $Q;
$image->levelImage($black, 1.0, $white);

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

В $image уже загружена независимая копия изображения. $ начинает имя переменной; -> вызывает метод; круглые скобки содержат аргументы, запятые их разделяют, ; завершает команду. Известные входные границы B и W становятся выходными 0 и Q. Между ними gamma меняет средние тона; значения за границами ограничиваются. Это заданная тоновая кривая, а не поиск предметов или восстановление потерянного цвета.

Сначала получаем Q, максимум внутренней компоненты. Imagick::getQuantumRange() — статический метод класса; $range["quantumRangeLong"] читает элемент возвращённого массива по строковому ключу. В проверенной Q16-сборке Q равен 65535, но код получает его динамически. / и * выполняют деление и умножение, = сохраняет значение.

$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$black = 64 / 255 * $Q;
$white = 192 / 255 * $Q;
$image->levelImage($black, 1.0, $white);

Результат вызова — bool true, а изменённые пиксели остаются в $image. Не присваивайте этот bool вместо изображения. $image = clone $source создаёт отдельную копию; обычное присваивание объекта только даёт ему ещё одно имя. Проверка if с ! означает «если не выполнено»; throw new RuntimeException прекращает отказавшую цепочку. Подготовка: переменная и значение, объект и метод, clone, исключения.

Полная программа начинает с <?php и declare(strict_types=1): PHP и строгая передача типов. Require подключает levels-fixture.php из __DIR__, папки программы. LoadLevelsSource проверяет Base64/SHA256 и возвращает точный источник. Imagick::getQuantumRange() вызывает статический метод класса; :: здесь связывает класс и метод. Он возвращает массив, а $range["quantumRangeLong"] читает значение по строковому ключу. Не переносите Q=65535 на любую сборку — код получает Q у своей библиотеки. SaveLevelsComparison сохраняет целые панели и печатает имя файла; детали помощника даны сразу после результата.

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

require __DIR__ . '/levels-fixture.php';
$source = loadLevelsSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$black = 64 / 255 * $Q;
$white = 192 / 255 * $Q;
$image = clone $source;
if (!$image->levelImage($black, 1.0, $white)) {
    throw new RuntimeException('Не выполнен levelImage');
}
saveLevelsComparison([$source, $image], 'levels-first.png');
$source->clear();
$image->clear();

Результат: Слева учебный каталог с диапазоном 64..192, справа весь каталог после levelImage: чёрная и белая границы расширены. Самостоятельный PNG можно открыть или вставить в памятку. Для запуска распакуйте example.php, levels-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без сети и шрифтов. Откройте levels-first.png просмотрщиком. Stdout — это имя файла и перевод строки. Сравнение 800×320 содержит целые панели 400×320 слева направо; размеры не изменяются.

Ожидаемый вывод
levels-first.png
Полный переносимый levels-fixture.php из каждого ZIP
<?php
declare(strict_types=1);

function loadLevelsSource(): 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) !== '7069bf7052b5982f60a98bbe72b0d8aa7224f2348f2be2606cc7634593d2805b') {
        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 saveLevelsComparison(array $panels, string $filename): void
{
    if ($panels === []) {
        throw new InvalidArgumentException('Нужна хотя бы одна панель');
    }
    $width = 0;
    $height = 0;
    foreach ($panels as $panel) {
        if (!$panel instanceof Imagick) {
            throw new InvalidArgumentException('Панель должна быть объектом Imagick');
        }
        $width += $panel->getImageWidth();
        $height = max($height, $panel->getImageHeight());
    }
    $output = new Imagick();
    $output->newImage($width, $height, 'white');
    $output->setImageFormat('png');
    $left = 0;
    foreach ($panels as $panel) {
        $top = intdiv($height - $panel->getImageHeight(), 2);
        if (!$output->compositeImage($panel, Imagick::COMPOSITE_OVER, $left, $top)) {
            throw new RuntimeException('Не удалось собрать полное сравнение');
        }
        $left += $panel->getImageWidth();
    }
    $output->setImageDepth(8);
    $output->setOption('png:color-type', '2');
    if (!$output->writeImage(__DIR__ . '/' . $filename)) {
        throw new RuntimeException('Не удалось записать результат');
    }
    $output->clear();
    echo $filename, "\n";
}

Function объявляет функцию, return возвращает результат; : Imagick задаёт тип изображения, void означает отсутствие возвращаемого значения. Массив $panels хранит панели, foreach перебирает их. File_get_contents читает текст, base64_decode восстанавливает байты, hash проверяет SHA256, file_put_contents пишет PNG. New Imagick создаёт объект, newImage — полотно, compositeImage размещает целые непрозрачные панели. Помощник не скачивает ничего и не ищет шрифты. Объяснения: функции, массивы, foreach, композиция изображений.

Различить заданную кривую и зависимость от гистограммы

У level B становится 0, W становится Q, а середина зависит от gamma. При gamma 1 это растяжение; gamma 2 делает середину светлее, потому что берётся квадратный корень нормированного значения. В маленькой проверке входной серый 128 дал около 32768 при gamma 1 и 46340 при gamma 2 во внутренней Q-шкале. Округление при сохранении файла отличается от математической дроби.

Equalize не знает наших B/W: она изучает текущую область. Накопленная частота задаёт кривую, поэтому большой фон влияет и на маленькие буквы. S-кривая вместо частот задаёт форму средних тонов: true усиливает, false смягчает. При alpha 0 проверенная операция не меняет пиксели; beta 0.25×Q и 0.5×Q дают разные кривые. Это не размытие и не пространственное повышение резкости.

До следующей полной программы все три маленьких вызова: $image, $equalized и $sigmoid — отдельные clone исходника; true — логическое значение; 5.0 — сила контраста, 0.5×Q — входная середина. У equalize пустые скобки, потому что аргументов нет.

$image->levelImage($black, 1.0, $white);
$equalized->equalizeImage();
$sigmoid->sigmoidalContrastImage(true, 5.0, 0.5 * $Q);
Сравнить известные уровни, гистограмму и S-кривуюПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/levels-fixture.php';
$source = loadLevelsSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$black = 64 / 255 * $Q;
$white = 192 / 255 * $Q;
$image = clone $source;
if (!$image->levelImage($black, 1.0, $white)) {
    throw new RuntimeException('Не выполнен levelImage');
}
$equalized = clone $source;
if (!$equalized->equalizeImage()) {
    throw new RuntimeException('Не выполнен equalizeImage');
}
$sigmoid = clone $source;
if (!$sigmoid->sigmoidalContrastImage(true, 5.0, 0.5 * $Q)) {
    throw new RuntimeException('Не выполнен sigmoidalContrastImage');
}
saveLevelsComparison([$source, $image, $equalized, $sigmoid], 'levels-controls.png');
$source->clear();
$image->clear();
$equalized->clear();
$sigmoid->clear();

Результат: Исходник; level с известными границами; equalize по распределению всего кадра; умеренная S-кривая. Это разные правила, поэтому вид и цвет могут различаться. Для запуска распакуйте example.php, levels-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без сети и шрифтов. Откройте levels-controls.png просмотрщиком. Stdout — это имя файла и перевод строки. Сравнение 1600×320 содержит целые панели 400×320 слева направо; размеры не изменяются.

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

Задать границы и сохранить служебные области

Если границы известны из подготовки файла, задаём их явно: это воспроизводимая коррекция партии с одинаковым дефектом. Если они неизвестны, нельзя автоматически считать 64/192 правильными. Для произвольных фотографий сначала изучают диапазон и возможные выбросы; автоматическое растяжение и отсечение хвостов решает другую часть задачи.

Известные B/W расширяют полный диапазон; гамма управляет серединой, не возвращая потерянные уровни
Известные B/W расширяют полный диапазон; гамма управляет серединой, не возвращая потерянные уровни

В скачиваемом макете заголовок и SKU могут уже соответствовать согласованному оформлению. Во второй практике изменяем только иллюстрацию x24/y88/352×132 и дополнительно ставим gamma 1.2, чтобы открыть средние тона.

Локальная коррекция иллюстрации: заголовок, SKU и нижняя шкала сохраняют исходные значения пикселей
Локальная коррекция иллюстрации: заголовок, SKU и нижняя шкала сохраняют исходные значения пикселей

CropImage(352,132,24,88) принимает ширину, высоту, x, y; координаты идут вправо и вниз от нуля. SetImagePage(0,0,0,0) сбрасывает виртуальную позицию вырезки. После обработки compositeImage возвращает её OVER в (24,88). :: в Imagick::COMPOSITE_OVER обращается к именованной константе класса. ROI — заранее выбранный прямоугольник макета, не автоматическое распознавание товара. Полные две программы: уровни всего каталога и защищённая карточка.

Проверить контраст ярлыка, не перекрашивая весь макет

Автоматическая equalize полезна для просмотра тусклого скана, но цвет товара может измениться. Начинаем с полного каталога как диагностического варианта; затем делаем отдельный серый ярлык. Для скана важен разбор штрихов, а точная исходная цветность этой области уже не требуется. В нашем сохранённом результате локальная equalize усилила и зерно: более широкий диапазон сам по себе не доказывает улучшение чтения букв.

Цветной кадр и отдельный серый ярлык — разные области гистограммы. Усиление шума видно в результате; графики R сохранённого файла не являются внутренней intensity-CDF.
Цветной кадр и отдельный серый ярлык — разные области гистограммы. Усиление шума видно в результате; графики R сохранённого файла не являются внутренней intensity-CDF.

TransformImageColorspace(Imagick::COLORSPACE_GRAY) явно подготавливает серый вход; это не параметр equalize. Вырезка 156×50 в (72,140) сохраняется до и после, затем возвращается на место. Даже если исходные буквы уже нейтральны, область гистограммы всё равно меняется. Не приписываем весь выигрыш одному переводу в GRAY. Полные программы: equalize всего кадра и ярлыка.

На сохранённом ярлыке диапазон R вырос с 82..160 до 0..255, но стандартное отклонение R выросло примерно с 13.10 до 74.54: усилились и штрихи, и зерно. Здесь локальный результат — диагностический вариант для сравнения, не обещание улучшить OCR. Для рабочего скана нужно решить задачу шума и оценить буквы; автоматически принимать более контрастный вариант нельзя.

Распределение не обязано стать ровным: разные дискретные уровни могут склеиваться. На сплошном сером поле нет деталей для улучшения; наша проверка дала белое из 128, а чёрный 0 остался чёрным. Практический контроль: если рабочий диапазон min==max, обработку для повышения читаемости пропускают и сохраняют исходник. Это рекомендация для внешнего приложения, не дополнительный guard фиксированного учебного файла.

Подчеркнуть середину и смягчить сильный preview

Когда нужно подчеркнуть средние тона без выбора точных B/W, используем умеренную S-кривую. Во второй практике макетчик получил слишком жёсткую иллюстрацию: создаём такой preview открыто в коде, затем смягчаем его отдельной inverse-кривой. Это полезный этап согласования, а не доказательство обратимости обработки.

Умеренный контраст; сильный preview иллюстрации; его смягчённый вариант, с сохранённой маркировкой вне ROI
Умеренный контраст; сильный preview иллюстрации; его смягчённый вариант, с сохранённой маркировкой вне ROI

В full workflow сначала level расширяет диапазон вырезки, затем true/10/0.5×Q делает контраст сильным. Clone сохраняет эту стадию; false/4/0.5×Q смягчает другую копию. Конечные 0 и Q могут остаться прежними, поэтому оцениваем средние тона и реальные детали, а не только min/max. Два отдельных PNG 352×132 пригодны для сравнения до вставки в каталог. Программы: увеличить и уменьшить тоновый контраст.

Сила 4 не является математическим «отменить 10», а уже потерянные оттенки не возникают обратно. Для реального файла сохраняйте исходник или рабочую копию до обработки. Значение alpha здесь не управляет прозрачностью; если нужна прозрачная маска, используйте отдельные операции alpha и композиции.

Проверить детали, цвет, прозрачность и отказ

СитуацияПрактическая проверка
Чёрный/белый результат вместо уровнейНе путайте 0..255 с Q. Получите QuantumRange и переведите оба порога симметрично. Проверьте порядок black, gamma, white.
Цвет товара изменилсяСравните оригинал и результат. Даже общая нелинейная кривая RGB может менять оттенок; equalize не приводит серию к эталонному цвету.
На фоне стало больше зернаРасширение различий усиливает и шум. Сначала решите задачу шума или примените умеренную/локальную коррекцию; автоматическое улучшение не гарантируется.
Плоское поле стало белымУ equalize это фактический результат нашего среднего серого. Если min==max, полезной новой детали не появится.
Прозрачность измениласьОсновной вход непрозрачен. В малой RGBA-пробе все три default-вызова меняли alpha. Level/sigmoid с RED сохранили G/B/alpha только в этой пробе; у equalize channel нет.
True получено, файл не появилсяBool метода относится к обработке текущего объекта. Отдельно проверьте запись, права папки, имя и реальный PNG; помощник прерывается при неудачной записи.

Фиксированные программы работают с известным непрозрачным учебным PNG. Это не готовая система безопасной загрузки: для чужих данных нужны ограничения размеров/кадров/памяти и отдельная валидация параметров. Отказ чтения, Base64 или записи прекращает программу исключением. Обработка не измеряет OCR-качество, цветопробу печати, скорость или уменьшение файла. Затраты включают площадь, гистограммы и копии; общих обещаний производительности здесь нет.

Сжатый в 8 бит исходный диапазон необратимо склеил некоторые оттенки. Увеличение глубины хранения позже не восстанавливает их. Во всех примерах сохраняется RGB PNG с 8 битами на компоненту, color-type 2; это не выбор индексированной палитры. Для ограничения цветов есть quantize, remap и таблицы, для шума — фильтры окрестности.

Выбрать коррекцию и проверить своё решение

Известные границы → level; распределение скана → equalize; управление средними тонами → sigmoid
Известные границы → level; распределение скана → equalize; управление средними тонами → sigmoid

Упражнение: оставить весь SKU точным и сделать только иллюстрацию темнее в средних тонах при тех же B/W. Решение: в ROI-программе level поменять gamma 1.2 на 0.8; координаты вырезки и обратного наложения оставить прежними. Сначала сохраните отдельный результат, сравните средние тона и проверьте пиксели за пределами (24,88,352,132). Это новая версия программы, её нужно выполнить заново; сохранённые здесь свидетельства относятся к исходным восьми определениям.

Для другой задачи выбирайте соседний инструмент: поиск диапазона и контролируемые хвосты, gamma, яркость и контраст, локальные статистики и скан, самостоятельное оформление PNG. Сначала решите, что важно сохранить: цвет товара, отдельный ярлык или служебную маркировку.

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

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

Imagick::levelImageИзвестные входные границы B и W становятся выходными 0 и Q. Между ними gamma меняет средние тона; значения за границами ограничиваются. Это заданная тоновая кривая, а не поиск предметов или восстановление потерянного цвета.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::levelImage(float $blackPoint, float $gamma, float $whitePoint, int $channel = Imagick::CHANNEL_DEFAULT): bool

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

В $image уже загружена независимая копия изображения. $ начинает имя переменной; -> вызывает метод; круглые скобки содержат аргументы, запятые их разделяют, ; завершает команду. Известные входные границы B и W становятся выходными 0 и Q. Между ними gamma меняет средние тона; значения за границами ограничиваются. Это заданная тоновая кривая, а не поиск предметов или восстановление потерянного цвета.

Сначала получаем Q, максимум внутренней компоненты. Imagick::getQuantumRange() — статический метод класса; $range["quantumRangeLong"] читает элемент возвращённого массива по строковому ключу. В проверенной Q16-сборке Q равен 65535, но код получает его динамически. / и * выполняют деление и умножение, = сохраняет значение.

$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$black = 64 / 255 * $Q;
$white = 192 / 255 * $Q;
$image->levelImage($black, 1.0, $white);

Результат вызова — bool true, а изменённые пиксели остаются в $image. Не присваивайте этот bool вместо изображения. $image = clone $source создаёт отдельную копию; обычное присваивание объекта только даёт ему ещё одно имя. Проверка if с ! означает «если не выполнено»; throw new RuntimeException прекращает отказавшую цепочку. Подготовка: переменная и значение, объект и метод, clone, исключения.

Полная официальная сигнатура

Imagick::levelImage(float $blackPoint, float $gamma, float $whitePoint, int $channel = Imagick::CHANNEL_DEFAULT): bool
АргументЕдиницы и поведение
$blackPointОбязательный float, входная чёрная граница B во внутренних единицах Quantum, без автоматического умножения. Здесь 64/255×Q = 16448 при Q16.
$gammaОбязательный float без единиц. Показатель кривой равен 1/gamma; 1 — линейно, больше 1 осветляет средние тона, от 0 до 1 затемняет. Во втором сценарии 1.2.
$whitePointОбязательный float, входная белая граница W в тех же единицах Q. Здесь 192/255×Q = 49344. Это третий аргумент, после gamma.
$channelНеобязательная int-маска, по умолчанию Imagick::CHANNEL_DEFAULT. RED выбирает красную компоненту; сочетания задаются |. В нашей небольшой RGBA-пробе RED сохранил G/B/alpha, default изменил alpha. Не переносите это на произвольную цепочку обработки.

Официальная доступность: PECL imagick 2, PECL imagick 3. Все перечисленные обязательные аргументы нужны, даже если значение равно 1 или 0. Метод меняет текущий объект, возвращает bool true при успехе. Пустой Imagick и нативный отказ вызывают ImagickException; неправильные PHP-типы или число аргументов могут дать TypeError/ArgumentCountError. Пустая секция errors официального XML не означает отсутствия ошибок. Размер растра не меняется.

Точный IM7 для level/sigmoid использует временную маску каналов и восстанавливает её. Проверенная среда: PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 Q16. Во всех программах фиксированы умеренные значения; внешняя валидация не реализована. Для внешних параметров отдельно проверяют конечность, 0≤B<W≤Q, gamma>0, разумный контраст и beta в выбранном диапазоне; ограничивают площадь, число кадров и память. Не считайте такие рекомендации обещанием проверки самим API.

Полный официальный XML: описание, все параметры, returns, пример и ссылки
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.levelimage">
 <refnamediv>
  <refname>Imagick::levelImage</refname>
  <refpurpose>Adjusts the levels of an image</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::levelImage</methodname>
   <methodparam><type>float</type><parameter>blackPoint</parameter></methodparam>
   <methodparam><type>float</type><parameter>gamma</parameter></methodparam>
   <methodparam><type>float</type><parameter>whitePoint</parameter></methodparam>
   <methodparam choice="opt"><type>int</type><parameter>channel</parameter><initializer>Imagick::CHANNEL_DEFAULT</initializer></methodparam>
  </methodsynopsis>
  <para>
   Adjusts the levels of an image by scaling the colors falling
   between specified white and black points to the full
   available quantum range. The parameters provided represent
   the black, mid, and white points. The black point specifies
   the darkest color in the image. Colors darker than the black
   point are set to zero. Mid point specifies a gamma
   correction to apply to the image.  White point specifies the
   lightest color in the image. Colors brighter than the white
   point are set to the maximum quantum value.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>blackPoint</parameter></term>
     <listitem>
      <para>
      The image black point
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>gamma</parameter></term>
     <listitem>
      <para>
      The gamma value
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>whitePoint</parameter></term>
     <listitem>
      <para>
      The image white point
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>channel</parameter></term>
     <listitem>
      <para>
       Provide any channel constant that is valid for your channel mode. To
       apply to more than one channel, combine channeltype constants using
       bitwise operators. Refer to this
       list of  <link linkend="imagick.constants.channel">channel constants</link>.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>

 <refsect1 role="errors">
  &reftitle.errors;
  <para>
   &imagick.imagick.throws;
  </para>
 </refsect1>



 <refsect1 role="examples">
  &reftitle.examples;
  <para>
    <example>
      <title> <function>Imagick::levelImage</function></title>
      <programlisting role="php">
      <![CDATA[
<?php
function levelImage($blackPoint, $gamma, $whitePoint) {
    $imagick = new \Imagick();
    $imagick->newPseudoimage(500, 500, 'gradient:black-white');

    $imagick->setFormat('png');
    $quantum = $imagick->getQuantum();
    $imagick->levelImage($blackPoint / 100 , $gamma, $quantum * $whitePoint / 100);

    header("Content-Type: image/png");
    echo $imagick->getImageBlob();
}

?>
]]>
      </programlisting>
    </example>
  </para>
 </refsect1>

</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

Официальные примеры сохранены вместе с HTTP-контекстом. Наши программы записывают локальный PNG; header с MIME сам по себе файл не перекодирует, а веб-выдача здесь не проверяется. Ссылки: файлы и запись, HTTP-ответ.

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

require __DIR__ . '/levels-fixture.php';
$source = loadLevelsSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$black = 64 / 255 * $Q;
$white = 192 / 255 * $Q;
$image = clone $source;
if (!$image->levelImage($black, 1.0, $white)) {
    throw new RuntimeException('Не выполнен levelImage');
}
saveLevelsComparison([$source, $image], 'level-range.png');
$source->clear();
$image->clear();

Результат: Исходник и глобальная коррекция B=64/255×Q, gamma=1, W=192/255×Q. Контрольная серая шкала получает крайние 0 и 255; утраченные промежуточные оттенки не возвращаются. Для запуска распакуйте example.php, levels-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без сети и шрифтов. Откройте level-range.png просмотрщиком. Stdout — это имя файла и перевод строки. Сравнение 800×320 содержит целые панели 400×320 слева направо; размеры не изменяются.

Ожидаемый вывод
level-range.png
Осветлить средние тона иллюстрации и защитить SKUПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/levels-fixture.php';
$source = loadLevelsSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$black = 64 / 255 * $Q;
$white = 192 / 255 * $Q;
$image = clone $source;
$region = clone $source;
$region->cropImage(352, 132, 24, 88);
$region->setImagePage(0, 0, 0, 0);
if (!$region->levelImage($black, 1.2, $white)) {
    throw new RuntimeException('Не выполнен levelImage');
}
if (!$image->compositeImage($region, Imagick::COMPOSITE_OVER, 24, 88)) {
    throw new RuntimeException('Не выполнен compositeImage');
}
saveLevelsComparison([$source, $image], 'level-protected.png');
$source->clear();
$image->clear();
$region->clear();

Результат: Уровни и gamma=1.2 применены только к иллюстрации x24/y88/352×132. Заголовок, SKU и нижние шкалы вне прямоугольника сохраняют исходные значения пикселей. Для запуска распакуйте example.php, levels-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без сети и шрифтов. Откройте level-protected.png просмотрщиком. Stdout — это имя файла и перевод строки. Сравнение 800×320 содержит целые панели 400×320 слева направо; размеры не изменяются.

Ожидаемый вывод
level-protected.png

Связанный путь: модель трёх преобразований, ошибки, каналы и потери.

Imagick::equalizeImageСчитает гистограмму обрабатываемого изображения, накапливает числа пикселей от тёмного к светлому и по накоплению строит таблицу новых значений. Частые диапазоны могут разойтись сильнее. Одинаковое значение получает одинаковое преобразование в пределах выбранного правила, но цвет и шум могут измениться.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::equalizeImage(): bool

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

В $image уже загружена независимая копия изображения. $ начинает имя переменной; -> вызывает метод; круглые скобки содержат аргументы, запятые их разделяют, ; завершает команду. Считает гистограмму обрабатываемого изображения, накапливает числа пикселей от тёмного к светлому и по накоплению строит таблицу новых значений. Частые диапазоны могут разойтись сильнее. Одинаковое значение получает одинаковое преобразование в пределах выбранного правила, но цвет и шум могут измениться.

$image->equalizeImage();

Результат вызова — bool true, а изменённые пиксели остаются в $image. Не присваивайте этот bool вместо изображения. $image = clone $source создаёт отдельную копию; обычное присваивание объекта только даёт ему ещё одно имя. Проверка if с ! означает «если не выполнено»; throw new RuntimeException прекращает отказавшую цепочку. Подготовка: переменная и значение, объект и метод, clone, исключения.

Полная официальная сигнатура

Imagick::equalizeImage(): bool
АргументЕдиницы и поведение
Нет аргументовВызов equalizeImage() без параметров. Здесь нельзя передать channel, число процентов или готовую гистограмму. Для локального распределения сначала делаем отдельную вырезку, затем вызываем тот же метод.

Официальная доступность: PECL imagick 2, PECL imagick 3. Все перечисленные обязательные аргументы нужны, даже если значение равно 1 или 0. Метод меняет текущий объект, возвращает bool true при успехе. Пустой Imagick и нативный отказ вызывают ImagickException; неправильные PHP-типы или число аргументов могут дать TypeError/ArgumentCountError. Пустая секция errors официального XML не означает отсутствия ошибок. Размер растра не меняется.

У метода нет channel-параметра. В точном ImageMagick 7.1.1-46 при SyncChannels гистограмма может строиться по интенсивности, затем таблица применяется к компонентам. Это не гарантия сохранения оттенка и не независимая CDF каждого RGB-канала. Нижняя поправка берётся из CDF нулевого bin, а не из первого занятого уровня. В пробе сплошной серый 128 стал белым, 0 остался 0. Если рабочего диапазона нет, метод не создаст полезную деталь. Вырезка меняет и распределение, и область действия; сравнение цветного кадра с серым ярлыком — два сценария, а не тест единственного gray-флага.

Точный IM7 для level/sigmoid использует временную маску каналов и восстанавливает её. Проверенная среда: PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 Q16. Во всех программах фиксированы умеренные значения; внешняя валидация не реализована. Для внешних параметров отдельно проверяют конечность, 0≤B<W≤Q, gamma>0, разумный контраст и beta в выбранном диапазоне; ограничивают площадь, число кадров и память. Не считайте такие рекомендации обещанием проверки самим API.

Полный официальный XML: описание, все параметры, returns, пример и ссылки
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.equalizeimage">
 <refnamediv>
  <refname>Imagick::equalizeImage</refname>
  <refpurpose>Equalizes the image histogram</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::equalizeImage</methodname>
   <void/>
  </methodsynopsis>
  <para>
   Equalizes the image histogram.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  &no.function.parameters;
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>

 <refsect1 role="errors">
  &reftitle.errors;
  <para>
   &imagick.imagick.throws;
  </para>
 </refsect1>



 <refsect1 role="examples">
  &reftitle.examples;
  <para>
    <example>
      <title> <function>Imagick::equalizeImage</function></title>
      <programlisting role="php">
      <![CDATA[
<?php
function equalizeImage($imagePath) {
    $imagick = new \Imagick(realpath($imagePath));
    $imagick->equalizeImage();
    header("Content-Type: image/jpg");
    echo $imagick->getImageBlob();
}

?>
]]>
      </programlisting>
    </example>
  </para>
 </refsect1>

</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

Официальные примеры сохранены вместе с HTTP-контекстом. Наши программы записывают локальный PNG; header с MIME сам по себе файл не перекодирует, а веб-выдача здесь не проверяется. Ссылки: файлы и запись, HTTP-ответ.

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

require __DIR__ . '/levels-fixture.php';
$source = loadLevelsSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$black = 64 / 255 * $Q;
$white = 192 / 255 * $Q;
$image = clone $source;
if (!$image->equalizeImage()) {
    throw new RuntimeException('Не выполнен equalizeImage');
}
saveLevelsComparison([$source, $image], 'equalize-catalogue.png');
$source->clear();
$image->clear();

Результат: Исходник и автоматическая коррекция по гистограмме полного каталога. Результат наглядно показывает изменение распределения и цвета, а не обещает эталонный цвет товара. Для запуска распакуйте example.php, levels-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без сети и шрифтов. Откройте equalize-catalogue.png просмотрщиком. Stdout — это имя файла и перевод строки. Сравнение 800×320 содержит целые панели 400×320 слева направо; размеры не изменяются.

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

require __DIR__ . '/levels-fixture.php';
$source = loadLevelsSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$black = 64 / 255 * $Q;
$white = 192 / 255 * $Q;
$image = clone $source;
$label = clone $source;
$label->cropImage(156, 50, 72, 140);
$label->setImagePage(0, 0, 0, 0);
$label->transformImageColorspace(Imagick::COLORSPACE_GRAY);
$label->setImageFormat('png');
$label->setImageDepth(8);
$label->setOption('png:color-type', '2');
if (!$label->writeImage(__DIR__ . '/label-gray.png')) {
    throw new RuntimeException('Не записан label-gray.png');
}
if (!$label->equalizeImage()) {
    throw new RuntimeException('Не выполнен equalizeImage');
}
$label->setImageFormat('png');
$label->setImageDepth(8);
$label->setOption('png:color-type', '2');
if (!$label->writeImage(__DIR__ . '/label-equalized.png')) {
    throw new RuntimeException('Не записан label-equalized.png');
}
if (!$image->compositeImage($label, Imagick::COMPOSITE_OVER, 72, 140)) {
    throw new RuntimeException('Не выполнен compositeImage');
}
saveLevelsComparison([$source, $image], 'equalize-label.png');
$source->clear();
$image->clear();
$label->clear();

Результат: Обрабатывается только ярлык 156×50 в (72,140): подготовка GRAY, локальная equalize и возврат на место. label-gray.png и label-equalized.png сохраняют обе отдельные стадии; остальная карточка точна. На этом шумном входе усилились и буквы, и зерно — результат нужно оценить перед использованием. Для запуска распакуйте example.php, levels-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без сети и шрифтов. Откройте equalize-label.png просмотрщиком. Stdout — это имя файла и перевод строки. Сравнение 800×320 содержит целые панели 400×320 слева направо; размеры не изменяются.

Ожидаемый вывод
equalize-label.png

Связанный путь: модель трёх преобразований, ошибки, каналы и потери.

Imagick::sigmoidalContrastImageПропускает каждую выбранную компоненту через нормированную S-кривую. В режиме true средний участок становится круче; false применяет обратное тоновое преобразование для уменьшения контраста. Положение середины задаётся входным beta/Q. Это не свёртка соседей и не повышение пространственной резкости.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::sigmoidalContrastImage(bool $sharpen, float $alpha, float $beta, int $channel = Imagick::CHANNEL_DEFAULT): bool

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

В $image уже загружена независимая копия изображения. $ начинает имя переменной; -> вызывает метод; круглые скобки содержат аргументы, запятые их разделяют, ; завершает команду. Пропускает каждую выбранную компоненту через нормированную S-кривую. В режиме true средний участок становится круче; false применяет обратное тоновое преобразование для уменьшения контраста. Положение середины задаётся входным beta/Q. Это не свёртка соседей и не повышение пространственной резкости.

Сначала получаем Q, максимум внутренней компоненты. Imagick::getQuantumRange() — статический метод класса; $range["quantumRangeLong"] читает элемент возвращённого массива по строковому ключу. В проверенной Q16-сборке Q равен 65535, но код получает его динамически. / и * выполняют деление и умножение, = сохраняет значение.

$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$image->sigmoidalContrastImage(true, 5.0, 0.5 * $Q);

Результат вызова — bool true, а изменённые пиксели остаются в $image. Не присваивайте этот bool вместо изображения. $image = clone $source создаёт отдельную копию; обычное присваивание объекта только даёт ему ещё одно имя. Проверка if с ! означает «если не выполнено»; throw new RuntimeException прекращает отказавшую цепочку. Подготовка: переменная и значение, объект и метод, clone, исключения.

Полная официальная сигнатура

Imagick::sigmoidalContrastImage(bool $sharpen, float $alpha, float $beta, int $channel = Imagick::CHANNEL_DEFAULT): bool
АргументЕдиницы и поведение
$sharpenОбязательный bool: true увеличивает тоновый контраст, false уменьшает. Слово sharpen здесь не означает выделение границ соседними пикселями.
$alphaОбязательный float, сила контраста без единиц, здесь 5, 10 или 4. Это историческое имя параметра, не канал прозрачности alpha. В точном Core контраст меньше MagickEpsilon, включая 0, сразу даёт no-op.
$betaОбязательный float, входная середина кривой в Quantum-единицах, без пересчёта wrapper. Здесь 0.5×Q = 32767.5 при Q16. Это входное положение изгиба, не обещание выходного 50% серого.
$channelНеобязательная int-маска CHANNEL_DEFAULT. Выбирайте осознанно; в ограниченной RGBA-пробе default изменил alpha, а RED сохранил остальные G/B/alpha. В программах вход непрозрачен.

Официальная доступность: PECL imagick 2, PECL imagick 3. Все перечисленные обязательные аргументы нужны, даже если значение равно 1 или 0. Метод меняет текущий объект, возвращает bool true при успехе. Пустой Imagick и нативный отказ вызывают ImagickException; неправильные PHP-типы или число аргументов могут дать TypeError/ArgumentCountError. Пустая секция errors официального XML не означает отсутствия ошибок. Размер растра не меняется.

В точной реализации сначала делится beta на Q. В режиме true это нормированная логистическая кривая, в false — её обратное преобразование. При умеренных параметрах крайние 0 и Q остаются краями; описание beta «0 белый / 1 чёрный» не означает инверсию конечных точек. Уменьшение контраста после увеличения не гарантирует побайтное восстановление из-за ограничения значений и квантования. Аргумент alpha и прозрачность alpha — разные понятия.

Точный IM7 для level/sigmoid использует временную маску каналов и восстанавливает её. Проверенная среда: PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 Q16. Во всех программах фиксированы умеренные значения; внешняя валидация не реализована. Для внешних параметров отдельно проверяют конечность, 0≤B<W≤Q, gamma>0, разумный контраст и beta в выбранном диапазоне; ограничивают площадь, число кадров и память. Не считайте такие рекомендации обещанием проверки самим API.

Полный официальный XML: описание, все параметры, returns, пример и ссылки
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xml:id="imagick.sigmoidalcontrastimage" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
 <refnamediv>
  <refname>Imagick::sigmoidalContrastImage</refname>
  <refpurpose>Adjusts the contrast of an image</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::sigmoidalContrastImage</methodname>
   <methodparam><type>bool</type><parameter>sharpen</parameter></methodparam>
   <methodparam><type>float</type><parameter>alpha</parameter></methodparam>
   <methodparam><type>float</type><parameter>beta</parameter></methodparam>
   <methodparam choice="opt"><type>int</type><parameter>channel</parameter><initializer>Imagick::CHANNEL_DEFAULT</initializer></methodparam>
  </methodsynopsis>
  <simpara>
   Adjusts the contrast of an image with a non-linear sigmoidal contrast
   algorithm. Increase the contrast of the image using a sigmoidal transfer
   function without saturating highlights or shadows. <parameter>alpha</parameter> indicates
   how much to increase the contrast: <literal>0.00</literal> is none; <literal>3.00</literal> is
   typical; <literal>20.00</literal> is pushing it.
   <parameter>beta</parameter> indicates where midtones fall in the resultant
   image, as a fraction of the quantum range: <literal>0.0</literal> is white,
   <literal>0.5</literal> is middle-gray, <literal>1.0</literal> is black
   (multiply by <code>getQuantumRange()['quantumRangeLong']</code> to get the value to
   pass).
  </simpara>
  <simpara>
   See also <link xlink:href="&url.imagemagick.usage.color_mods.sigmoidal;">ImageMagick
    Examples -- Color Modifications — Sigmoidal Non-linearity Contrast</link>.
  </simpara>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>sharpen</parameter></term>
     <listitem>
      <simpara>
       If &true; increase the contrast, if &false; decrease the contrast.
      </simpara>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>alpha</parameter></term>
     <listitem>
      <simpara>
       The amount of contrast to apply. <literal>1.00</literal> is very little, <literal>5.00</literal>
       is a significant amount, <literal>20.00</literal> is extreme.
      </simpara>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>beta</parameter></term>
     <listitem>
      <simpara>
       Where the midpoint of the gradient will be. This value should be in the range <literal>0.00</literal>
       to <literal>1.00</literal> - multiplied by the quantum value for ImageMagick.
      </simpara>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>channel</parameter></term>
     <listitem>
      <simpara>
       Which color channels the contrast will be applied to.
      </simpara>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>

 <refsect1 role="errors">
  &reftitle.errors;
  <para>
   &imagick.imagick.throws;
  </para>
 </refsect1>

 <refsect1 role="examples">
  &reftitle.examples;
  <example>
   <title>
    Create a gradient image using <function>Imagick::sigmoidalContrastImage</function>
    suitable for blending two images together smoothly, with the blending
    defined by <parameter>alpha</parameter> and <parameter>beta</parameter>
   </title>
   <programlisting role="php">
<![CDATA[
<?php

function generateBlendImage($width, $height, $alpha = 10, $beta = 0.5)
{
    $imagick = new Imagick();
    $imagick->newPseudoImage($width, $height, 'gradient:black-white');
    $quanta = $imagick->getQuantumRange();
    $imagick->sigmoidalContrastImage(true, $alpha, $beta * $quanta["quantumRangeLong"]);

    return $imagick;
}
]]>
   </programlisting>
  </example>
 </refsect1>

</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

Официальные примеры сохранены вместе с HTTP-контекстом. Наши программы записывают локальный PNG; header с MIME сам по себе файл не перекодирует, а веб-выдача здесь не проверяется. Ссылки: файлы и запись, HTTP-ответ.

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

require __DIR__ . '/levels-fixture.php';
$source = loadLevelsSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$black = 64 / 255 * $Q;
$white = 192 / 255 * $Q;
$image = clone $source;
if (!$image->sigmoidalContrastImage(true, 5.0, 0.5 * $Q)) {
    throw new RuntimeException('Не выполнен sigmoidalContrastImage');
}
saveLevelsComparison([$source, $image], 'sigmoid-catalogue.png');
$source->clear();
$image->clear();

Результат: К исходнику применена S-кривая true/5/0.5×Q без выбора чёрной и белой границ. Меняются тона, а не пространственная резкость границ. Для запуска распакуйте example.php, levels-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без сети и шрифтов. Откройте sigmoid-catalogue.png просмотрщиком. Stdout — это имя файла и перевод строки. Сравнение 800×320 содержит целые панели 400×320 слева направо; размеры не изменяются.

Ожидаемый вывод
sigmoid-catalogue.png
Смягчить слишком контрастную иллюстрацию для макетаПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/levels-fixture.php';
$source = loadLevelsSource();
$range = Imagick::getQuantumRange();
$Q = $range['quantumRangeLong'];
$black = 64 / 255 * $Q;
$white = 192 / 255 * $Q;
$strong = clone $source;
$strong->cropImage(352, 132, 24, 88);
$strong->setImagePage(0, 0, 0, 0);
if (!$strong->levelImage($black, 1.0, $white)) {
    throw new RuntimeException('Не выполнен levelImage');
}
if (!$strong->sigmoidalContrastImage(true, 10.0, 0.5 * $Q)) {
    throw new RuntimeException('Не выполнен sigmoidalContrastImage');
}
$strong->setImageFormat('png');
$strong->setImageDepth(8);
$strong->setOption('png:color-type', '2');
if (!$strong->writeImage(__DIR__ . '/preview-strong.png')) {
    throw new RuntimeException('Не записан preview-strong.png');
}
$softened = clone $strong;
if (!$softened->sigmoidalContrastImage(false, 4.0, 0.5 * $Q)) {
    throw new RuntimeException('Не выполнен sigmoidalContrastImage');
}
$softened->setImageFormat('png');
$softened->setImageDepth(8);
$softened->setOption('png:color-type', '2');
if (!$softened->writeImage(__DIR__ . '/preview-softened.png')) {
    throw new RuntimeException('Не записан preview-softened.png');
}
$strongCard = clone $source;
$softCard = clone $source;
if (!$strongCard->compositeImage($strong, Imagick::COMPOSITE_OVER, 24, 88)) {
    throw new RuntimeException('Не выполнен compositeImage');
}
if (!$softCard->compositeImage($softened, Imagick::COMPOSITE_OVER, 24, 88)) {
    throw new RuntimeException('Не выполнен compositeImage');
}
saveLevelsComparison([$source, $strongCard, $softCard], 'sigmoid-preview.png');
$source->clear();
$strongCard->clear();
$softCard->clear();
$strong->clear();
$softened->clear();

Результат: Исходник; подготовленный сильный preview иллюстрации; его более мягкая версия false/4/0.5×Q. preview-strong.png и preview-softened.png — полноценные отдельные 352×132 PNG. Это смягчение текущего изображения, не точное восстановление исходных оттенков. Для запуска распакуйте example.php, levels-fixture.php и source.png.b64 вместе, сохранив также README и expected-output архива. Выполните php example.php в папке с правом записи, используя PHP с Imagick. Помощник проверяет SHA256 и восстанавливает точный source.png без сети и шрифтов. Откройте sigmoid-preview.png просмотрщиком. Stdout — это имя файла и перевод строки. Сравнение 1200×320 содержит целые панели 400×320 слева направо; размеры не изменяются.

Ожидаемый вывод
sigmoid-preview.png

Связанный путь: модель трёх преобразований, ошибки, каналы и потери.

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

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

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

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

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