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

Дерево руководства
Глава 424 · После первых изображений, объектов и clone
Gmagick: размытие движения, рассыпание пикселей и шум
Выбрать направление смаза, различить перемещение пикселей и добавленный шум, обработать недоступный radial API.
Сравнить горизонтальный и вертикальный смаз
Промо-изображению нужно ощущение движения. motionBlurImage растягивает границы в заданном направлении: при 0° на наших PNG след горизонтальный, при 90° вертикальный. Это намеренное размытие готовой картинки, а не исправление смаза камеры.



$source = new Gmagick("effects.ppm");
$motion = clone $source;
$motion->motionBlurImage(0, 5, 90);
$motion->setImageFormat("PNG"); $motion->writeImage("vertical-motion.png");Три аргумента — radius в пикселях без центра, sigma в пикселях и angle в градусах. Радиус 0 включает автоматический выбор. При ручном выборе PHP.net рекомендует radius больше sigma. В отличие от похожих интерфейсов других расширений, у этого Gmagick-метода ровно три аргумента; четвёртый channel в полной программе намеренно проверяется и вызывает ArgumentCountError. Здесь работаем с непрозрачной схемой, поэтому не обещаем поведение альфа-канала по примеру другой библиотеки.
<?php
declare(strict_types=1);
require __DIR__.'/gm99-effects-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/effects.ppm');$horizontal=clone $source;$horizontal->motionBlurImage(0,5,0);
$vertical=clone $source;$vertical->motionBlurImage(0,5,90);
gmPng($source,'gm99-fx-motion-before.png');gmPng($horizontal,'gm99-fx-motion-horizontal.png');gmPng($vertical,'gm99-fx-motion-vertical.png');
$errors=['extra_channel'=>gmTry(fn()=>(clone $source)->motionBlurImage(0,5,0,Gmagick::CHANNEL_RED))];
gmReport('gm99-fx-motion',["gmagick.motionblurimage"],["gm99-fx-motion-before.png", "gm99-fx-motion-horizontal.png", "gm99-fx-motion-vertical.png"],['horizontal_changes'=>$horizontal->getImageSignature()!==$source->getImageSignature(),'directions_differ'=>$horizontal->getImageSignature()!==$vertical->getImageSignature()],$errors??[],[],['gmagick.motionblurimage'=>'applied']);
echo "motion: angles=0,90 directions=different fourth-argument=caught\n";
Ожидаемый результат
motion: angles=0,90 directions=different fourth-argument=caught
Полная программа восстановит effects.ppm из вложенных байтов с проверкой SHA256. Запустите php example.php в распакованной папке. gmPng сохраняет копию в PNG8; gmRgb читает три нормализованных компонента через getColorValue; gmReport сохраняет реальные результаты и проверки в metrics.json. make-effects-input.py содержит самостоятельный авторский алгоритм схемы без внешних изображений. Результаты PNG появятся после выполнения.
Ожидаются два различных направления следа при одинаковом входе и sigma. Упражнение: угол остался 90°, но миниатюра стала вдвое меньше. Решение: заново подобрать sigma в пикселях конечного изображения, иначе относительная сила смаза изменится. Сохраняйте исходник: повторный вызов на уже размытой копии накапливает обработку.
Дальше по задаче: эскиз, фактура и край, движение и случайные эффекты, деформация и соляризация, сохранение и проверка формата.
Явно обработать недоступное круговое размытие
В нашей GraphicsMagick 1.3.42 круговое размытие radialBlurImage не реализовано: вызов заканчивается GmagickException с сообщением Wand API not implemented. Нужна понятная политика отказа. Этот пример сохраняет исходник и, только как заранее разрешённый другой художественный результат, делает линейный motionBlurImage. Подпись под PNG прямо называет эту замену.


