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

Дерево руководства
Глава 412 · После объектов и первых изображений Gmagick
Gmagick: шум, медиана и сохранение деталей
Сопоставить пять фильтров на одинаковом шумном рисунке и выбрать достаточное число этапов.
Отличить общее размытие от enhance
На карточке есть редкие чёрные и белые точки и мелкая зернистость. Этот шум добавлен к нашему рисунку детерминированно; внешняя фотография не нужна. Сравним общее размытие с enhance, рассматривая не только ровный фон, но и границы центральных прямоугольников.



$source = new Gmagick(__DIR__ . "/noise.ppm");
$blur = clone $source;
$blur->blurImage(0, 1.0);
$enhanced = clone $source;
$enhanced->enhanceImage();
$enhanced->setImageFormat("PNG");
$enhanced->writeImage(__DIR__ . "/enhanced.png");Радиус ограничивает соседство пикселей для размытия; sigma задаёт его стандартное отклонение. Радиус 0 позволяет библиотеке выбрать подходящую область. blurImage влияет и на шум, и на полезные границы. enhanceImage — самостоятельный цифровой фильтр шумного изображения, без числовых аргументов. Его название не означает автоматического распознавания товара, текста или «улучшения всего».
<?php
declare(strict_types=1);
require __DIR__.'/gm97-color-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/noise.ppm');
$blur=clone $source;
$blur->blurImage(0,1.0);
$enhanced=clone $source;
$enhanced->enhanceImage();
gm97Png($source,'gm97-clean-soft-before.png');
gm97Png($blur,'gm97-clean-soft-blur.png');
gm97Png($enhanced,'gm97-clean-soft-enhance.png');
$errors=['blur_channel'=>gmTry(fn()=>(new Gmagick(__DIR__.'/noise.ppm'))->blurImage(0,1.0,Gmagick::CHANNEL_RED))];
gmReport('gm97-clean-soft',["blurimage", "enhanceimage", "__construct", "getimagesignature", "setimagedepth", "setimageformat", "writeimage"],["gm97-clean-soft-before.png", "gm97-clean-soft-blur.png", "gm97-clean-soft-enhance.png"],
['blur_changed'=>$blur->getImageSignature()!==$source->getImageSignature(),'enhance_changed'=>$enhanced->getImageSignature()!==$source->getImageSignature(),'filters_differ'=>$blur->getImageSignature()!==$enhanced->getImageSignature()],
$errors ?? [], []);
echo "soft: blur-and-enhance=different png=3 size=320x200\n";
Ожидаемый результат
soft: blur-and-enhance=different png=3 size=320x200
Скачайте и распакуйте example.php, gm97-color-fixture.php и четыре файла .ppm.b64 в одну папку. Запуск: php example.php. Помощник восстанавливает собственные входы, проверяет их SHA256 и записывает metrics.json. Основные методы обработки видны в программе; gm97Png сохраняет копию как PNG8 для просмотра. Источники не перезаписываются. Среда: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.
Три настоящих PNG320×200 показывают исходник и разные результаты. В текущем Gmagick blurImage принимает ровно два аргумента; описанный PHP.net третий channel при передаче дал ArgumentCountError. Упражнение: как сохранить исходник для сравнения? Решение: обработать clone и писать в другой файл. Размывание не возвращает потерянные детали и не гарантирует читаемость букв; результат оценивают в конечном размере публикации.
Связанный шаг: коррекция тонов и сохранение результата с проверкой.
Убрать отдельные точки двумя способами
Крупные одиночные выбросы лучше рассматривать отдельно от слабой зернистости. Сравним подавление точечных помех и фильтр с явно выбранным соседством. Красная и зелёная полосы по краям помогают проверить, не разрушены ли контуры вместе с шумом.



