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

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

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

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

Глава 347 · После обычного blur/sharpen

Imagick: шум, адаптивные границы, похожие соседи и движение

От первого адаптивного PNG до карты перепадов, quantum-порога, цепочки с резкостью и проверенного направления следа.

Смягчить зернистость и увидеть цену для деталей

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

Собственный вход 400×320: зернистый каталог, шум ±12 со слабой деталью +8, жёсткая граница 60/196 и белый импульс 3×3
Собственный вход 400×320: зернистый каталог, шум ±12 со слабой деталью +8, жёсткая граница 60/196 и белый импульс 3×3
Первый результат: адаптивное размытие на том же входе; изучаем шум, надпись и перепад отдельно
Первый результат: адаптивное размытие на том же входе; изучаем шум, надпись и перепад отдельно

Главная запись $image->adaptiveBlurImage(0, 1.2); задаёт автоматический радиус 0 и sigma=1.2 пикселя. $image — переменная с объектом картинки; стрелка вызывает его метод. Скобки содержат аргументы, запятая отделяет их, точка с запятой завершает действие. В отличие от одинакового размытия по всему изображению интенсивность здесь зависит от карты границ деталей.

$image = clone $source;
$image->adaptiveBlurImage(0, 1.2);

В полной программе $source будет загружен из приложенного PNG. Clone создаёт отдельное изображение; $image = $source оставило бы два имени одного объекта. Исходник подготовлен отдельно от фильтров: в собственный рисунок добавлен детерминированный шум ±3 на товаре; нижний шумовой образец — основа 128 с шумом ±12 и прямоугольником основы 136. Рядом точный перепад 60/196 и белые 3×3 пикселя на 128. Это контрольный рисунок, не обещание такого же поведения на любой фотографии.

Перед clone полная программа вызывает setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE). Это правило чтения за рамкой: продолжить ближайший крайний пиксель, когда ядру нужны соседи снаружи. Двойное двоеточие обращается к именованной константе класса. Метод не меняет размер и вид исходника. SaveAdaptiveComparison([$source, $image], 'adaptive-first.png') получает массив двух панелей, собирает PNG8 и выводит имя. Квадратные скобки создают список; первая панель слева.

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

require __DIR__ . '/adaptive-fixture.php';
$source = loadAdaptiveSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->adaptiveBlurImage(0, 1.2)) {
    throw new RuntimeException('Не удалось применить adaptiveBlurImage');
}
saveAdaptiveComparison([$source, $image], 'adaptive-first.png');
$source->clear();
$image->clear();

Результат: Справа адаптивное размытие с radius=0 и sigma=1.2 пикселя. На ровном контрольном участке стандартное отклонение R уменьшилось с 7.03 до 2.70 уровня PNG8. Но две соседние точки перепада 60/196 стали 101/150: даже сильная граница изменяется. Это не обещание сохранить каждый контур без изменения. Архив содержит example.php, adaptive-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске; итоговый PNG откройте обычным просмотрщиком. Первая панель — исходник, далее варианты в указанном порядке. Размер PNG 800×320; каждая панель 400×320 без изменения масштаба. Подписи исходного растра не пересчитываются фильтром.

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

Соседи, карта границ, допуск и направление

В подписи Q — максимум внутреннего значения канала (QuantumRange); в проверенной Q16-сборке он равен 65535. Поэтому 0.05×Q означает допуск 3276.75, то есть 5% диапазона значений интенсивности, а не 5% числа пикселей из предыдущей главы. Radius и sigma рядом измеряются в пикселях, угол motion — в градусах.

Реальные участки фона, жёсткой границы и текста после четырёх операторов: изменения зависят от задачи
Реальные участки фона, жёсткой границы и текста после четырёх операторов: изменения зависят от задачи
ПотребностьМетодЧто контролировать
Смягчить фон с учётом перепадовadaptiveBlurImageШум, текст и край предмета; нет обещания идеального сохранения границ.
Усилить существующие перепадыadaptiveSharpenImageРезкость надписи и возможное усиление зернистости/ореолов.
Усреднять только похожих соседейselectiveBlurImageПорог интенсивности и потерю слабого прямоугольника +8.
Добавить направленный следmotionBlurImageУгол, сторону следа и рамку; это не удаление исходного смаза.

Представьте маленькое окно соседей вокруг выбранного пикселя. Обычное усреднение задаёт веса по расстоянию; adaptive-операторы ещё используют карту обнаруженных перепадов, selective допускает соседей по разности интенсивности, motion выбирает смещения вдоль направления. Это модель численных данных, а не распознавание «шума», «буквы» или «движущейся кружки». Слабая деталь и шум могут иметь одинаковое число.

До полной сравнительной программы разберём её вызовы. Первые два аргумента везде — radius и sigma в пикселях. У selective третий — quantum-порог; $quantum получен через Imagick::getQuantumRange(), квадратные скобки выбирают ключ quantumRangeLong из возвращённого массива. У motion третий аргумент — угол в градусах. В полном коде все переменные с изображениями создаются отдельным clone из одного $source.

В Imagick::getQuantumRange() двойное двоеточие вместе со скобками означает вызов статического метода класса: отдельный объект для этого вызова не нужен. У Imagick::VIRTUALPIXELMETHOD_EDGE скобок нет: это чтение константы. Одна запись возвращает данные о диапазоне, другая выбирает именованное правило границы. Подробнее: статический вызов и константы класса.

$image->adaptiveBlurImage(0, 1.2);
$sharpened->adaptiveSharpenImage(0, 1.2);
$selected->selectiveBlurImage(0, 1.2, $quantum * 0.05);
$motion->motionBlurImage(0, 3, 0);

