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

Дерево руководства
Глава 343 · После загрузки изображения
Imagick: размытие и резкость — подложка, превью, шум и порог
Четыре фильтра на одном переносимом исходнике: от мягкой копии до каналов, чёткой области, повторных проходов и управляемой unsharp-резкости.
Мягкая подложка: увидеть вход, вызов и PNG
Для страницы товара нужна мягкая подложка, а для готового небольшого превью — достаточно чёткие края без грубой каймы. Размытие и повышение резкости решают противоположные задачи; они не являются кнопками отмены друг друга. Возьмём собственный учебный рисунок с коробкой и кружкой, добавив слабый серый шум, резкую ступеньку и мелкие полосы. Это не фотография и не обещание исправить любое качество съёмки.


Главный вызов — $image->blurImage(0, 2.5);. $image хранит объект с пикселями, стрелка вызывает его метод, круглые скобки содержат аргументы. 0 разрешает автоматически выбрать радиус, 2.5 задаёт sigma в пикселях. Метод меняет этот объект. Чтобы исходник остался доступным, делаем отдельную копию:
$image = clone $source;
$image->blurImage(0, 2.5);Это поясняющий фрагмент: $source ниже загружается из приложенного файла. Clone создаёт независимое изображение; простое $image = $source оставило бы два имени одного объекта. Точка с запятой завершает команду. На выходе вызова true/false, а полезный результат находится в изменённых пикселях $image; их ещё нужно записать в PNG.
В saveBlurComparison([$source, $image], 'first-blur.png') квадратные скобки задают список двух картинок, имя файла — второй аргумент. Помощник ставит исходник слева, обработанную копию справа без изменения размера, записывает PNG и выводит его имя. В полной программе if с ! означает «если получен false», throw сообщает отказ, clear освобождает native-ресурсы после сохранения.
<?php
declare(strict_types=1);
require __DIR__ . '/blur-fixture.php';
$source = loadBlurSource();
$image = clone $source;
if (!$image->blurImage(0, 2.5)) {
throw new RuntimeException('Не удалось применить blurImage');
}
saveBlurComparison([$source, $image], 'first-blur.png');
$source->clear();
$image->clear();
Результат: Справа детали и нижние полосы смягчены; граница серой ступеньки стала плавной. Исходник слева сохранён без изменений. Размытие не уменьшает ширину/высоту и не рисует новые предметы. Архив содержит example.php, blur-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; итоговый PNG откройте обычным просмотрщиком. Слева исходник, далее обработанные варианты в указанном порядке. Подписи и увеличения на поясняющих рисунках добавлены отдельно от результата PHP. Размер PNG 800×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
first-blur.png
Что происходит с соседями пикселя