$source = new Gmagick(__DIR__ . "/noise.ppm");
$a = clone $source;
$a->despeckleImage();
$b = clone $source;
$b->reduceNoiseImage(1.0);
$b->setImageFormat("PNG");
$b->writeImage(__DIR__ . "/reduced.png");despeckleImage не принимает настройки и уменьшает точечный шум, стремясь сохранить границы. reduceNoiseImage получает радиус соседства; PHP.net описывает замену пикселя близким по значению соседом и сглаживание контуров с сохранением информации о краях. Для радиуса 0 библиотека подбирает область сама. Ни одно из этих описаний не означает, что тонкие полезные точки гарантированно останутся.
<?php
declare(strict_types=1);
require __DIR__.'/gm97-color-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/noise.ppm');
$despeckled=clone $source;
$despeckled->despeckleImage();
$reduced=clone $source;
$reduced->reduceNoiseImage(1.0);
gm97Png($source,'gm97-clean-impulse-before.png');
gm97Png($despeckled,'gm97-clean-impulse-despeckle.png');
gm97Png($reduced,'gm97-clean-impulse-reduce.png');
gmReport('gm97-clean-impulse',["despeckleimage", "reducenoiseimage", "__construct", "getimagesignature", "setimagedepth", "setimageformat", "writeimage"],["gm97-clean-impulse-before.png", "gm97-clean-impulse-despeckle.png", "gm97-clean-impulse-reduce.png"],
['despeckle_changed'=>$despeckled->getImageSignature()!==$source->getImageSignature(),'reduce_changed'=>$reduced->getImageSignature()!==$source->getImageSignature(),'filters_differ'=>$despeckled->getImageSignature()!==$reduced->getImageSignature()],
$errors ?? [], []);
echo "impulse: despeckle-and-reduce=different png=3 size=320x200\n";
Ожидаемый результат
impulse: despeckle-and-reduce=different png=3 size=320x200
Скачайте и распакуйте example.php, gm97-color-fixture.php и четыре файла .ppm.b64 в одну папку. Запуск: php example.php. Помощник восстанавливает собственные входы, проверяет их SHA256 и записывает metrics.json. Основные методы обработки видны в программе; gm97Png сохраняет копию как PNG8 для просмотра. Источники не перезаписываются. Среда: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.
На нашем входе оба фильтра меняют пиксели и дают разные изображения 320×200. Упражнение: считать ли маленькую точку обязательно шумом? Решение: нет, это может быть буква, фактура или деталь маркировки; алгоритм не знает назначения объекта. Для карточки с текстом сравнивайте читаемость по исходнику, а не только ровность фона. Эффект с похожим названием в графическом редакторе может использовать другой алгоритм и настройки.
Связанный шаг: коррекция тонов и сохранение результата с проверкой.
Сравнить медиану с размытием
Медианный фильтр полезно понять на простом наборе чисел. Для соседних значений 20,21,250 после сортировки середина 21: одиночный большой выброс не становится средним цветом. На реальном двумерном изображении область задаётся радиусом, а обработку выполняет библиотека.