Фрагмент показывает ядро, полная программа ниже создаёт переменные и сохраняет пять панелей. Звёздочка умножает максимум диапазона на 0.05; это 5%, тогда как число 0.05 без умножения имеет совсем другой масштаб. Подписи, уже напечатанные в исходнике, фильтры не пересчитывают: фактические свойства результата показаны отдельно в схемах и объяснениях.

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

require __DIR__ . '/adaptive-fixture.php';
$source = loadAdaptiveSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->adaptiveBlurImage(0, 1.2)) {
    throw new RuntimeException('Не удалось применить adaptiveBlurImage');
}
$sharpened = clone $source;
if (!$sharpened->adaptiveSharpenImage(0, 1.2)) {
    throw new RuntimeException('Не удалось применить adaptiveSharpenImage');
}
$selected = clone $source;
$quantum = Imagick::getQuantumRange()['quantumRangeLong'];
if (!$selected->selectiveBlurImage(0, 1.2, $quantum * 0.05)) {
    throw new RuntimeException('Не удалось применить selectiveBlurImage');
}
$motion = clone $source;
if (!$motion->motionBlurImage(0, 3, 0)) {
    throw new RuntimeException('Не удалось применить motionBlurImage');
}
saveAdaptiveComparison([$source, $image, $sharpened, $selected, $motion], 'adaptive-controls.png');
$source->clear();
$image->clear();
$sharpened->clear();
$selected->clear();
$motion->clear();

Результат: Панели: исходник, adaptiveBlur(0,1.2), adaptiveSharpen(0,1.2), selectiveBlur(0,1.2,5% QuantumRange), motionBlur(0,3,0°). Контрольные участки позволяют сравнить фон, переход и текст, не подменяя критерий качества размером PNG. Архив содержит example.php, adaptive-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске; итоговый PNG откройте обычным просмотрщиком. Первая панель — исходник, далее варианты в указанном порядке. Размер PNG 2000×320; каждая панель 400×320 без изменения масштаба. Подписи исходного растра не пересчитываются фильтром.

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

Различать пиксели, quantum-допуск и градусы

Radius ограничивает размер Gaussian-окрестности без центрального пикселя; sigma — стандартное отклонение распределения весов, тоже в пикселях. Они не являются двумя равнозначными регуляторами «силы». Нулевой radius выбирает подходящее ядро автоматически; это отличается от нулевого sigma. При изменении разрешения прежние пиксельные значения относятся к другой доле буквы или предмета.

Selective threshold — допуск разности native-интенсивности, а не процент сам по себе и не уровень двоичного порога. У Q16 максимум 65535; доли 2%, 5% и 12% дают 1310.7, 3276.75 и 7864.2. PHP-wrapper передаёт threshold напрямую в библиотеку. Строковая CLI-запись вида +5% не означает, что PHP-аргумент 5 будет масштабирован автоматически. Motion angle, напротив, измеряется в градусах: умножать его на QuantumRange не требуется.

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