$source = new Gmagick("effects.ppm");
$copy = clone $source;
try { $copy->radialBlurImage(12); }
catch (GmagickException $error) {
if (!str_contains($error->getMessage(), "Wand API not implemented")) { throw $error; }
$copy = clone $source;
$copy->motionBlurImage(0, 5, 0);
}Официальный контракт принимает угол в градусах и необязательный channel. Наличие метода и Reflection-сигнатуры не доказывает, что библиотека умеет выполнить операцию. Проверены вызовы с углом 12, с CHANNEL_RED и даже 0: все три отказали. В текущем C расширения старые GraphicsMagick вызываются через API без выбора канала; поскольку само API здесь не реализовано, обещать работающий отдельный канал нельзя. Полная программа проверяет конкретную ожидаемую ошибку и неизменность неудачной копии.
<?php
declare(strict_types=1);
require __DIR__.'/gm99-effects-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/effects.ppm');$attempt=clone $source;
$errors=['radial'=>gmTry(fn()=>$attempt->radialBlurImage(12))];
if($errors['radial']['ok']||!str_contains($errors['radial']['message'],'Wand API not implemented'))throw new LogicException('Runtime changed: review the radial contract');
// The product explicitly accepts LINEAR blur as a different visual treatment.
$fallback=clone $source;$fallback->motionBlurImage(0,5,0);
gmPng($source,'gm99-fx-radial-fallback-before.png');gmPng($fallback,'gm99-fx-radial-fallback-linear.png');
gmReport('gm99-fx-radial-fallback',["gmagick.radialblurimage", "gmagick.motionblurimage"],["gm99-fx-radial-fallback-before.png", "gm99-fx-radial-fallback-linear.png"],['radial_did_not_change_image'=>$attempt->getImageSignature()===$source->getImageSignature(),'fallback_changes'=>$fallback->getImageSignature()!==$source->getImageSignature()],$errors??[],['required_effect'=>'radial','delivered_effect'=>'linear motion; separately accepted alternative'],['gmagick.radialblurimage'=>'unavailable_exception','gmagick.motionblurimage'=>'applied']);
echo "radial: unavailable exception=caught fallback=explicit-linear-motion\n";
Ожидаемый результат
radial: unavailable exception=caught fallback=explicit-linear-motion
Полная программа восстановит effects.ppm из вложенных байтов с проверкой SHA256. Запустите php example.php в распакованной папке. gmPng сохраняет копию в PNG8; gmRgb читает три нормализованных компонента через getColorValue; gmReport сохраняет реальные результаты и проверки в metrics.json. make-effects-input.py содержит самостоятельный авторский алгоритм схемы без внешних изображений. Результаты PNG появятся после выполнения.
Ожидаемый stdout сообщает unavailable и explicit-linear-motion. Если нужен именно круговой смаз, выбирайте проверенный маршрут Imagick::rotationalBlurImage ниже; линейный PNG не является его эквивалентом. Упражнение: заменить любую ошибку фильтра запасным эффектом. Решение: так делать нельзя — повреждённый вход и отсутствие памяти должны дойти до обработчика; здесь допускается только известная ошибка отсутствующего API.
Если нужен именно круговой смаз, откройте проверенный пример: исходник и углы 8°/20°. Там есть реальные PNG и самостоятельная скачиваемая программа для другого расширения Imagick. Короткая форма современного вызова:
$image = new Imagick("input.png");
$image->rotationalBlurImage(8.0);
$image->setImageFormat("png");
$image->writeImage("rotational.png");Этот фрагмент — маршрут к уже проверенной реализации, а не вызов Gmagick. Подробный контракт: Imagick::rotationalBlurImage.
Дальше по задаче: эскиз, фактура и край, движение и случайные эффекты, деформация и соляризация, сохранение и проверка формата.
Рассыпать границы без добавления новых цветов
Для фактурной рекламной подложки можно случайно переместить соседние пиксели. spreadImage не усредняет их как размытие и не добавляет зерно к каждому цвету: он выбирает пиксели из окрестности. Под нашими реальными PNG указаны радиусы 3 и 6; у большего радиуса зона рассыпанной границы шире.