$source = new Gmagick(__DIR__ . "/noise.ppm");
$median = clone $source;
$median->medianFilterImage(1.0);
$blur = clone $source;
$blur->blurImage(0, 1.0);
$median->setImageFormat("PNG");
$median->writeImage(__DIR__ . "/median.png");medianFilterImage(1.0) заменяет пиксели медианой соседства. Числовая модель показывает устойчивость к выбросу, но не обещает точное RGB-вычисление нашего полного фильтра: цветные каналы, края и форма окрестности определяются реализацией. Рядом сохранено размытие с sigma 1, чтобы сравнить контуры одной и той же карточки.
<?php
declare(strict_types=1);
require __DIR__.'/gm97-color-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/noise.ppm');
$median=clone $source;
$returned=$median->medianFilterImage(1.0);
$blur=clone $source;
$blur->blurImage(0,1.0);
gm97Png($source,'gm97-clean-median-before.png');
gm97Png($median,'gm97-clean-median-result.png');
gm97Png($blur,'gm97-clean-median-blur.png');
gmReport('gm97-clean-median',["medianfilterimage", "blurimage", "__construct", "getimagesignature", "setimagedepth", "setimageformat", "writeimage"],["gm97-clean-median-before.png", "gm97-clean-median-result.png", "gm97-clean-median-blur.png"],
['median_changed'=>$median->getImageSignature()!==$source->getImageSignature(),'median_vs_blur'=>$median->getImageSignature()!==$blur->getImageSignature(),'observed_return_object'=>$returned===$median],
$errors ?? [], ['declared_return'=>(string)(new ReflectionMethod('Gmagick','medianFilterImage'))->getReturnType(),'observed_return'=>get_debug_type($returned)]);
echo "median: radius1 changed=yes observed-return=same-object png=3\n";
Ожидаемый результат
median: radius1 changed=yes observed-return=same-object png=3
Скачайте и распакуйте example.php, gm97-color-fixture.php и четыре файла .ppm.b64 в одну папку. Запуск: php example.php. Помощник восстанавливает собственные входы, проверяет их SHA256 и записывает metrics.json. Основные методы обработки видны в программе; gm97Png сохраняет копию как PNG8 для просмотра. Источники не перезаписываются. Среда: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.
Официальная сигнатура и Reflection этой версии говорят void; текст Return Values обещает Gmagick. Фактический вызов вернул тот же объект. Минимальный код намеренно не использует возвращаемое значение и не строит цепочку вызовов: это переносимый способ использовать изменённый объект при таком расхождении. Полная диагностика фиксирует оба факта отдельно. Упражнение: медиана набора 0,120,121. Решение:120; среднее было бы примерно 80.3, это другая операция.
Связанный шаг: коррекция тонов и сохранение результата с проверкой.
Сначала убрать выбросы, затем обработать остаток
Шум бывает смешанным: сначала уберём сильные отдельные выбросы медианой, затем посмотрим, помогает ли enhance на оставшейся зернистости. Промежуточная версия нужна, чтобы второй шаг можно было обоснованно исключить.



$source = new Gmagick(__DIR__ . "/noise.ppm");
$result = clone $source;
$result->medianFilterImage(1.0);
$middle = clone $result;
$result->enhanceImage();
$result->setImageFormat("PNG");
$result->writeImage(__DIR__ . "/cleaned.png");middle сохраняет отдельный снимок состояния после первого фильтра. Затем enhance применяется только к result. Полный пример записывает все три состояния в PNG8. Для каждого соседнего шага проверяется изменение подписи пикселей; такая проверка доказывает действие фильтра, но не автоматически доказывает повышение качества.
<?php
declare(strict_types=1);
require __DIR__.'/gm97-color-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/noise.ppm');
$result=clone $source;
$result->medianFilterImage(1.0);
$median=clone $result;
$result->enhanceImage();
gm97Png($source,'gm97-clean-grain-before.png');
gm97Png($median,'gm97-clean-grain-median.png');
gm97Png($result,'gm97-clean-grain-final.png');
gmReport('gm97-clean-grain',["medianfilterimage", "enhanceimage", "__construct", "getimagesignature", "setimagedepth", "setimageformat", "writeimage"],["gm97-clean-grain-before.png", "gm97-clean-grain-median.png", "gm97-clean-grain-final.png"],
['median_step'=>$median->getImageSignature()!==$source->getImageSignature(),'enhance_step'=>$result->getImageSignature()!==$median->getImageSignature()],
$errors ?? [], []);
echo "grain: median1 then enhance png=3 size=320x200\n";
Ожидаемый результат
grain: median1 then enhance png=3 size=320x200
Скачайте и распакуйте example.php, gm97-color-fixture.php и четыре файла .ppm.b64 в одну папку. Запуск: php example.php. Помощник восстанавливает собственные входы, проверяет их SHA256 и записывает metrics.json. Основные методы обработки видны в программе; gm97Png сохраняет копию как PNG8 для просмотра. Источники не перезаписываются. Среда: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.
На нашем входе второй шаг меняет пиксели, сохраняя геометрию 320×200. Рассмотрите границу светлого центра и фон: решение о втором фильтре принимается по допустимой потере деталей. Упражнение: почему изменение SHA-подписи не равно улучшению? Решение: одинаково изменяют её полезная коррекция и нежелательное размытие. Для воспроизводимости сохраняйте конкретный порядок и исходный файл.
Связанный шаг: коррекция тонов и сохранение результата с проверкой.
Остановиться до потери деталей
Подготовка каталога заканчивается выбором достаточного результата. Здесь сравним одну очистку и ещё один проход с автоматическим радиусом. Второй проход — вариант для оценки, а не обязательная рекомендация обрабатывать каждое изображение всеми фильтрами.