Фильтр рассматривает окрестность каждого пикселя. Размытие усредняет соседние значения: шум слабее, резкий скачок растянут. Повышение резкости подчёркивает локальные различия: переход кажется чётче, рядом может появиться более тёмная/светлая кайма. На рисунке показаны фактические пиксели; линии между измеренными точками помогают сравнить их и не являются формулой всех фильтров.
| Задача | Инструмент |
|---|---|
| Смягчить фактуру или подложку | blurImage(radius,sigma): в текущей реализации два одномерных прохода. |
| Гауссова мягкость, при необходимости по каналу | gaussianBlurImage(radius,sigma,channel): двумерное ядро в проверенной версии. |
| Осторожно подчеркнуть контуры готового превью | sharpenImage(radius,sigma), затем проверить кайму и шум. |
| Отдельно настроить силу и защиту слабых различий | unsharpMaskImage(radius,sigma,amount,threshold,channel). |
<?php
declare(strict_types=1);
require __DIR__ . '/blur-fixture.php';
$source = loadBlurSource();
$image = clone $source;
if (!$image->blurImage(0, 2)) {
throw new RuntimeException('Не удалось применить blurImage');
}
$twice = clone $source;
if (!$twice->sharpenImage(0, 0.8)) {
throw new RuntimeException('Не удалось применить sharpenImage');
}
saveBlurComparison([$source, $image, $twice], 'direction-controls.png');
$source->clear();
$image->clear();
$twice->clear();
Результат: Слева исходник, в центре blurImage(0,2), справа sharpenImage(0,0.8). Размытие сглаживает шум и ступеньку, повышение резкости усиливает их. Правая панель создана из исходника, а не из размытой средней. Архив содержит example.php, blur-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; итоговый PNG откройте обычным просмотрщиком. Слева исходник, далее обработанные варианты в указанном порядке. Подписи и увеличения на поясняющих рисунках добавлены отдельно от результата PHP. Размер PNG 1200×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
direction-controls.png
Радиус, sigma и переносимый запуск
Radius и sigma измеряются в пикселях текущего изображения. Radius ограничивает окрестность; sigma описывает распределение веса внутри неё. Одинаковое число на маленьком превью и большом оригинале затрагивает разную долю предмета. Нельзя автоматически назвать sigma 10 «размытием 10 процентов». Для пользовательского ползунка приложение само задаёт понятную шкалу и допустимые пределы.
Официальный ориентир gaussianBlur/sharpen/unsharp: radius больше sigma либо 0 для выбора библиотекой. Здесь везде radius 0, чтобы не требовать ручного обрезания ядра. В своём интерфейсе разумно ограничить конечные числа, положительную sigma, неотрицательный radius и умеренное усиление; это политика приложения, не обещание универсального native-исключения при каждом другом float.
Полный помощник загрузки и сравнения
<?php
declare(strict_types=1);
function loadBlurSource(): 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) !== 'b9aa6aed9d0d5aec21819d2c7f8c40ad824ce339af8c1f0e4435b565921682d4') {
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 saveBlurComparison(array $panels, string $filename): void
{
$output = new Imagick();
$output->newImage(400 * count($panels), 320, 'white');
$output->setImageFormat('png');
foreach ($panels as $index => $panel) {
if ($panel->getImageWidth() !== 400 || $panel->getImageHeight() !== 320) {
throw new InvalidArgumentException('Панель должна быть 400 на 320 пикселей');
}
if (!$output->compositeImage($panel, Imagick::COMPOSITE_OVER, 400 * $index, 0)) {
throw new RuntimeException('Не удалось собрать сравнение');
}
}
if (!$output->writeImage(__DIR__ . '/' . $filename)) {
throw new RuntimeException('Не удалось записать результат');
}
$output->clear();
echo $filename, "\n";
}
Помощник проверяет целостность приложенного Base64, пишет исходный PNG, создаёт полотно шириной 400 × число панелей и переносит картинки через compositeImage. Это обвязка воспроизводимого опыта: текущая тема — фильтры, а не создание Base64-сервиса. Для другого размера измените проверки и размеры полотна согласованно. Нужны установленное расширение imagick и доступная для записи папка.
Канал, область и отдельный слой — разные решения
У трёх сигнатур default явно назван CHANNEL_DEFAULT; у blurImage документация сохраняет знак ?. В проверенной сборке PHP Reflection показывает именованный CHANNEL_DEFAULT у всех четырёх, но внутренний C-sentinel IM7 для пропущенного аргумента — отдельная деталь реализации. Наши вызовы без channel работают с RGB; опыт gaussianBlurImage с CHANNEL_RED показывает явный выбор составляющей.
Канал не выбирает область. CHANNEL_RED меняет R у всех затронутых пикселей, включая серые. Чтобы оставить область чёткой, нужна пространственная операция: отдельный слой, вырезка или маска. Чтобы мягко размыть нарисованный знак, сначала примените команды ImagickDraw к отдельному холсту Imagick и фильтруйте уже пиксели; у Draw нет gaussianBlurImage.
Переходы: пример красного канала, чёткий центральный прямоугольник, список команд и холст.
Почему порог бережёт слабые различия
Unsharp сравнивает исходный канал с его размытой опорой. Amount умножает эту разницу, а threshold может сохранить исходное значение, когда разница мала. В ImageMagick 7.1.1-46 проверяется abs(2 × delta) < QuantumRange × threshold. Для threshold 0.05 это приблизительно |delta| < 6.375 на шкале 0..255. Порог не равен 5% ширины, не равен 5 уровням и не является классификатором шума.
На нашей внутренней шумовой области 126..130 различия малы: вариант с порогом оставляет её без усиления. На ступеньке 80/180 различие с размытой опорой больше, и граница усиливается. Возле края шумового прямоугольника окружение другое — весь прямоугольник не обязан вести себя как его середина. Сохранённый PNG8 квантован; сравнивать его следует с PNG8 исходника, а не смешивать с округлёнными значениями Q16 в памяти.
Рабочий выбор: начните с умеренного amount, затем поднимайте threshold на независимых копиях, рассматривая полезные детали и ровные области. Порог не убирает уже имеющийся шум и не отменяет ореолы от чрезмерного amount. Версии/ImageMagick и цветовые режимы могут менять конкретные числа; параметры из другого редактора переносите через визуальное сравнение, не по имени ползунка.
Оценить качество и различить точки отказа
True означает, что операция выполнена, а не что качество картинки стало лучше. Проверяйте само изображение: полезные края, мелкий текст, ровные области, тёмную и светлую кайму. Размер файла тоже не является мерой резкости. Все примеры сохраняют отдельный PNG рядом с исходником; сравнивать их нужно при одинаковом масштабе просмотра.
Если Imagick не загрузил вход, не начинайте фильтрацию пустого объекта. Отдельно обработайте отказ чтения, собственные ограничения размеров/числа кадров, отказ фильтра и запись результата. Полный файл из архива запускается в CLI; в веб-обработчике сообщение исключения и абсолютные пути не должны становиться ответом посетителю. Для предсказуемой нагрузки ограничивайте разрешение, sigma и количество копий/проходов. Оригинал оставляйте доступным для новой попытки.
Наш RGB-макет не моделирует каждую фотографию. Прозрачность, цветовые профили, CMYK, HDR и многокадровый вход меняют условия. Не объявляйте размытие надёжным скрытием секретной информации и не повышайте резкость до тех пор, пока не появятся якобы восстановленные данные: утраченных сведений в файле уже нет.
Выбрать один шаг и сохранить возможность сравнить
Для сравнения вариантов клонируйте исходник заново. Пример двух sharpen-проходов намеренно показывает накопление: повтор действует на уже изменённые пиксели. Размытие и резкость не обратимы — смешивание, квантование и обрезание теряют сведения. Если нужны новые детали, ищите лучший исходник или правильную растеризацию, а не безграничное усиление.
- Мягкая подложка: начните с blurImage(0,2) и проверьте, не размыт ли важный текст.
- Гауссово размытие с явным каналом: gaussianBlurImage; цветовые ореолы у CHANNEL_RED могут быть ожидаемым эффектом.
- Один осторожный проход готового превью: sharpenImage; не дублируйте его незаметно в двух обработчиках.
- Усилить выраженные края, не усиливая слабые колебания: unsharpMaskImage с отдельно выбранными amount и threshold.
Упражнение: получить более мягкую подложку, сохранив исходник и выбрав настройку честным сравнением. Решение: создать две независимые clone-копии $source, применить blurImage(0,1.2) к первой и blurImage(0,3) ко второй, собрать три панели. Не размывайте второй раз уже обработанную первую, если сравниваете именно два значения sigma.
Перед началом: запуск PHP, отдельные копии объектов, пути и запись файлов. После выбора мягкости/резкости можно отдельно настроить тона и цвет или добавить собственный знак.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Imagick::blurImageМелкие детали мешают подложке или фактура выглядит слишком резкой. Нужно смягчить соседние пиксели, сохранив исходный размер.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::blurImage(float $radius, float $sigma, int $channel = ?): boolМелкие детали мешают подложке или фактура выглядит слишком резкой. Нужно смягчить соседние пиксели, сохранив исходный размер.

Сигнатура и параметры
Imagick::blurImage(float $radius, float $sigma, int $channel = ?): boolBlurImage добавляет фильтр размытия; третий аргумент позволяет выбрать канал. В ImageMagick 7.1.1-46 используется последовательная свёртка двумя одномерными гауссовыми ядрами по перпендикулярным направлениям. Это объяснение текущей реализации, не обещание одинакового результата или скорости со всеми версиями gaussianBlurImage.
| Аргумент | Значение и единицы |
|---|---|
| $radius | float: радиус окрестности в пикселях. 0 позволяет библиотеке выбрать подходящий радиус из sigma; это не выключение размытия. |
| $sigma | float: стандартное отклонение гауссова распределения в пикселях. В первом опыте 2.5; большее значение расширяет влияние соседей. Это не процент и не количество повторов. |
| $channel | Необязательный int: подходящая для режима изображения константа канала. Для нескольких каналов используют битовое объединение |. Наш вход — непрозрачный RGB PNG; явный Imagick::CHANNEL_RED выбирает красную составляющую каждого пикселя. При пропуске аргумента здесь обрабатываются RGB-составляющие; не переносите этот результат на alpha, CMYK, HDR и любой другой режим без проверки. |
Возвращаемое значение, версии и отказ
Возвращается bool: true при успехе. Метод меняет текущие пиксели объекта Imagick и не возвращает отдельную картинку. $result = $image->blurImage(...) сохранит флаг, а не изображение. Копию создают заранее через clone. Доступность по официальному мануалу: PECL imagick 2, PECL imagick 3.
В Imagick 3.8.1 требуется непустое изображение; вызов на пустом объекте даёт ImagickException. Отказ underlying-операции также превращается в ImagickException. Запись файла — отдельный шаг, у неё могут быть свои ошибки. В примерах if с ! проверяет возвращённый false; необработанное исключение тоже остановит CLI и покажет отказ. В обработчике сайта его перехватывают и сообщают понятную ошибку, не выводя служебные пути пользователю.
Официальные смежные направления: Imagick::adaptiveBlurImage, Imagick::motionBlurImage, Imagick::radialBlurImage. Они решают другие варианты размытия, а не заменяются произвольным увеличением sigma.
Первый управляемый результат
<?php
declare(strict_types=1);
require __DIR__ . '/blur-fixture.php';
$source = loadBlurSource();
$image = clone $source;
if (!$image->blurImage(0, 1.2)) {
throw new RuntimeException('Не удалось применить blurImage');
}
saveBlurComparison([$source, $image], 'blur-small.png');
$source->clear();
$image->clear();
Результат: Слева исходник, справа слабое размытие с sigma 1.2. Нижний мелкий шум стал ровнее, двухпиксельные полосы менее контрастны, переход ступеньки шире. Предметы остаются на прежних местах; размер пары 800×320. Архив содержит example.php, blur-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; итоговый PNG откройте обычным просмотрщиком. Слева исходник, далее обработанные варианты в указанном порядке. Подписи и увеличения на поясняющих рисунках добавлены отдельно от результата PHP. Размер PNG 800×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
blur-small.png
Практическая задача: Оставить центр чётким на мягкой подложке
У баннера есть заранее известная прямоугольная область с предметами. Размываем копию целиком, затем возвращаем исходный прямоугольник шириной 330 и высотой 185 с координат (35,25). Это ручная геометрия макета, не автоматическое выделение товара.
CropImage получает ширину, высоту, x и y; setImagePage сбрасывает смещение вырезанной страницы. CompositeImage возвращает её на размытую копию в те же координаты. В прямоугольник попадает исходный фон вместе с предметами — его край не повторяет силуэт товара.
<?php
declare(strict_types=1);
require __DIR__ . '/blur-fixture.php';
$source = loadBlurSource();
$image = clone $source;
if (!$image->blurImage(0, 4)) {
throw new RuntimeException('Не удалось применить blurImage');
}
$foreground = clone $source;
$foreground->cropImage(330, 185, 35, 25);
$foreground->setImagePage(0, 0, 0, 0);
if (!$image->compositeImage($foreground, Imagick::COMPOSITE_OVER, 35, 25)) {
throw new RuntimeException('Не удалось вернуть чёткую область');
}
$foreground->clear();
saveBlurComparison([$source, $image], 'sharp-center-soft-background.png');
$source->clear();
$image->clear();
Результат: Справа прямоугольник (35,25)–(365,210) побайтно сохраняет исходные пиксели; снаружи подложка размыта с sigma 4. Граница прямоугольная и жёсткая. Для естественного перехода нужна отдельная мягкая маска, которой этот пример не притворяется. Архив содержит example.php, blur-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; итоговый PNG откройте обычным просмотрщиком. Слева исходник, далее обработанные варианты в указанном порядке. Подписи и увеличения на поясняющих рисунках добавлены отдельно от результата PHP. Размер PNG 800×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
sharp-center-soft-background.png
Ошибки, ограничения и альтернативы
В официальной сигнатуре буквально стоит channel = ?. Знак ? здесь означает неуказанный в документации default, а не значение для копирования в PHP. В проверенной PHP-сборке Reflection сообщает Imagick::CHANNEL_DEFAULT (134217727). Внутренняя обвязка IM7 при пропущенном параметре использует собственный sentinel IM_DEFAULT_CHANNEL/UndefinedChannel; это разные уровни описания. Не заменяйте пропущенный аргумент произвольным числом из C-кода. Примеры используют пропуск или именованную константу.
Для сервиса ограничьте размеры, допустимые форматы, параметры и число проходов. Большой radius/sigma требует более широкой окрестности и дополнительных ресурсов; разные реализации и размеры меняют стоимость. Без измерений на своей нагрузке нельзя обещать, что один метод всегда быстрее другого. Эти программы обрабатывают один непрозрачный RGB PNG; кадры анимации, профили и прозрачные границы требуют отдельной политики.
Сравнить: gaussianBlurImage · sharpenImage · unsharpMaskImage. Связанные темы: яркость и тональный контраст, рисование перед фильтрацией, перехват ошибки.
Imagick::gaussianBlurImageНужна гауссова мягкость по всей картинке или по конкретной составляющей цвета.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::gaussianBlurImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): boolНужна гауссова мягкость по всей картинке или по конкретной составляющей цвета.