$source = new Gmagick("effects.ppm");
$scattered = clone $source;
$scattered->spreadImage(3);
$scattered->setImageFormat("PNG"); $scattered->writeImage("scattered.png");radius определяет размер окрестности выбора. PHP принимает float; для понятной пиксельной политики здесь используем небольшие положительные целые значения. Исходные цвета переносятся, поэтому на данном входе число разных цветов не увеличивается. Полная программа проверяет изменение растра, границы размера и эту инвариантную характеристику; конкретное размещение точек между запусками не фиксируется. SHA256 записанного файла нужен для проверки именно этого артефакта, а не как обещание повторить случайный рисунок.
<?php
declare(strict_types=1);
require __DIR__.'/gm99-effects-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/effects.ppm');$small=clone $source;$small->spreadImage(3);
$large=clone $source;$large->spreadImage(6);
gmPng($source,'gm99-fx-spread-before.png');gmPng($small,'gm99-fx-spread-radius3.png');gmPng($large,'gm99-fx-spread-radius6.png');
$colors=[$source->getImageColors(),(new Gmagick(__DIR__.'/gm99-fx-spread-radius3.png'))->getImageColors(),(new Gmagick(__DIR__.'/gm99-fx-spread-radius6.png'))->getImageColors()];
gmReport('gm99-fx-spread',["gmagick.spreadimage"],["gm99-fx-spread-before.png", "gm99-fx-spread-radius3.png", "gm99-fx-spread-radius6.png"],['small_changes'=>$small->getImageSignature()!==$source->getImageSignature(),'large_changes'=>$large->getImageSignature()!==$source->getImageSignature(),'palette_not_expanded'=>$colors[1]<=$colors[0]&&$colors[2]<=$colors[0]],$errors??[],['unique_colors'=>$colors,'fixed_output_hash_promised'=>false],['gmagick.spreadimage'=>'applied']);
echo "spread: radius=3,6 changed=yes palette-not-expanded random-pixels=yes\n";
Ожидаемый результат
spread: radius=3,6 changed=yes palette-not-expanded random-pixels=yes
Полная программа восстановит effects.ppm из вложенных байтов с проверкой SHA256. Запустите php example.php в распакованной папке. gmPng сохраняет копию в PNG8; gmRgb читает три нормализованных компонента через getColorValue; gmReport сохраняет реальные результаты и проверки в metrics.json. make-effects-input.py содержит самостоятельный авторский алгоритм схемы без внешних изображений. Результаты PNG появятся после выполнения. Случайные пиксели могут отличаться в следующем запуске; stdout и проверяемые свойства фиксированы, побайтное повторение не обещается.
Сохранённые картинки показывают один состоявшийся запуск. Упражнение: получить совершенно тот же фон завтра. Решение: хранить готовый PNG, а не рассчитывать на повторное совпадение случайного фильтра. Радиус больше не означает, что каждый отдельный пиксель обязательно уйдёт дальше: это граница области случайного выбора.
Дальше по задаче: эскиз, фактура и край, движение и случайные эффекты, деформация и соляризация, сохранение и проверка формата.
Выбрать тип зерна, а не выдуманный процент
Сравним два вида добавленного зерна. addNoiseImage меняет значения цветов; на схеме появляются новые оттенки. В нашей сборке NOISE_UNIFORM выглядит мелким зерном, NOISE_GAUSSIAN — заметным цветным шумом. Это реальные варианты данного запуска, а не универсальная шкала силы в процентах.