function loadAdaptiveSource(): 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) !== '21ad952cae5cde499870fd21ce4a757f76861f66838d677a126bc7859e45b28d') {
        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 saveAdaptiveComparison(array $panels, string $filename): void
{
    if ($panels === []) {
        throw new InvalidArgumentException('Нужна хотя бы одна панель');
    }
    $output = new Imagick();
    $output->newImage(400 * count($panels), 320, 'white');
    $output->setImageFormat('png');
    foreach ($panels as $index => $panel) {
        if (!$panel instanceof Imagick || $panel->getImageWidth() !== 400 || $panel->getImageHeight() !== 320) {
            throw new InvalidArgumentException('Панель должна быть Imagick 400 на 320 пикселей');
        }
        if (!$output->compositeImage($panel, Imagick::COMPOSITE_OVER, 400 * $index, 0)) {
            throw new RuntimeException('Не удалось собрать сравнение');
        }
    }
    $output->setImageDepth(8);
    $output->setOption('png:color-type', '2');
    if (!$output->writeImage(__DIR__ . '/' . $filename)) {
        throw new RuntimeException('Не удалось записать результат');
    }
    $output->clear();
    echo $filename, "\n";
}

Помощник использует file_get_contents, base64_decode с проверкой, hash и file_put_contents; source.png восстанавливается в доступной для записи папке. CompositeImage переносит готовые панели на полотно без масштабирования. SetImageDepth(8) и png:color-type=2 сохраняют RGB PNG8. Это обвязка примера, не дополнительный adaptive-фильтр. Исходный текст уже нарисован в PNG, поэтому шрифты при запуске не нужны.

Квантование ограничивает число сохраняемых уровней: PNG8 имеет 0..255, native Q16 — 0..65535. Экспорт пикселя из native-объекта и чтение сохранённого PNG8 могут округляться по-разному. Здесь конкретные наблюдения относятся к сохранённым файлам. RGB — три составляющие цвета; sRGB — представление нашего непрозрачного входа. ICC/CMYK, линейный RGB и HDR требуют отдельной политики. Основы: массив и ключ, аргумент, объект, исключение, чтение и запись.

Стандартное отклонение здесь — число, показывающее разброс значений вокруг среднего: меньшее число означает более ровные значения на выбранном участке. Для шума измеряем R в прямоугольнике x=20..119,y=290..303, где основа равна 128 и нет слабой детали +8. Это отдельный показатель сохранённого PNG8, а не общий балл качества изображения. У слабого прямоугольника и текста свои критерии.

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

Карта границ влияет на обработку; три контрольных участка не заменяют критерий качества реального товара
Карта границ влияет на обработку; три контрольных участка не заменяют критерий качества реального товара
Порог похожести позволяет сгладить шум, но слабая деталь +8 тоже может попасть в усреднение
Порог похожести позволяет сгладить шум, но слабая деталь +8 тоже может попасть в усреднение

Нижний образец специально объединяет шум и слабую деталь. Разброс на ровном прямоугольнике можно посчитать, но меньшее число не означает лучший рисунок целиком. Читателю важны надпись, контур ручки кружки и сохранённые слабые переходы. Карта EdgeImage содержит признаки резких изменений, в том числе шумовых; она не знает назначения объектов.

Пределы selective также численные: условие abs(contrast)бинаризации и отсечек.

Направление следа и соседи за рамкой

Белая точка показывает направление реального следа; координатная ось y направлена вниз
Белая точка показывает направление реального следа; координатная ось y направлена вниз

У направленного фильтра ядру нужны пиксели на смещениях вдоль линии. На рамке часть таких координат выходит за изображение; virtual pixels задают ответ. EDGE продолжает край, TILE повторяет изображение плитками. В нашем preflight эти политики дали разные пиксели, хотя размер и angle совпали. Поэтому все программы явно выбирают EDGE до копирования.

Копирование области тоже создаёт новую рамку. Adaptive-карта и соседи внутри crop отличаются от обработки полного исходника. Если нужна мягкая граница локального эффекта, следующий проект — согласованная маска и смешивание; жёсткий прямоугольник здесь выбран для проверяемого сохранения внешних пикселей.

След изолированной точки измерен внутри окна x=296..353,y=258..297 по условию R≥130, чтобы светлая рамка самой плашки не считалась следом точки. Выбранные пиксели не касаются границы измерительного окна, поэтому оно их не обрезает. Охватывающие след прямоугольники: при 0° x=318..327,y=277..279; при 90° x=325..327,y=270..279; при 45° x=320..327,y=272..279. Это геометрия контрольной точки внутри кадра, не полная область всех изменённых пикселей PNG. Полные изображения рядом показывают и следы остальных деталей.

Угол 0/90/45° и белый импульс позволяют проверить оператор на простой геометрии. Реальная фотография может иметь несколько направлений, изменяющуюся скорость и перспективу. Добавленный motion blur не исправит такой смаз и не докажет физику снимка. Связь с оформлением: самостоятельные цветовые варианты.

Проверить полезный результат и границы опыта

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

Проверяйте формат, площадь, число кадров, профиль и права записи до обработки. Внешний файл может потребовать значительные native-ресурсы; размер ядра и число промежуточных копий также влияют на память. Ограничьте параметры и измерьте время своей цепочки. Сбой чтения, фильтра и записи обрабатывайте отдельно; не показывайте клиенту внутренние пути или необработанный native-текст.

Программы выполнены на PHP 8.5.11, Imagick 3.8.1 и ImageMagick 7.1.1-46 Q16. Все наблюдения относятся к сохранённым PNG8 этого входа. Предварительная проверка маленького образца подтверждает единицы, каналы, sigma=0, threshold=0, направления и отличие virtual policies; она не является полным доказательством алгоритма для произвольного цвета и alpha. Для полного независимого воспроизведения алгоритмов здесь нет заявления.

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

Выбор по цели: фон, границы, похожие соседи или декоративное движение; исходник остаётся отдельно
Выбор по цели: фон, границы, похожие соседи или декоративное движение; исходник остаётся отдельно
  • Ровный фон с зернистостью: сравните adaptiveBlur с исходником на шуме и буквах.
  • Нужны заметнее уже существующие границы: adaptiveSharpen с контролем фона и ореолов.
  • Нужен допуск похожести: selectiveBlur с явными quantum-единицами и слабой полезной деталью.
  • Нужен оформительский след: motionBlur, понятный angle и явно выбранные virtual pixels.

Упражнение: смягчить только картинку товара, сохранив заголовок и все нижние образцы точными. Решение: clone исходника; cropImage(352,184,24,36); adaptiveBlurImage(0,1.2); compositeImage обратно в (24,36); сохранить новый PNG. Проверка — все внешние пиксели совпадают, внутри есть изменение. Полная программа: локальная обработка. Затем сравните цепочку «смягчение → резкость» с одной резкостью и объясните, почему это не обратные операции.

Дальше: Gaussian и unsharp mask, узкий диапазон и выбросы, текст и двоичные пороги, отдельные производные файлы. Для каждой новой настройки снова берите оригинал; потерянная тонкая линия не возвращается обычным усилением резкости.

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

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

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

PECL imagick 2, PECL imagick 3 · imagick

Imagick::adaptiveBlurImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): bool

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

Размытие всего макета и только области товара: текст и служебные образцы можно защитить геометрией
Размытие всего макета и только области товара: текст и служебные образцы можно защитить геометрией

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

В $image уже загружена отдельная копия. 0 — автоматический радиус, 1.2 — sigma в пикселях. Третий аргумент пропущен и имеет default channel. Размытие будет зависеть от найденных перепадов; это не выбор только внешней рамки. Стрелка вызывает метод объекта, круглые скобки содержат аргументы, запятые их отделяют, точка с запятой завершает команду. Для сохранения оригинала до вызова создайте $image = clone $source; простое присваивание не копирует объект.

$image->adaptiveBlurImage(0, 1.2);

Это пояснение ядра. Полная программа ниже также загрузит вход, задаст virtual pixels, проверит возврат и запишет PNG. Подготовка: объект и метод, clone, массив и ключ.

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

Imagick::adaptiveBlurImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): bool