Сигнатура и параметры
Imagick::gaussianBlurImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): boolМетод сворачивает изображение с гауссовым оператором указанного радиуса и sigma. В официальном описании рекомендуют radius больше sigma либо radius 0 для автоматического выбора. В ImageMagick 7.1.1-46 этот метод строит двумерное гауссово ядро. BlurImage использует другой путь реализации; одинаковые параметры не обязывают все версии выдавать идентичные байты.
| Аргумент | Значение и единицы |
|---|---|
| $radius | float: радиус гауссова оператора в пикселях, не считая центральный пиксель. Выбирайте radius > sigma или 0 для автоматического выбора. |
| $sigma | float: стандартное отклонение в пикселях. В примерах 2. Малый радиус может слишком обрезать выбранное распределение. |
| $channel | Необязательный int: подходящая для режима изображения константа канала. Для нескольких каналов используют битовое объединение |. Наш вход — непрозрачный RGB PNG; явный Imagick::CHANNEL_RED выбирает красную составляющую каждого пикселя. При пропуске аргумента здесь обрабатываются RGB-составляющие; не переносите этот результат на alpha, CMYK, HDR и любой другой режим без проверки. Официальный default: Imagick::CHANNEL_DEFAULT. |
Возвращаемое значение, версии и отказ
Возвращается bool: true при успехе. Метод меняет текущие пиксели объекта Imagick и не возвращает отдельную картинку. $result = $image->gaussianBlurImage(...) сохранит флаг, а не изображение. Копию создают заранее через clone. Доступность по официальному мануалу: PECL imagick 2, PECL imagick 3.
В Imagick 3.8.1 требуется непустое изображение; вызов на пустом объекте даёт ImagickException. Отказ underlying-операции также превращается в ImagickException. Запись файла — отдельный шаг, у неё могут быть свои ошибки. В примерах if с ! проверяет возвращённый false; необработанное исключение тоже остановит CLI и покажет отказ. В обработчике сайта его перехватывают и сообщают понятную ошибку, не выводя служебные пути пользователю.
Первый управляемый результат
<?php
declare(strict_types=1);
require __DIR__ . '/blur-fixture.php';
$source = loadBlurSource();
$image = clone $source;
if (!$image->gaussianBlurImage(0, 2)) {
throw new RuntimeException('Не удалось применить gaussianBlurImage');
}
saveBlurComparison([$source, $image], 'gaussian-blur.png');
$source->clear();
$image->clear();
Результат: Справа гауссово размытие с sigma 2: детали коробки и кружки мягче, резкая серая ступенька превращается в плавный переход. Это готовый отдельный вариант для подложки, а не изменение размеров картинки. Архив содержит example.php, blur-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; итоговый PNG откройте обычным просмотрщиком. Слева исходник, далее обработанные варианты в указанном порядке. Подписи и увеличения на поясняющих рисунках добавлены отдельно от результата PHP. Размер PNG 800×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
gaussian-blur.png
Практическая задача: Размыть только красную составляющую
Для экспериментального цветового оформления нужна мягкость только в красном канале. Передаём явную channel-константу; это полезно, чтобы увидеть, что канал — составляющая всех пикселей, а не набор красных предметов.
<?php
declare(strict_types=1);
require __DIR__ . '/blur-fixture.php';
$source = loadBlurSource();
$image = clone $source;
if (!$image->gaussianBlurImage(0, 2, Imagick::CHANNEL_RED)) {
throw new RuntimeException('Не удалось применить gaussianBlurImage');
}
saveBlurComparison([$source, $image], 'gaussian-red-channel.png');
$source->clear();
$image->clear();
Результат: Справа размыт R, а все G/B-пиксели остались исходными. Даже серая ступенька местами стала цветной: её красный переход сгладился, зелёный и синий сохранили резкую границу. Это намеренный эффект, не универсальная коррекция фотографии. Архив содержит example.php, blur-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; итоговый PNG откройте обычным просмотрщиком. Слева исходник, далее обработанные варианты в указанном порядке. Подписи и увеличения на поясняющих рисунках добавлены отдельно от результата PHP. Размер PNG 800×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
gaussian-red-channel.png
Ошибки, ограничения и альтернативы
GaussianBlurImage вызывают у Imagick с пикселями, а не у ImagickDraw со списком команд. Если нужен мягкий отдельный знак, сначала нарисуйте его на отдельном изображении, затем размойте этот слой. Размывание всей готовой картинки смягчит и предметы, и текст; выбор RGB-канала не заменяет пространственную маску.
Для сервиса ограничьте размеры, допустимые форматы, параметры и число проходов. Большой radius/sigma требует более широкой окрестности и дополнительных ресурсов; разные реализации и размеры меняют стоимость. Без измерений на своей нагрузке нельзя обещать, что один метод всегда быстрее другого. Эти программы обрабатывают один непрозрачный RGB PNG; кадры анимации, профили и прозрачные границы требуют отдельной политики.
Сравнить: blurImage · sharpenImage · unsharpMaskImage. Связанные темы: яркость и тональный контраст, рисование перед фильтрацией, перехват ошибки.
Imagick::sharpenImageГотовое небольшое превью выглядит мягко, и нужно осторожно подчеркнуть контуры, проверив кайму и шум.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::sharpenImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): boolГотовое небольшое превью выглядит мягко, и нужно осторожно подчеркнуть контуры, проверив кайму и шум.