$source = new Gmagick(__DIR__ . "/noise.ppm");
$once = clone $source;
$once->despeckleImage();
$twice = clone $once;
$twice->reduceNoiseImage(0);
$twice->setImageFormat("PNG");
$twice->writeImage(__DIR__ . "/two-steps.png");despeckle выполняется первым. Во втором объекте reduceNoiseImage(0) выбирает подходящее соседство автоматически. Ноль здесь не означает «ничего не делать». При большом изображении и более широком соседстве растёт объём работы; стоимость надо измерять на нужных размерах, а не выводить из скорости нашего маленького образца.
<?php
declare(strict_types=1);
require __DIR__.'/gm97-color-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/noise.ppm');
$once=clone $source;
$once->despeckleImage();
$twice=clone $once;
$twice->reduceNoiseImage(0);
gm97Png($source,'gm97-clean-pipeline-before.png');
gm97Png($once,'gm97-clean-pipeline-once.png');
gm97Png($twice,'gm97-clean-pipeline-twice.png');
gmReport('gm97-clean-pipeline',["despeckleimage", "reducenoiseimage", "__construct", "getimagesignature", "setimagedepth", "setimageformat", "writeimage"],["gm97-clean-pipeline-before.png", "gm97-clean-pipeline-once.png", "gm97-clean-pipeline-twice.png"],
['first_changes'=>$once->getImageSignature()!==$source->getImageSignature(),'second_changes'=>$twice->getImageSignature()!==$once->getImageSignature()],
$errors ?? [], []);
echo "cleanup: despeckle then reduceNoise0 png=3 size=320x200\n";
Ожидаемый результат
cleanup: despeckle then reduceNoise0 png=3 size=320x200
Скачайте и распакуйте example.php, gm97-color-fixture.php и четыре файла .ppm.b64 в одну папку. Запуск: php example.php. Помощник восстанавливает собственные входы, проверяет их SHA256 и записывает metrics.json. Основные методы обработки видны в программе; gm97Png сохраняет копию как PNG8 для просмотра. Источники не перезаписываются. Среда: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.
Ожидаются исходник и два отличающихся результата 320×200. Упражнение: после первого фильтра текст читается, после второго стал хуже. Какой выпускать? Решение: первый, если он удовлетворяет требованию; количество фильтров не является показателем качества. После выбора переходите к сохранению и проверке файла, а не пересохраняйте промежуточные JPEG много раз.
Связанный шаг: коррекция тонов и сохранение результата с проверкой.
Из реального вопроса разработчика
GIMP equivalent effect on GraphicsMagick (Cartoon, Enhance Despeckle). Автор использует GraphicsMagick через Node.js и ищет аналоги эффектов GIMP для выделения символов на изображении. Похожее имя фильтра не доказывает одинаковый алгоритм или пригодность для текста. Наши оригинальные PHP-примеры сравнивают пять реальных фильтров на собственном входе с шумом и краями; OCR и повторение эффекта Cartoon не заявлены. На странице вопроса нет ответа, чужого решения мы не приписываем.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Gmagick::blurimageРазмыть изображение с заданной sigma
PECL gmagick >= Unknown · gmagick
Gmagick::blurimage(float $radius, float $sigma, int $channel = ?): GmagickGmagick::blurimage(float $radius, float $sigma, int $channel = ?): GmagickОбязательные float radius и sigma задают радиус и стандартное отклонение размытия. Радиус 0 позволяет подобрать область. Большая sigma означает более широкое сглаживание; полезные края также смягчаются. PHP.net отображает третий необязательный int channel без пояснения default, но Gmagick 2.0.6RC1/C принимают ровно 2 аргумента. Реальный третий аргумент дал ArgumentCountError. Возвращается размытый Gmagick. Примеры используют radius 0, sigma 1; это выбранные параметры, не обещание лучшего шумоподавления для любого входа.
| Параметр | Контракт PHP.net | Назначение |
|---|---|---|
| $radius | float; обязательный | Радиус соседства пикселей. |
| $sigma | float; обязательный | Стандартное отклонение размытия. |
| $channel | int; необязательный | Официальный параметр канала; поддержку и ограничения см. в пояснении. |
Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.
Версия в PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.
Два применения: Отличить общее размытие от enhance; Сравнить медиану с размытием.
Gmagick::despeckleimageПодавить точечные помехи
PECL gmagick >= Unknown · gmagick
Gmagick::despeckleimage(): GmagickGmagick::despeckleimage(): GmagickАргументов нет. Метод уменьшает speckle-шум с сохранением краёв исходного изображения; возвращает изменённый Gmagick. Это цель фильтра, не гарантия сохранности каждого тонкого элемента. Собственная карточка содержит детерминированные точки и слабую зернистость. Первый пример сравнивает despeckle с reduceNoise, второй проверяет, нужен ли дополнительный проход. Пример на PHP.net оставлен заглушкой; здесь даны два самостоятельных сценария.
Параметров нет: вызов записывается с пустыми скобками.
Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.
Версия в PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.
Два применения: Убрать отдельные точки двумя способами; Остановиться до потери деталей.
Gmagick::enhanceimageПрименить фильтр для шумного изображения
PECL gmagick >= Unknown · gmagick
Gmagick::enhanceimage(): GmagickGmagick::enhanceimage(): GmagickАргументов нет. Метод применяет цифровой фильтр к шумному изображению и возвращает изменённый Gmagick. Он не получает оценку качества от читателя и не распознаёт смысл деталей. Первый пример сравнивает его с blur, второй применяет после median с сохранением промежуточной версии. Изменение пиксельной подписи доказывает действие, но не улучшение качества; решение требует просмотра фона и важных границ.
Параметров нет: вызов записывается с пустыми скобками.
Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.
Версия в PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.
Два применения: Отличить общее размытие от enhance; Сначала убрать выбросы, затем обработать остаток.
Gmagick::medianfilterimageЗаменить пиксели медианой соседства
PECL gmagick >= Unknown · gmagick
Gmagick::medianfilterimage(float $radius): voidGmagick::medianfilterimage(float $radius): voidОбязательный float radius задаёт соседство медианного фильтра. Медиана — среднее по положению после упорядочения, а не арифметическое среднее; операция полезна против отдельных выбросов. В PHP.net сигнатура void противоречит разделу Return Values, где указан Gmagick. В нашей версии Reflection также показывает void, но реальный возврат — тот же объект. В минимальных примерах результат вызова не используется: вызываем метод, затем отдельно работаем с объектом. Полная диагностика фиксирует расхождение. Увеличение радиуса может уничтожить тонкие детали.
| Параметр | Контракт PHP.net | Назначение |
|---|---|---|
| $radius | float; обязательный | Радиус соседства пикселей. |
Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.
Версия в PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.
Два применения: Сравнить медиану с размытием; Сначала убрать выбросы, затем обработать остаток.
Gmagick::reducenoiseimageСгладить шум с выбранным соседством
PECL gmagick >= Unknown · gmagick
Gmagick::reducenoiseimage(float $radius): GmagickGmagick::reducenoiseimage(float $radius): GmagickОбязательный float radius задаёт окрестность пикселя. PHP.net описывает замену пикселя близким по значению соседом и сглаживание контуров с сохранением информации о краях. Радиус 0 просит библиотеку подобрать подходящий радиус; это не отключение фильтра. Возвращается тот же Gmagick. Сравнены самостоятельный radius 1 и дополнительный radius 0 после despeckle. Тонкая маркировка и фактура тоже состоят из локальных отличий, поэтому универсального обещания очистки без потери деталей нет.
| Параметр | Контракт PHP.net | Назначение |
|---|---|---|
| $radius | float; обязательный | Радиус соседства пикселей. |
Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.
Версия в PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.
Два применения: Убрать отдельные точки двумя способами; Остановиться до потери деталей.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