Адаптивное размытие зависит от обнаруженных перепадов изображения: около границ деталей оно слабее, чем вдали от них. Здесь edges — не только внешняя рамка файла. В точной реализации строится EdgeImage, его уровни нормируются, карта размывается и нормируется снова; по ней выбирается одно из ядер. Это численная карта, не распознавание товара или текста.

АргументСмысл, единицы и default
$radiusОбязательный float: радиус Gaussian в пикселях без центрального пикселя. 0 разрешает библиотеке подобрать радиус. Это не ширина PNG и не отключение фильтра.
$sigmaОбязательный float: стандартное отклонение Gaussian в пикселях. В примере 1.2; оно задаёт распределение весов соседей, не долю от QuantumRange.
$channelНеобязательный int, default Imagick::CHANNEL_DEFAULT. Одна константа или объединение нескольких каналов через побитовое |; допустимость зависит от режима каналов.

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

Результат bool: true при успехе. Метод меняет пиксели текущего Imagick; $ok = $image->adaptiveBlurImage(...) сохранит флаг, не новую картинку. Обязательность и default приведены в исходной сигнатуре выше. Доступность PHP Manual: PECL imagick 2, PECL imagick 3.

Официальное ограничение: Imagick должен быть собран с ImageMagick 6.2.9 или новее. Номер библиотеки ImageMagick отличается от номера PHP-расширения Imagick.

В проверенной версии пустой Imagick даёт ImagickException; native-отказ обвязка также превращает в исключение. Чтение и запись могут отказать отдельно. If с ! проверяет false, throw прекращает программу сообщением; clear после записи освобождает ресурсы. В веб-обработчике перехватите исключение и покажите понятный отказ без внутренних путей. Возвращаемое true не подтверждает художественное качество или удаление шума.

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

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

require __DIR__ . '/adaptive-fixture.php';
$source = loadAdaptiveSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->adaptiveBlurImage(0, 1.2)) {
    throw new RuntimeException('Не удалось применить adaptiveBlurImage');
}
saveAdaptiveComparison([$source, $image], 'adaptive-blur-basic.png');
$source->clear();
$image->clear();

Результат: Справа адаптивное размытие с radius=0 и sigma=1.2 пикселя. На ровном контрольном участке стандартное отклонение R уменьшилось с 7.03 до 2.70 уровня PNG8. Но две соседние точки перепада 60/196 стали 101/150: даже сильная граница изменяется. Это не обещание сохранить каждый контур без изменения. Архив содержит example.php, adaptive-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске; итоговый PNG откройте обычным просмотрщиком. Первая панель — исходник, далее варианты в указанном порядке. Размер PNG 800×320; каждая панель 400×320 без изменения масштаба. Подписи исходного растра не пересчитываются фильтром.

Ожидаемый вывод
adaptive-blur-basic.png

Практическая задача: Обработать только изображение товара, сохранив заголовок и образцы

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

CropImage получает ширину 352, высоту 184 и начало x=24,y=36; setImagePage сбрасывает виртуальное смещение вырезки. После фильтра compositeImage с COMPOSITE_OVER возвращает область в (24,36). $region — отдельный объект. Выбрана известная геометрия макета; автоматического обнаружения товара здесь нет. При жёстком стыке обработанной области оценивайте шов.

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

require __DIR__ . '/adaptive-fixture.php';
$source = loadAdaptiveSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
$region = clone $source;
$region->cropImage(352, 184, 24, 36);
$region->setImagePage(0, 0, 0, 0);
if (!$region->adaptiveBlurImage(0, 1.2)) {
    throw new RuntimeException('Не удалось применить adaptiveBlurImage');
}
if (!$image->compositeImage($region, Imagick::COMPOSITE_OVER, 24, 36)) {
    throw new RuntimeException('Не удалось вернуть область');
}
$region->clear();
saveAdaptiveComparison([$source, $image], 'adaptive-blur-region.png');
$source->clear();
$image->clear();

Результат: Справа изменена только область x=24..375,y=36..219. Все внешние пиксели, заголовок и три нижних образца сохранены точно. Карта границ строится по вырезке, а её край получает virtual pixels: внутренний результат не обязан совпасть с тем же участком после фильтрации всего макета. Архив содержит example.php, adaptive-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске; итоговый PNG откройте обычным просмотрщиком. Первая панель — исходник, далее варианты в указанном порядке. Размер PNG 800×320; каждая панель 400×320 без изменения масштаба. Подписи исходного растра не пересчитываются фильтром.

Ожидаемый вывод
adaptive-blur-region.png

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

Высокочастотный шум сам создаёт признаки границ, а слабая полезная деталь может быть сглажена. Метод не гарантирует сохранения каждой буквы. В текущей C-версии sigma=0 возвращает неизменённую копию с true; radius=0 при положительном sigma выбирает ядро автоматически. Увеличение sigma без оценки образца не является улучшением.

Для приложения выбирайте конечные radius≥0 и sigma>0 с верхними пределами по разрешению; selective threshold ограничьте осмысленной долей диапазона, motion angle — понятным диапазоном градусов. Это политика приложения, не обещание полной валидации Imagick. Большая окрестность и adaptive-карта стоят памяти и времени: ограничьте площадь, число кадров и число копий, измерьте свою нагрузку. Сравнительной гарантии скорости здесь нет.

В preflight явный CHANNEL_RED у всех четырёх методов сохранил G/B. Канал — составляющая всего растра; несколько флагов объединяются |, например Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE. Uniform alpha=50% сохранилась в ограниченном опыте с default и RGB-маской, но это не проверка прозрачного края и не общая гарантия alpha. Основные программы работают с непрозрачным sRGB PNG; произвольная alpha, ICC/CMYK, HDR и кадры требуют отдельной проверки.