Сигнатура и параметры
Imagick::sharpenImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): boolSharpenImage повышает резкость свёрткой с гауссовым оператором выбранного радиуса и sigma. Официальный ориентир: radius больше sigma либо 0 для автоматического выбора. Усиливаются локальные различия у границ; новые достоверные детали из утраченных данных не появляются.
| Аргумент | Значение и единицы |
|---|---|
| $radius | float: радиус оператора в пикселях. В примере 0: подходящий радиус выбирается автоматически. Это не количество повышений резкости. |
| $sigma | float: стандартное отклонение в пикселях. В примерах умеренное 0.8. Вид зависит от размера и уже имеющихся контуров; одинаковый sigma на большом оригинале и маленьком превью ощущается по-разному. |
| $channel | Необязательный int: подходящая для режима изображения константа канала. Для нескольких каналов используют битовое объединение |. Наш вход — непрозрачный RGB PNG; явный Imagick::CHANNEL_RED выбирает красную составляющую каждого пикселя. При пропуске аргумента здесь обрабатываются RGB-составляющие; не переносите этот результат на alpha, CMYK, HDR и любой другой режим без проверки. Официальный default: Imagick::CHANNEL_DEFAULT. |
Возвращаемое значение, версии и отказ
Возвращается bool: true при успехе. Метод меняет текущие пиксели объекта Imagick и не возвращает отдельную картинку. $result = $image->sharpenImage(...) сохранит флаг, а не изображение. Копию создают заранее через clone. Доступность по официальному мануалу: PECL imagick 2, PECL imagick 3.
В Imagick 3.8.1 требуется непустое изображение; вызов на пустом объекте даёт ImagickException. Отказ underlying-операции также превращается в ImagickException. Запись файла — отдельный шаг, у неё могут быть свои ошибки. В примерах if с ! проверяет возвращённый false; необработанное исключение тоже остановит CLI и покажет отказ. В обработчике сайта его перехватывают и сообщают понятную ошибку, не выводя служебные пути пользователю.
Первый управляемый результат
<?php
declare(strict_types=1);
require __DIR__ . '/blur-fixture.php';
$source = loadBlurSource();
$image = clone $source;
if (!$image->sharpenImage(0, 0.8)) {
throw new RuntimeException('Не удалось применить sharpenImage');
}
saveBlurComparison([$source, $image], 'sharpen-once.png');
$source->clear();
$image->clear();
Результат: Справа один проход sharpenImage. По краям серой ступени появились более тёмные и светлые соседние значения, а слабый шум тоже усилился. Это повышение локальных различий; программа не восстановила отсутствующие детали. Архив содержит example.php, blur-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; итоговый PNG откройте обычным просмотрщиком. Слева исходник, далее обработанные варианты в указанном порядке. Подписи и увеличения на поясняющих рисунках добавлены отдельно от результата PHP. Размер PNG 800×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
sharpen-once.png
Практическая задача: Сравнить один проход и повторное усиление
При подготовке готового превью легко случайно повысить резкость дважды в разных обработчиках. Здесь повтор намеренный: третью панель создаём из уже обработанной второй, чтобы увидеть накопление.
<?php
declare(strict_types=1);
require __DIR__ . '/blur-fixture.php';
$source = loadBlurSource();
$image = clone $source;
if (!$image->sharpenImage(0, 0.8)) {
throw new RuntimeException('Не удалось применить sharpenImage');
}
$twice = clone $image;
if (!$twice->sharpenImage(0, 0.8)) {
throw new RuntimeException('Не удалось применить sharpenImage');
}
saveBlurComparison([$source, $image, $twice], 'sharpen-once-twice.png');
$source->clear();
$image->clear();
$twice->clear();
Результат: Панели слева направо: исходник, один проход, два одинаковых прохода. После повторения светлая и тёмная кайма у ступеньки сильнее; мелкий шум тоже усилен. Это не увеличение разрешения и не восстановление исходной оптики. Архив содержит example.php, blur-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; итоговый PNG откройте обычным просмотрщиком. Слева исходник, далее обработанные варианты в указанном порядке. Подписи и увеличения на поясняющих рисунках добавлены отдельно от результата PHP. Размер PNG 1200×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
sharpen-once-twice.png
Ошибки, ограничения и альтернативы
Повторный вызов снова меняет уже обработанные пиксели и может усиливать ореолы и шум. Если исходный PDF растеризован с недостаточным разрешением или детали разрушены сильным уменьшением/размытием, один sharpen не восстановит их. Для отдельного управления силой и порогом сравните unsharpMaskImage. Не путайте этот метод с тональным contrastImage(true).
Для сервиса ограничьте размеры, допустимые форматы, параметры и число проходов. Большой radius/sigma требует более широкой окрестности и дополнительных ресурсов; разные реализации и размеры меняют стоимость. Без измерений на своей нагрузке нельзя обещать, что один метод всегда быстрее другого. Эти программы обрабатывают один непрозрачный RGB PNG; кадры анимации, профили и прозрачные границы требуют отдельной политики.
Сравнить: blurImage · gaussianBlurImage · unsharpMaskImage. Связанные темы: яркость и тональный контраст, рисование перед фильтрацией, перехват ошибки.
Imagick::unsharpMaskImageНужно отдельно управлять размером деталей, силой усиления и защитой слабых различий от лишней резкости.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::unsharpMaskImage(float $radius, float $sigma, float $amount, float $threshold, int $channel = Imagick::CHANNEL_DEFAULT): boolНужно отдельно управлять размером деталей, силой усиления и защитой слабых различий от лишней резкости.