$source = new Gmagick("effects.ppm");
$grain = clone $source;
$grain->addNoiseImage(Gmagick::NOISE_UNIFORM);
$grain->setImageFormat("PNG"); $grain->writeImage("grain.png");Единственный аргумент int noise_type выбирает распределение из констант NOISE_*. Число 10 здесь не означает 10% шума: произвольный код перечисления не надо отправлять библиотеке. В публичном методе нет отдельного параметра интенсивности или seed. Полная программа сравнивает исходник с двумя результатами и проверяет появление дополнительных значений цвета. Это не тест качества фотографии и не обещание одинакового SHA при повторном запуске.
<?php
declare(strict_types=1);
require __DIR__.'/gm99-effects-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/effects.ppm');$uniform=clone $source;$uniform->addNoiseImage(Gmagick::NOISE_UNIFORM);
$gaussian=clone $source;$gaussian->addNoiseImage(Gmagick::NOISE_GAUSSIAN);
gmPng($source,'gm99-fx-noise-before.png');gmPng($uniform,'gm99-fx-noise-uniform.png');gmPng($gaussian,'gm99-fx-noise-gaussian.png');
$counts=[$source->getImageColors(),(new Gmagick(__DIR__.'/gm99-fx-noise-uniform.png'))->getImageColors(),(new Gmagick(__DIR__.'/gm99-fx-noise-gaussian.png'))->getImageColors()];
gmReport('gm99-fx-noise',["gmagick.addnoiseimage"],["gm99-fx-noise-before.png", "gm99-fx-noise-uniform.png", "gm99-fx-noise-gaussian.png"],['uniform_changes'=>$uniform->getImageSignature()!==$source->getImageSignature(),'gaussian_changes'=>$gaussian->getImageSignature()!==$source->getImageSignature(),'new_color_values'=>$counts[1]>$counts[0]&&$counts[2]>$counts[0]],$errors??[],['unique_colors'=>$counts,'fixed_output_hash_promised'=>false],['gmagick.addnoiseimage'=>'applied']);
echo "noise: uniform gaussian changed=yes extra-colors=yes fixed-seed=no\n";
Ожидаемый результат
noise: uniform gaussian changed=yes extra-colors=yes fixed-seed=no
Полная программа восстановит effects.ppm из вложенных байтов с проверкой SHA256. Запустите php example.php в распакованной папке. gmPng сохраняет копию в PNG8; gmRgb читает три нормализованных компонента через getColorValue; gmReport сохраняет реальные результаты и проверки в metrics.json. make-effects-input.py содержит самостоятельный авторский алгоритм схемы без внешних изображений. Результаты PNG появятся после выполнения. Случайные пиксели могут отличаться в следующем запуске; stdout и проверяемые свойства фиксированы, побайтное повторение не обещается.
Упражнение: интерфейс сервиса предлагает «мелкое зерно» и «цветной шум». Решение: сопоставьте эти названия проверенным константам в белом списке и покажите реальные превью; не выдавайте константу за процент. Если требуется точная регулируемая амплитуда, этот однопараметрический метод сам по себе её не предоставляет.
Дальше по задаче: эскиз, фактура и край, движение и случайные эффекты, деформация и соляризация, сохранение и проверка формата.
Применить политику каталога при отказе фильтра
Каталогу нужен явный договор: строгий заказ кругового эффекта должен закончиться понятным отказом, а промо-шаблон может разрешить линейную замену. Функция возвращает не только изображение, но и имя фактически сделанной обработки. Так картинка не получит ложную подпись «radial».


$source = new Gmagick("effects.ppm");
$allowLinear = true;
[$preview, $delivered] = promoTreatment($source, $allowLinear);
$preview->setImageFormat("PNG"); $preview->writeImage("promo.png");
echo $delivered;Функция promoTreatment полностью приведена ниже. bool $allowLinear — решение вызывающего кода, а не скрытое свойство изображения. При false известное отсутствие radial API превращается в понятный RuntimeException; при true создаётся свежая копия и выполняется motionBlurImage(0,5,90). Вторая часть массива содержит строку linear-motion. Вызов radial с CHANNEL_RED не превращает неработающее API в рабочее и не проверяет изоляцию красного канала.
<?php
declare(strict_types=1);
require __DIR__.'/gm99-effects-fixture.php';
gmRestore();
function promoTreatment(Gmagick $source,bool $allowLinear):array {
$copy=clone $source;
try{$copy->radialBlurImage(12,Gmagick::CHANNEL_RED);return [$copy,'radial'];}
catch(GmagickException $e){
if(!str_contains($e->getMessage(),'Wand API not implemented'))throw $e;
if(!$allowLinear)throw new RuntimeException('Circular blur required; use the tested Imagick route',0,$e);
$copy=clone $source;$copy->motionBlurImage(0,5,90);return [$copy,'linear-motion'];
}
}
$source=new Gmagick(__DIR__.'/effects.ppm');$errors=['strict_policy'=>gmTry(fn()=>promoTreatment($source,false))];
[$result,$delivered]=promoTreatment($source,true);
gmPng($source,'gm99-fx-motion-policy-before.png');gmPng($result,'gm99-fx-motion-policy-linear.png');
gmReport('gm99-fx-motion-policy',["gmagick.radialblurimage", "gmagick.motionblurimage"],["gm99-fx-motion-policy-before.png", "gm99-fx-motion-policy-linear.png"],['delivered_is_named_honestly'=>$delivered==="linear-motion",'fallback_changes'=>$result->getImageSignature()!==$source->getImageSignature()],$errors??[],['delivered_effect'=>$delivered,'radial_success'=>false],['gmagick.radialblurimage'=>'unavailable_exception','gmagick.motionblurimage'=>'applied']);
echo "policy: strict=rejected accepted-alternative=linear-motion circular=unavailable\n";
Ожидаемый результат
policy: strict=rejected accepted-alternative=linear-motion circular=unavailable
Полная программа восстановит effects.ppm из вложенных байтов с проверкой SHA256. Запустите php example.php в распакованной папке. gmPng сохраняет копию в PNG8; gmRgb читает три нормализованных компонента через getColorValue; gmReport сохраняет реальные результаты и проверки в metrics.json. make-effects-input.py содержит самостоятельный авторский алгоритм схемы без внешних изображений. Результаты PNG появятся после выполнения.
Ожидается отказ строгой политики и успешный линейный вариант разрешённой политики. Если сборка изменится и настоящий radial заработает, контракт результата нужно пересмотреть, а не продолжать сообщать unavailable. Упражнение: заказчик запрещает любые замены. Решение: передать false и предложить ему отдельный маршрут с рабочим Imagick, не публикуя запасную картинку под чужим названием.
Если нужен именно круговой смаз, откройте проверенный пример: исходник и углы 8°/20°. Там есть реальные PNG и самостоятельная скачиваемая программа для другого расширения Imagick. Короткая форма современного вызова:
$image = new Imagick("input.png");
$image->rotationalBlurImage(8.0);
$image->setImageFormat("png");
$image->writeImage("rotational.png");Этот фрагмент — маршрут к уже проверенной реализации, а не вызов Gmagick. Подробный контракт: Imagick::rotationalBlurImage.
Дальше по задаче: эскиз, фактура и край, движение и случайные эффекты, деформация и соляризация, сохранение и проверка формата.
Собрать фактурный фон с белым списком эффектов
Соберём два фона для промо: зернистый и с рассыпанными краями. В первом применяется NOISE_LAPLACIAN, во втором spread(3), затем мелкий NOISE_UNIFORM. Исходник один; варианты делаются из независимых копий. Функция принимает только понятные имена двух рецептов.