Связанные методы: adaptiveSharpenImage · selectiveBlurImage · motionBlurImage. Предыдущий шаг: обычное размытие, резкость и unsharp mask; для диапазона: нормализация и хвосты гистограммы.

В исходном списке See Also перечислены blurImage, motionBlurImage и radialBlurImage. Официальная связанная карточка: radialBlurImage. Радиальный эффект рассматривается отдельно от этой адаптивной операции.

Imagick::adaptiveSharpenImageНа уже пригодном для просмотра изображении хочется сделать переходы у текста и предмета заметнее, не усиливая всё одинаковым способом.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::adaptiveSharpenImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): bool

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

Исходная резкость и цепочка со смягчением: промежуточный результат нужен для отдельной оценки
Исходная резкость и цепочка со смягчением: промежуточный результат нужен для отдельной оценки

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

В $image находится отдельная копия. 0 разрешает автоматически выбрать радиус; 1.2 задаёт sigma в пикселях. Channel пропущен и берётся по default. Обрабатываются найденные перепады; шум тоже может участвовать в них. Стрелка вызывает метод объекта, круглые скобки содержат аргументы, запятые их отделяют, точка с запятой завершает команду. Для сохранения оригинала до вызова создайте $image = clone $source; простое присваивание не копирует объект.

$image->adaptiveSharpenImage(0, 1.2);

Это пояснение ядра. Полная программа ниже также загрузит вход, задаст virtual pixels, проверит возврат и запишет PNG. Подготовка: объект и метод, clone, массив и ключ.

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

Imagick::adaptiveSharpenImage(float $radius, float $sigma, int $channel = Imagick::CHANNEL_DEFAULT): bool

Адаптивная резкость действует сильнее около найденных границ и слабее вдали. Точная библиотека строит карту EdgeImage с нормированием и размытием и выбирает ядро резкости по этой карте. Усиливаются существующие различия; новых достоверных деталей фильтр не создаёт.

АргументСмысл, единицы и default
$radiusОбязательный float: радиус Gaussian в пикселях, центральный пиксель не считается. 0 означает автоматический выбор.
$sigmaОбязательный float: стандартное отклонение в пикселях. Параметры подбираются к рабочему разрешению, а не к числу байтов исходника.
$channelНеобязательный int, default Imagick::CHANNEL_DEFAULT. Канал ограничивает изменяемые составляющие; это не выбор прямоугольника и не поиск букв.

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

Результат bool: true при успехе. Метод меняет пиксели текущего Imagick; $ok = $image->adaptiveSharpenImage(...) сохранит флаг, не новую картинку. Обязательность и default приведены в исходной сигнатуре выше. Доступность PHP Manual: PECL imagick 2, PECL imagick 3.

Официальное ограничение: Imagick должен быть собран с ImageMagick 6.2.9 или новее. Номер библиотеки ImageMagick отличается от номера PHP-расширения Imagick.

В проверенной версии пустой Imagick даёт ImagickException; native-отказ обвязка также превращает в исключение. Чтение и запись могут отказать отдельно. If с ! проверяет false, throw прекращает программу сообщением; clear после записи освобождает ресурсы. В веб-обработчике перехватите исключение и покажите понятный отказ без внутренних путей. Возвращаемое true не подтверждает художественное качество или удаление шума.

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

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

require __DIR__ . '/adaptive-fixture.php';
$source = loadAdaptiveSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->adaptiveSharpenImage(0, 1.2)) {
    throw new RuntimeException('Не удалось применить adaptiveSharpenImage');
}
saveAdaptiveComparison([$source, $image], 'adaptive-sharpen-basic.png');
$source->clear();
$image->clear();

Результат: Справа адаптивная резкость с radius=0 и sigma=1.2. Соседние точки перепада 60/196 стали 20/236, а стандартное отклонение R на шумовом участке выросло с 7.03 до 12.51 уровня PNG8. Здесь одновременно усилились переход и шум. Фильтр не удаляет зернистость и не восстанавливает отсутствующие детали; проверяйте ореолы, фон и надпись. Архив содержит example.php, adaptive-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске; итоговый PNG откройте обычным просмотрщиком. Первая панель — исходник, далее варианты в указанном порядке. Размер PNG 800×320; каждая панель 400×320 без изменения масштаба. Подписи исходного растра не пересчитываются фильтром.

Ожидаемый вывод
adaptive-sharpen-basic.png

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

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

Первый adaptiveBlurImage меняет $image. Затем $smoothed = clone $image сохраняет промежуточную копию; следующий adaptiveSharpenImage меняет только $image. Поэтому три панели показывают весь путь: вход → смягчение → усиление. Одна и та же sigma=0.8 у двух методов не означает взаимно обратные операции.

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

require __DIR__ . '/adaptive-fixture.php';
$source = loadAdaptiveSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->adaptiveBlurImage(0, 0.8)) {
    throw new RuntimeException('Не удалось применить adaptiveBlurImage');
}
$smoothed = clone $image;
if (!$image->adaptiveSharpenImage(0, 0.8)) {
    throw new RuntimeException('Не удалось применить adaptiveSharpenImage');
}
saveAdaptiveComparison([$source, $smoothed, $image], 'adaptive-sharpen-after-smoothing.png');
$source->clear();
$smoothed->clear();
$image->clear();

Результат: Панели: исходник, adaptiveBlur(0,0.8), затем adaptiveSharpen(0,0.8). Третья панель отличается от второй реальными пикселями; шум и текст оцениваем раздельно. Такая цепочка не гарантирует лучший результат и не отменяет потерю детали первым шагом. Сохранённая промежуточная панель позволяет отказаться от лишнего усиления. Архив содержит example.php, adaptive-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске; итоговый PNG откройте обычным просмотрщиком. Первая панель — исходник, далее варианты в указанном порядке. Размер PNG 1200×320; каждая панель 400×320 без изменения масштаба. Подписи исходного растра не пересчитываются фильтром.