Сигнатура и параметры
Imagick::unsharpMaskImage(float $radius, float $sigma, float $amount, float $threshold, int $channel = Imagick::CHANNEL_DEFAULT): boolНесмотря на unsharp в названии, метод повышает резкость: строит размытую копию, находит разницу «исходник минус размытие» и прибавляет её с коэффициентом amount. Radius и sigma управляют размытой опорой, amount — усилением, threshold — отбором слабых различий. Это четыре разные настройки, а не четыре способа задать один процент.
| Аргумент | Значение и единицы |
|---|---|
| $radius | float: радиус гауссовой опоры в пикселях. Официально radius > sigma либо 0 для автоматического выбора. |
| $sigma | float: стандартное отклонение опорного размытия в пикселях. Здесь 1. |
| $amount | float: множитель прибавляемой разницы. 0.7 означает прибавить 70% разницы, 1 — всю разницу; это не 0.7%. Слишком сильное усиление даёт кайму/обрезание значений. |
| $threshold | float: нормированный порог относительно диапазона канала, не пиксели расстояния. В проверенной ImageMagick 7.1.1-46 исходное значение сохраняется, когда abs(2 × (original − blurred)) < QuantumRange × threshold. Поэтому 0.05 соответствует границе около 6.375 уровней разницы на шкале 0..255, с учётом множителя 2; это не утверждение о точном совпадении границы после сохранения PNG8. |
| $channel | Необязательный int: подходящая для режима изображения константа канала. Для нескольких каналов используют битовое объединение |. Наш вход — непрозрачный RGB PNG; явный Imagick::CHANNEL_RED выбирает красную составляющую каждого пикселя. При пропуске аргумента здесь обрабатываются RGB-составляющие; не переносите этот результат на alpha, CMYK, HDR и любой другой режим без проверки. Официальный default: Imagick::CHANNEL_DEFAULT. |
Возвращаемое значение, версии и отказ
Возвращается bool: true при успехе. Метод меняет текущие пиксели объекта Imagick и не возвращает отдельную картинку. $result = $image->unsharpMaskImage(...) сохранит флаг, а не изображение. Копию создают заранее через clone. Доступность по официальному мануалу: PECL imagick 2, PECL imagick 3.
В Imagick 3.8.1 требуется непустое изображение; вызов на пустом объекте даёт ImagickException. Отказ underlying-операции также превращается в ImagickException. Запись файла — отдельный шаг, у неё могут быть свои ошибки. В примерах if с ! проверяет возвращённый false; необработанное исключение тоже остановит CLI и покажет отказ. В обработчике сайта его перехватывают и сообщают понятную ошибку, не выводя служебные пути пользователю.
Первый управляемый результат
<?php
declare(strict_types=1);
require __DIR__ . '/blur-fixture.php';
$source = loadBlurSource();
$image = clone $source;
if (!$image->unsharpMaskImage(0, 1, 0.7, 0)) {
throw new RuntimeException('Не удалось применить unsharpMaskImage');
}
saveBlurComparison([$source, $image], 'unsharp-mask.png');
$source->clear();
$image->clear();
Результат: Справа unsharpMaskImage с amount 0.7 и threshold 0: различия с размытой копией усилены. Контуры заметнее, но вместе с ними усиливается слабый шум. Здесь нет порога защиты ровной области. Архив содержит example.php, blur-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; итоговый PNG откройте обычным просмотрщиком. Слева исходник, далее обработанные варианты в указанном порядке. Подписи и увеличения на поясняющих рисунках добавлены отдельно от результата PHP. Размер PNG 800×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
unsharp-mask.png
Практическая задача: Сохранить слабый шум, усилив выраженную границу
Нужно подчеркнуть значимые края и не усиливать едва заметную фактуру. Сравниваем threshold 0 и 0.05 на независимых копиях одного входа, сохраняя radius 0, sigma 1 и amount 1.