$source = new Gmagick("effects.ppm");
$background = clone $source;
$background->spreadImage(3);
$background->addNoiseImage(Gmagick::NOISE_UNIFORM);
$background->setImageFormat("PNG"); $background->writeImage("promo-background.png");Здесь два действия выполняют разную работу: spread меняет расположение выборок, addNoise меняет значения каналов. Функция roughBackground ниже фиксирует порядок и отклоняет неизвестные имена до вызова библиотеки. Это политика нашего каталога, а не гарантированный список допустимых строк расширения. Проверяем изменение изображения и сохранность источника; вид точек остаётся случайным. Читаемый текст и логотип для реального баннера следует накладывать после фонового эффекта.
<?php
declare(strict_types=1);
require __DIR__.'/gm99-effects-fixture.php';
gmRestore();
function roughBackground(Gmagick $source,string $texture):Gmagick {
if(!in_array($texture,['grain','scattered'],true))throw new InvalidArgumentException('Choose grain or scattered');
$copy=clone $source;
if($texture==='grain'){$copy->addNoiseImage(Gmagick::NOISE_LAPLACIAN);}
else{$copy->spreadImage(3);$copy->addNoiseImage(Gmagick::NOISE_UNIFORM);}
return $copy;
}
$source=new Gmagick(__DIR__.'/effects.ppm');$before=$source->getImageSignature();
$grain=roughBackground($source,'grain');$scattered=roughBackground($source,'scattered');
gmPng($source,'gm99-fx-rough-background-before.png');gmPng($grain,'gm99-fx-rough-background-grain.png');gmPng($scattered,'gm99-fx-rough-background-scattered.png');
$errors=['unknown_texture'=>gmTry(fn()=>roughBackground($source,'999'))];
gmReport('gm99-fx-rough-background',["gmagick.spreadimage", "gmagick.addnoiseimage"],["gm99-fx-rough-background-before.png", "gm99-fx-rough-background-grain.png", "gm99-fx-rough-background-scattered.png"],['grain_changes'=>$grain->getImageSignature()!==$before,'scattered_changes'=>$scattered->getImageSignature()!==$before,'source_kept'=>$source->getImageSignature()===$before],$errors??[],['fixed_output_hash_promised'=>false],['gmagick.spreadimage'=>'applied','gmagick.addnoiseimage'=>'applied']);
echo "texture: grain scattered changed=yes source=kept unknown=rejected\n";
Ожидаемый результат
texture: grain scattered changed=yes source=kept unknown=rejected
Полная программа восстановит effects.ppm из вложенных байтов с проверкой SHA256. Запустите php example.php в распакованной папке. gmPng сохраняет копию в PNG8; gmRgb читает три нормализованных компонента через getColorValue; gmReport сохраняет реальные результаты и проверки в metrics.json. make-effects-input.py содержит самостоятельный авторский алгоритм схемы без внешних изображений. Результаты PNG появятся после выполнения. Случайные пиксели могут отличаться в следующем запуске; stdout и проверяемые свойства фиксированы, побайтное повторение не обещается.
Упражнение: пользователь снова нажал «скачать» и ожидает тот же фон. Решение: отдавать уже сохранённый результат выбранного варианта. При новом запуске создавайте отдельную версию артефакта. Не применяйте несколько случайных проходов только ради совпадения с показанным образцом — такого совпадения метод не обещает.
Дальше по задаче: эскиз, фактура и край, движение и случайные эффекты, деформация и соляризация, сохранение и проверка формата.
Из реальной задачи разработчика
Generate noisy image using Node.js. Автор Node.js/GraphicsMagick перепутал шум с фильтром по радиусу и хочет задавать силу шума. Разделяем две задачи: spreadImage перемещает выборки, addNoiseImage принимает тип распределения. В Gmagick у addNoiseImage нет аргумента процента интенсивности; показываем реальные UNIFORM/GAUSSIAN и белый список двух рецептов, не выдавая произвольное число за процент. Для точного повторного скачивания сохраняем готовый PNG.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Gmagick::addnoiseimageДобавить шум выбранного распределения
PECL gmagick >= Unknown · gmagick
Gmagick::addnoiseimage(int $noise_type): GmagickДобавляет случайный шум к изображению и возвращает Gmagick. Единственный обязательный int noise_type выбирает константу: NOISE_UNIFORM, NOISE_GAUSSIAN, NOISE_MULTIPLICATIVEGAUSSIAN, NOISE_IMPULSE, NOISE_LAPLACIAN или NOISE_POISSON. Это тип распределения, не процент силы. У публичной сигнатуры нет отдельного параметра амплитуды или начального seed; произвольные числа из формы не являются безопасным способом регулировки. Полные программы используют только белый список именованных режимов, подтверждают изменение и читают новые значения цветов из сохранённых PNG. Конкретный рисунок случайных точек между запусками не фиксируется.
Gmagick::addnoiseimage(int $noise_type): Gmagick| Параметр | Тип и обязательность | Смысл |
|---|---|---|
| $noise_type | int; обязательный | Именованная константа типа шума, не процент. |
Официальная ошибка метода — GmagickException. Ошибка PHP-типа может быть TypeError; нарушение прикладного диапазона в наших функциях намеренно даёт InvalidArgumentException до библиотечного вызова. Эти прикладные ограничения не объявляются проверками самого расширения.
Два применения: Выбрать тип зерна, а не выдуманный процент; Собрать фактурный фон с белым списком эффектов.
Отметка доступности PHP.net: PECL gmagick >= Unknown. Unknown не задаёт известную минимальную версию. Наше окружение: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; фактические границы указаны выше.
Gmagick::motionblurimageСоздать направленный линейный смаз
PECL gmagick >= Unknown · gmagick
Gmagick::motionblurimage(float $radius, float $sigma, float $angle): GmagickИмитирует смаз движения гауссовой свёрткой. Обязательные float radius и sigma задаются в пикселях; radius не считает центральный пиксель. Рекомендуется radius больше sigma, либо 0 для автоматического выбора. float angle задаёт угол движения в градусах. Возвращает Gmagick. Сигнатура этого метода имеет ровно три аргумента: дополнительного channel нет, в нашем runtime четвёртый аргумент даёт ArgumentCountError. Направленное размытие не эквивалентно круговому и не является восстановлением резкости. Подбирайте sigma при конечном размере изображения.
Gmagick::motionblurimage(float $radius, float $sigma, float $angle): Gmagick| Параметр | Тип и обязательность | Смысл |
|---|---|---|
| $radius | float; обязательный | Радиус гауссовой окрестности в пикселях, без центра;0 — автоподбор. |
| $sigma | float; обязательный | Стандартное отклонение в пикселях. |
| $angle | float; обязательный | Угол направления размытия в градусах. |
Официальная ошибка метода — GmagickException. Ошибка PHP-типа может быть TypeError; нарушение прикладного диапазона в наших функциях намеренно даёт InvalidArgumentException до библиотечного вызова. Эти прикладные ограничения не объявляются проверками самого расширения.
Два применения: Сравнить горизонтальный и вертикальный смаз; Применить политику каталога при отказе фильтра.
Отметка доступности PHP.net: PECL gmagick >= Unknown. Unknown не задаёт известную минимальную версию. Наше окружение: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; фактические границы указаны выше.
Gmagick::radialblurimageКруговое размытие: API недоступно в проверенной сборке
PECL gmagick >= Unknown · gmagick
Gmagick::radialblurimage(float $angle, int $channel = Gmagick::CHANNEL_DEFAULT): GmagickВ нашей GraphicsMagick 1.3.42 этот метод не выполняет эффект: получен GmagickException «Wand API not implemented ... (MagickRadialBlurImage)». Сначала учитывайте это ограничение. Официальная сигнатура принимает float angle в градусах и необязательный int channel=Gmagick::CHANNEL_DEFAULT, обещая Gmagick с радиальным размытием. Метод существует в Reflection, но это не доказательство рабочей реализации библиотеки. Проверены default, CHANNEL_RED и угол 0: все отказали. В текущем C для старых GM используется вызов без параметра канала; успешная изоляция канала здесь не продемонстрирована. Две самостоятельные программы показывают реальную обработку отказа и отдельно разрешённый motionBlurImage как другой художественный результат. Для именно кругового смаза используйте действующую главу Imagick::rotationalBlurImage с сохранёнными PNG и скачиваемой программой.
Gmagick::radialblurimage(float $angle, int $channel = Gmagick::CHANNEL_DEFAULT): Gmagick| Параметр | Тип и обязательность | Смысл |
|---|---|---|
| $angle | float; обязательный | Угол размытия в градусах; рабочий эффект в этой GM-сборке отсутствует. |
| $channel | int; необязательный; default Gmagick::CHANNEL_DEFAULT | Документированный канал; успешная обработка отдельного канала не продемонстрирована. |
Официальная ошибка метода — GmagickException. Ошибка PHP-типа может быть TypeError; нарушение прикладного диапазона в наших функциях намеренно даёт InvalidArgumentException до библиотечного вызова. Эти прикладные ограничения не объявляются проверками самого расширения.
Два применения: Явно обработать недоступное круговое размытие; Применить политику каталога при отказе фильтра.
Отметка доступности PHP.net: PECL gmagick >= Unknown. Unknown не задаёт известную минимальную версию. Наше окружение: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; фактические границы указаны выше.
Если нужен именно круговой смаз, откройте проверенный пример: исходник и углы 8°/20°. Там есть реальные PNG и самостоятельная скачиваемая программа для другого расширения Imagick. Короткая форма современного вызова:
$image = new Imagick("input.png");
$image->rotationalBlurImage(8.0);
$image->setImageFormat("png");
$image->writeImage("rotational.png");Этот фрагмент — маршрут к уже проверенной реализации, а не вызов Gmagick. Подробный контракт: Imagick::rotationalBlurImage.
Gmagick::spreadimageСлучайно переставить пиксели в окрестности
PECL gmagick >= Unknown · gmagick
Gmagick::spreadimage(float $radius): GmagickСлучайно выбирает соседние пиксели в блоке, определённом обязательным float radius. Возвращает Gmagick. Радиус задаёт область выбора, не гарантированное расстояние каждого перемещения; в примерах используются целые 3 и 6. Это отличается от добавления шума к значениям каналов. Наши проверки подтверждают изменение и отсутствие роста палитры, читая статистику заново открытых PNG. Случайная картинка не обязана побайтно повторяться в другом запуске. Для точного повторного скачивания храните уже созданный файл.
Gmagick::spreadimage(float $radius): Gmagick| Параметр | Тип и обязательность | Смысл |
|---|---|---|
| $radius | float; обязательный | Размер окрестности случайного выбора пикселя. |
Официальная ошибка метода — GmagickException. Ошибка PHP-типа может быть TypeError; нарушение прикладного диапазона в наших функциях намеренно даёт InvalidArgumentException до библиотечного вызова. Эти прикладные ограничения не объявляются проверками самого расширения.
Два применения: Рассыпать границы без добавления новых цветов; Собрать фактурный фон с белым списком эффектов.
Отметка доступности PHP.net: PECL gmagick >= Unknown. Unknown не задаёт известную минимальную версию. Наше окружение: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; фактические границы указаны выше.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