Ожидаемый вывод
adaptive-sharpen-after-smoothing.png

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

Шум и JPEG-артефакты тоже имеют перепады и могут усилиться. Возможны ореолы и обрезка значений; повторная резкость не восстанавливает оригинал. True и одинаковый размер файла не доказывают полезное изменение. При sigma=0 текущая реализация возвращает неизменённую копию. Проверяйте текст, фон и контуры на одинаковом масштабе.

Для приложения выбирайте конечные radius≥0 и sigma>0 с верхними пределами по разрешению; selective threshold ограничьте осмысленной долей диапазона, motion angle — понятным диапазоном градусов. Это политика приложения, не обещание полной валидации Imagick. Большая окрестность и adaptive-карта стоят памяти и времени: ограничьте площадь, число кадров и число копий, измерьте свою нагрузку. Сравнительной гарантии скорости здесь нет.

В preflight явный CHANNEL_RED у всех четырёх методов сохранил G/B. Канал — составляющая всего растра; несколько флагов объединяются |, например Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE. Uniform alpha=50% сохранилась в ограниченном опыте с default и RGB-маской, но это не проверка прозрачного края и не общая гарантия alpha. Основные программы работают с непрозрачным sRGB PNG; произвольная alpha, ICC/CMYK, HDR и кадры требуют отдельной проверки.

Связанные методы: adaptiveBlurImage · selectiveBlurImage · motionBlurImage. Предыдущий шаг: обычное размытие, резкость и unsharp mask; для диапазона: нормализация и хвосты гистограммы.

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

PECL imagick 3 >= 3.3.0 · imagick

Imagick::selectiveBlurImage(float $radius, float $sigma, float $threshold, int $channel = Imagick::CHANNEL_DEFAULT): bool

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

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

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

Первая строка получает массив сведений о native-диапазоне. Квадратные скобки выбирают ключ quantumRangeLong; знак = сохраняет максимум в $quantum. Во второй строке 0 задаёт автоматический радиус, 1.2 — sigma в пикселях, звёздочка умножает максимум на 0.05. Получается порог 5% диапазона, то есть 3276.75 при Q16=65535. Imagick::getQuantumRange() — статический вызов метода класса: :: со скобками вызывает метод без создания отдельного объекта; это отличается от чтения константы без скобок. Стрелка вызывает метод объекта, круглые скобки содержат аргументы, запятые их отделяют, точка с запятой завершает команду. Для сохранения оригинала до вызова создайте $image = clone $source; простое присваивание не копирует объект.

$quantum = Imagick::getQuantumRange()['quantumRangeLong'];
$image->selectiveBlurImage(0, 1.2, $quantum * 0.05);

Это пояснение ядра. Полная программа ниже также загрузит вход, задаст virtual pixels, проверит возврат и запишет PNG. Подготовка: объект и метод, clone, массив и ключ.

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

Imagick::selectiveBlurImage(float $radius, float $sigma, float $threshold, int $channel = Imagick::CHANNEL_DEFAULT): bool

Библиотека сравнивает модуль разности интенсивностей соседнего и текущего пикселя с threshold. В точном C условие строгое: abs(contrast) < threshold. Подходящие соседи участвуют во взвешенном среднем. Это не независимое сравнение каждой R/G/B-компоненты и не порог, превращающий изображение в чёрно-белое.

АргументСмысл, единицы и default
$radiusОбязательный float: радиус в пикселях без центрального пикселя; 0 выбирает подходящий размер ядра по sigma.
$sigmaОбязательный float: стандартное отклонение Gaussian в пикселях.
$thresholdОбязательный float в native-единицах разности интенсивности. PHP-wrapper передаёт число напрямую. Для доли 5% используем Imagick::getQuantumRange()['quantumRangeLong'] * 0.05: при Q16 это 3276.75. Literal 0.05 сам по себе не означает 5%.
$channelНеобязательный int, default Imagick::CHANNEL_DEFAULT. Маска ограничивает изменяемые каналы; оценка контраста связана с интенсивностью и alpha/traits текущего изображения.

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

Результат bool: true при успехе. Метод меняет пиксели текущего Imagick; $ok = $image->selectiveBlurImage(...) сохранит флаг, не новую картинку. Обязательность и default приведены в исходной сигнатуре выше. Доступность PHP Manual: PECL imagick 3 >= 3.3.0.

SelectiveBlurImage добавлен в PECL imagick 3.3.0. Краткий официальный текст не раскрывает аргументы подробно; единицы выше дополнены по точным PHP-wrapper и C-библиотеке и ограниченному native-запуску.

В проверенной версии пустой Imagick даёт ImagickException; native-отказ обвязка также превращает в исключение. Чтение и запись могут отказать отдельно. If с ! проверяет false, throw прекращает программу сообщением; clear после записи освобождает ресурсы. В веб-обработчике перехватите исключение и покажите понятный отказ без внутренних путей. Возвращаемое true не подтверждает художественное качество или удаление шума.

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

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

require __DIR__ . '/adaptive-fixture.php';
$source = loadAdaptiveSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
$quantum = Imagick::getQuantumRange()['quantumRangeLong'];
if (!$image->selectiveBlurImage(0, 1.2, $quantum * 0.05)) {
    throw new RuntimeException('Не удалось применить selectiveBlurImage');
}
saveAdaptiveComparison([$source, $image], 'selective-blur-basic.png');
$source->clear();
$image->clear();