<?php
declare(strict_types=1);
require __DIR__ . '/blur-fixture.php';
$source = loadBlurSource();
$image = clone $source;
if (!$image->unsharpMaskImage(0, 1, 1, 0)) {
throw new RuntimeException('Не удалось применить unsharpMaskImage');
}
$twice = clone $source;
if (!$twice->unsharpMaskImage(0, 1, 1, 0.05)) {
throw new RuntimeException('Не удалось применить unsharpMaskImage');
}
saveBlurComparison([$source, $image, $twice], 'unsharp-threshold.png');
$source->clear();
$image->clear();
$twice->clear();
Результат: Слева исходник; в центре порог 0 усиливает и ступеньку, и шум. Справа порог 0.05 сохраняет исходные пиксели во внутренней области слабого шума, но усиливает выраженную границу. У краёв шумового прямоугольника соседние области влияют иначе: порог не обещает защиты всего изображения. Архив содержит example.php, blur-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в доступной для записи папке с PHP/Imagick. Помощник восстановит исходный source.png без интернета; итоговый PNG откройте обычным просмотрщиком. Слева исходник, далее обработанные варианты в указанном порядке. Подписи и увеличения на поясняющих рисунках добавлены отдельно от результата PHP. Размер PNG 1200×320, каждая панель 400×320 без масштабирования.
Ожидаемый вывод
unsharp-threshold.png
Ошибки, ограничения и альтернативы
Threshold не измеряет «важность предмета» и не удаляет шум: он может оставить малую разницу без усиления. Amount и threshold из другого редактора не обязательно имеют ту же шкалу. Формула и множитель 2 уточнены по конкретной версии ImageMagick; для иной версии проверьте результат. Чёрные/белые ореолы и квантование могут терять данные, поэтому противоположный фильтр не является отменой.
Для сервиса ограничьте размеры, допустимые форматы, параметры и число проходов. Большой radius/sigma требует более широкой окрестности и дополнительных ресурсов; разные реализации и размеры меняют стоимость. Без измерений на своей нагрузке нельзя обещать, что один метод всегда быстрее другого. Эти программы обрабатывают один непрозрачный RGB PNG; кадры анимации, профили и прозрачные границы требуют отдельной политики.
Сравнить: blurImage · gaussianBlurImage · sharpenImage. Связанные темы: яркость и тональный контраст, рисование перед фильтрацией, перехват ошибки.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


