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

Дерево руководства
Глава 356 · После растяжения диапазона
Imagick: уровни, гистограмма и тоновая S-кривая
Тусклый каталог и скан ярлыка: расширить диапазон, управлять серединой и сохранить маркировку.
Сделать тусклый каталог читаемым
Поставщик прислал тусклый каталог: тёмный фон стал серым, светлые участки тоже серые, маркировка сливается с коробкой. Нужна читаемая скачиваемая карточка, которую можно вставить в памятку. Начнём с известного дефекта диапазона, затем сравним автоматическую гистограмму и более мягкую тоновую кривую.
Печатные подписи на рисунке унаследованы от первоначального каталога и не пересчитываются при изменении пикселей. Подпись «Серый: 0..255» описывала старую шкалу; в этом новом входе фактический диапазон 64..192, есть повторяющиеся уровни. Контрольные значения теперь 64/96/128/160/192; актуальные числа после операций приведены в сравнительной схеме.


Вход подготовлен заранее: старое значение c заменено на ближайшее целое 64+128×c/255. Это контролируемая учебная имитация тусклого изображения, не фотография с измеренной экспозицией. При таком 8-битном сохранении часть оттенков уже склеилась. Коррекция поднимет контраст, но не восстановит точные цвета старого рисунка или потерянные детали.
| Обозначение | Смысл до схемы |
|---|---|
| RGB, c и c′ | RGB — красная, зелёная и синяя компоненты. c — одно входное значение, c′ — его результат. Серый имеет равные R/G/B; интенсивность — численная яркость, вычисленная из компонент. |
| Q, B и W | Q — QuantumRange, внутренний максимум. В проверенной Q16-сборке Q=65535. B/W — входные чёрная/белая границы, в единицах Q. Здесь B=16448 и W=49344; выходной файл имеет 8 бит на компоненту, 0..255. |
| gamma, alpha, beta | Gamma — безразмерная степень управления средними тонами; используется показатель 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.

Перед первым полным кодом достаточно одного действия. В $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);<?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 правильными. Для произвольных фотографий сначала изучают диапазон и возможные выбросы; автоматическое растяжение и отсечение хвостов решает другую часть задачи.

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

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

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-кривой. Это полезный этап согласования, а не доказательство обратимости обработки.

В 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 и таблицы, для шума — фильтры окрестности.
Выбрать коррекцию и проверить своё решение

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