Результат: Справа selective blur с порогом 0.05×QuantumRange=3276.75 в Q16. Соседи с меньшим различием интенсивности могут участвовать в среднем, с большим не участвуют. Стандартное отклонение R на ровном участке уменьшилось с 7.03 до 4.24 уровня PNG8; две контрольные точки перепада остались 60/196. Это измерение двух точек, а не доказательство точного сохранения любого контура. Архив содержит example.php, adaptive-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске; итоговый PNG откройте обычным просмотрщиком. Первая панель — исходник, далее варианты в указанном порядке. Размер PNG 800×320; каждая панель 400×320 без изменения масштаба. Подписи исходного растра не пересчитываются фильтром.

Ожидаемый вывод
selective-blur-basic.png

Практическая задача: Выбрать компромисс между зернистостью и слабой деталью

На ровном участке есть слабый прямоугольник всего на 8 уровней светлее основы. Сравним строгий допуск 2% диапазона с 12%: более широкий допуск позволяет смешивать больше различающихся соседей, но может сгладить нужную слабую деталь.

Обе копии получены из $source: второй опыт не продолжает первый. Изменён только threshold, radius/sigma остаются 0/1.2. Сравнивайте разброс на ровной части шума и видимость прямоугольника +8 отдельно от сильной границы 60/196. Уменьшив шум, можно одновременно убрать полезное различие.

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

require __DIR__ . '/adaptive-fixture.php';
$source = loadAdaptiveSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
$quantum = Imagick::getQuantumRange()['quantumRangeLong'];
if (!$image->selectiveBlurImage(0, 1.2, $quantum * 0.02)) {
    throw new RuntimeException('Не удалось применить selectiveBlurImage');
}
$looser = clone $source;
if (!$looser->selectiveBlurImage(0, 1.2, $quantum * 0.12)) {
    throw new RuntimeException('Не удалось применить selectiveBlurImage');
}
saveAdaptiveComparison([$source, $image, $looser], 'selective-blur-thresholds.png');
$source->clear();
$image->clear();
$looser->clear();

Результат: Панели: исходник, threshold=1310.7 (2% Q16), threshold=7864.2 (12% Q16). Варианты различаются пикселями и разбросом на известном шумовом участке; слабую деталь рассматривайте вместе с шумом. Радиус и sigma одинаковы, поэтому сравнение показывает именно допуск интенсивности, а не смену площади ядра. Архив содержит example.php, adaptive-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске; итоговый PNG откройте обычным просмотрщиком. Первая панель — исходник, далее варианты в указанном порядке. Размер PNG 1200×320; каждая панель 400×320 без изменения масштаба. Подписи исходного растра не пересчитываются фильтром.

Ожидаемый вывод
selective-blur-thresholds.png

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

Threshold=0 не включает даже равную интенсивность из-за строгого <; когда сумма весов почти нулевая, C сохраняет исходный канал. В preflight 0 и literal 0.05 дали неизменённый образец, 0.05×QuantumRange изменил его. Ровно QuantumRange не включает разность, строго равную этому максимуму: нельзя без условий обещать полный Gaussian. Больший допуск способен стереть слабую полезную деталь; это осознанный компромисс.

Для приложения выбирайте конечные radius≥0 и sigma>0 с верхними пределами по разрешению; selective threshold ограничьте осмысленной долей диапазона, motion angle — понятным диапазоном градусов. Это политика приложения, не обещание полной валидации Imagick. Большая окрестность и adaptive-карта стоят памяти и времени: ограничьте площадь, число кадров и число копий, измерьте свою нагрузку. Сравнительной гарантии скорости здесь нет.

В preflight явный CHANNEL_RED у всех четырёх методов сохранил G/B. Канал — составляющая всего растра; несколько флагов объединяются |, например Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE. Uniform alpha=50% сохранилась в ограниченном опыте с default и RGB-маской, но это не проверка прозрачного края и не общая гарантия alpha. Основные программы работают с непрозрачным sRGB PNG; произвольная alpha, ICC/CMYK, HDR и кадры требуют отдельной проверки.

Связанные методы: adaptiveBlurImage · adaptiveSharpenImage · motionBlurImage. Предыдущий шаг: обычное размытие, резкость и unsharp mask; для диапазона: нормализация и хвосты гистограммы.

Imagick::motionBlurImageНужен оформительский след выбранного направления, например отдельный вариант баннера с движением.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::motionBlurImage(float $radius, float $sigma, float $angle, int $channel = Imagick::CHANNEL_DEFAULT): bool

Нужен оформительский след выбранного направления, например отдельный вариант баннера с движением.

Фактические следы белого импульса при 0°, 90° и 45° на одном исходнике
Фактические следы белого импульса при 0°, 90° и 45° на одном исходнике

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

В $image загружена отдельная копия. Три аргумента: автоматический радиус 0, sigma=3 пикселя и угол 0 градусов. Это горизонтальное направление оператора; контрольный импульс покажет фактическую сторону следа. Channel пропущен. Стрелка вызывает метод объекта, круглые скобки содержат аргументы, запятые их отделяют, точка с запятой завершает команду. Для сохранения оригинала до вызова создайте $image = clone $source; простое присваивание не копирует объект.

$image->motionBlurImage(0, 3, 0);

Это пояснение ядра. Полная программа ниже также загрузит вход, задаст virtual pixels, проверит возврат и запишет PNG. Подготовка: объект и метод, clone, массив и ключ.

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

Imagick::motionBlurImage(float $radius, float $sigma, float $angle, int $channel = Imagick::CHANNEL_DEFAULT): bool

Метод сворачивает изображение направленным Gaussian-оператором. Radius/sigma задают масштаб в пикселях, angle — угол в градусах. В проверенной реализации исходный импульс при 0° оставил горизонтальный след влево, при 90° вверх, при 45° вверх-влево. Размеры остаются прежними, поэтому часть следа у рамки зависит от virtual pixels.

АргументСмысл, единицы и default
$radiusОбязательный float: радиус в пикселях без центрального пикселя. Официальное описание рекомендует radius больше sigma для разумного явного ядра; 0 разрешает автоматический выбор.
$sigmaОбязательный float: стандартное отклонение Gaussian в пикселях. В примерах 3.
$angleОбязательный float: угол размытия в градусах, не в радианах. Примеры 0, 90 и 45; PHP-wrapper не пересчитывает эту величину.
$channelНеобязательный int, default Imagick::CHANNEL_DEFAULT. Несколько констант объединяются |. По официальному ограничению channel влияет при сборке с ImageMagick 6.4.4 или новее; старая ветвь вызывает метод без канала.

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

Результат bool: true при успехе. Метод меняет пиксели текущего Imagick; $ok = $image->motionBlurImage(...) сохранит флаг, не новую картинку. Обязательность и default приведены в исходной сигнатуре выше. Доступность PHP Manual: PECL imagick 2, PECL imagick 3.

Channel влияет начиная с ImageMagick 6.4.4; точный PHP-wrapper использует канальную ветвь при MagickLibVersion >0x643. В более старой ветви этот аргумент игнорируется.

В проверенной версии пустой Imagick даёт ImagickException; native-отказ обвязка также превращает в исключение. Чтение и запись могут отказать отдельно. If с ! проверяет false, throw прекращает программу сообщением; clear после записи освобождает ресурсы. В веб-обработчике перехватите исключение и покажите понятный отказ без внутренних путей. Возвращаемое true не подтверждает художественное качество или удаление шума.

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

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

require __DIR__ . '/adaptive-fixture.php';
$source = loadAdaptiveSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->motionBlurImage(0, 3, 0)) {
    throw new RuntimeException('Не удалось применить motionBlurImage');
}
saveAdaptiveComparison([$source, $image], 'motion-blur-basic.png');
$source->clear();
$image->clear();

Результат: Справа имитация движения с radius=0, sigma=3 пикселя и angle=0°. В контрольной области белый импульс растянут горизонтально влево от исходного положения. Размер изображения сохраняется; это добавление следа, а не исправление уже смазанной фотографии. Архив содержит example.php, adaptive-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске; итоговый PNG откройте обычным просмотрщиком. Первая панель — исходник, далее варианты в указанном порядке. Размер PNG 800×320; каждая панель 400×320 без изменения масштаба. Подписи исходного растра не пересчитываются фильтром.

Ожидаемый вывод
motion-blur-basic.png

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

Оформительский вариант баннера должен иметь выбранное направление следа. Сравниваем 90° и 45° при одинаковом масштабе размытия на независимых копиях; белая контрольная точка делает направление видимым.

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

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

require __DIR__ . '/adaptive-fixture.php';
$source = loadAdaptiveSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->motionBlurImage(0, 3, 90)) {
    throw new RuntimeException('Не удалось применить motionBlurImage');
}
$diagonal = clone $source;
if (!$diagonal->motionBlurImage(0, 3, 45)) {
    throw new RuntimeException('Не удалось применить motionBlurImage');
}
saveAdaptiveComparison([$source, $image, $diagonal], 'motion-blur-angles.png');
$source->clear();
$image->clear();
$diagonal->clear();

Результат: Панели: исходник, 90° с вертикальным следом вверх, 45° со следом вверх-влево. Направления относятся к этой реализации и нашим координатам: x растёт вправо, y вниз. Угол описывает оператор размытия; он не доказывает направление реального движения предмета или камеры. Архив содержит example.php, adaptive-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске; итоговый PNG откройте обычным просмотрщиком. Первая панель — исходник, далее варианты в указанном порядке. Размер PNG 1200×320; каждая панель 400×320 без изменения масштаба. Подписи исходного растра не пересчитываются фильтром.

Ожидаемый вывод
motion-blur-angles.png

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

Это добавление смаза, а не deblur. Направление следа оператора не устанавливает реальное направление движения на фотографии. Соседние пиксели за рамкой берутся по virtual-pixel policy: EDGE и TILE дали разные результаты на контрольном preflight. Большая sigma может скрыть надпись; не применяйте эффект к единственному оригиналу.

Для приложения выбирайте конечные radius≥0 и sigma>0 с верхними пределами по разрешению; selective threshold ограничьте осмысленной долей диапазона, motion angle — понятным диапазоном градусов. Это политика приложения, не обещание полной валидации Imagick. Большая окрестность и adaptive-карта стоят памяти и времени: ограничьте площадь, число кадров и число копий, измерьте свою нагрузку. Сравнительной гарантии скорости здесь нет.

В preflight явный CHANNEL_RED у всех четырёх методов сохранил G/B. Канал — составляющая всего растра; несколько флагов объединяются |, например Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE. Uniform alpha=50% сохранилась в ограниченном опыте с default и RGB-маской, но это не проверка прозрачного края и не общая гарантия alpha. Основные программы работают с непрозрачным sRGB PNG; произвольная alpha, ICC/CMYK, HDR и кадры требуют отдельной проверки.

Связанные методы: adaptiveBlurImage · adaptiveSharpenImage · selectiveBlurImage. Предыдущий шаг: обычное размытие, резкость и unsharp mask; для диапазона: нормализация и хвосты гистограммы.

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

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

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

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

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