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

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

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

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

Глава 350 · После контуров и фильтров

Imagick: уголь, карандаш и цветные мазки

От понятной модели и первого PNG до шумного ярлыка, сохранённого случайного скетча и отдельной миниатюры.

Сделать оформительский PNG и понять цену стилизации

Для постера каталога нужны три оформительских варианта одной коробки и кружки: угольная графика, карандашная фактура и укрупнённые цветовые пятна. Исходник хранится отдельно: маленькие буквы, тонкая фактура и SKU помогают увидеть цену стилизации. Это декоративный результат, а не восстановление деталей, распознавание предмета или имитация работы конкретного художника.

Radius — радиус окрестности в пикселях; sigma — стандартное отклонение Gaussian в пикселях, то есть численный масштаб размытия. Angle — угол направленного размытия в градусах. Важная особенность Imagick 3.8.1: charcoal/sketch получают PHP(radius,sigma), но вызывают Core(sigma,radius). Поэтому PHP(1,1) однозначен; PHP(1,0) означает Core(radius=0 автоматически,sigma=1), а PHP(1,3) — Core(radius=3,sigma=1). OilPaint принимает только radius. Числа RGB на картинках 0..255 — уровни сохранённого PNG8; Q обозначал бы QuantumRange, внутренний максимум канала: в проверенной Q16-сборке 65535. Эти три вызова Q не требуют.

Собственный исходник 400×320: каталог, шумный ярлык, маленький текст, тонкая фактура и цветные пятна
Собственный исходник 400×320: каталог, шумный ярлык, маленький текст, тонкая фактура и цветные пятна
Первый полезный результат: отдельный угольный PNG charcoal(1,1), без изменения сохранённого исходника
Первый полезный результат: отдельный угольный PNG charcoal(1,1), без изменения сохранённого исходника

Интенсивность — численная яркость, вычисленная из цветовых компонентов; это не сам полный набор RGB. Модель charcoal: перепады → размытие и Normalize → инверсия и серый. Normalize меняет тональное распределение, поэтому это не только тёмная обводка. Модель sketch: случайная карта удвоенного размера → направленная фактура → смешивание с исходником; здесь присутствует новый случайный рисунок. Модель oilPaint: локальное квадратное окно → подсчёт корзин интенсивности → каналы выбранного соседа. В схеме условное 3×3 объясняет выбор преобладающей корзины, а не обещает одинаковый размер окна при любом radius.

Три численных механизма и фактическая перестановка radius/sigma в PHP 3.8.1; схемы не распознают смысл изображения
Три численных механизма и фактическая перестановка radius/sigma в PHP 3.8.1; схемы не распознают смысл изображения

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

В $image уже находится загруженная копия. Две единицы задают масштабы по 1 пикселю: при одинаковых числах перестановка wrapper не влияет. Стрелка -> вызывает метод объекта; круглые скобки содержат аргументы, запятые их отделяют, ; завершает команду.

$image->charcoalImage(1, 1);

$image = clone $source; создаёт независимую копию оригинала. Простое присваивание объект не копирует. Метод меняет текущую картинку и возвращает bool, поэтому $image = $image->charcoalImage(...) уничтожило бы ссылку на картинку. В полном коде if с ! проверяет false, throw new RuntimeException останавливает отказавшую цепочку, clear освобождает native-ресурсы после сохранения. Подготовка: объекты и методы, clone, исключения.

Распакуйте весь архив: example.php — программа, art-fixture.php — показанный ниже помощник, source.png.b64 — текстовое Base64-представление точного PNG. Require подключает файл относительно __DIR__, папки программы. LoadArtSource декодирует байты, проверяет SHA256 и восстанавливает source.png, затем возвращает Imagick. SaveArtComparison собирает панели и сохраняет непрозрачный RGB PNG8, после чего печатает имя файла. Stdout — имя, не сама картинка; откройте PNG просмотрщиком.

Imagick::VIRTUALPIXELMETHOD_EDGE — константа продолжения крайних пикселей за рамку при чтении соседей. :: без скобок читает константу класса. Настройка сделана до clone; её влияние зависит от конкретной цепочки: выбранная политика не доказывает различие у каждого метода. Все размеры и источник здесь фиксированы.

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

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

Результат: Панели: исходный макет и charcoal(1,1). Цвет исчезает; перепады, мелкие буквы и шум участвуют в построении рисунка. Это самостоятельный оформительский PNG, а не автоматическое выделение только главных линий товара. Архив содержит example.php, art-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске. Выходной PNG откройте обычным просмотрщиком; stdout содержит его имя. Первая панель — исходник, далее варианты в указанном порядке; размер 800×320, каждая панель 400×320. Надписи исходного растра описывают вход и автоматически не пересчитываются фильтром.

Ожидаемый вывод
art-first.png
Полный переносимый помощник art-fixture.php
<?php
declare(strict_types=1);

function loadArtSource(): 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) !== '987b011d04c54e428ad503a888c92d8f76335609931c29df9c43a33e1cfd27e4') {
        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 saveArtComparison(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";
}

Помощник объявляет function с параметрами; тип после двоеточия описывает результат. Load возвращает Imagick, save имеет void — значения результата нет. Array $panels — список, foreach перебирает изображения и их индексы, count считает панели. Строгие ===/!== различают false и данные, strlen считает байты. Base64_decode с true отвергает повреждённые данные, hash проверяет точный вход. Composite размещает панели без изменения масштаба; depth8 и color-type2 задают сохранённый RGB PNG8. Это открытая инфраструктура, а не скрытая стилизация. Подготовка: функции, массивы, foreach, чтение и запись.

Проследить разные пути от соседей к новому пикселю

Charcoal строит перепады Edge, ограничивает значения Clamp, размывает Blur, нормализует Normalize, инвертирует Negate и делает Grayscale. Цвет и alpha теряются в этой реализации. Шум бумаги тоже создаёт перепады. Gaussian-подготовка может уменьшить зерно, одновременно стирая полезные тонкие штрихи.

Sketch создаёт случайное поле размером 800×640 для входа 400×320, обрабатывает MotionBlur/Edge/Clamp/Normalize/Negate, уменьшает до 400×320 и смешивает с оригиналом. ColorDodge — осветляющий способ смешивания, Blend — взвешенное смешивание; точный Core задаёт артефакт 20x80. Это объяснение пути, а не инструкция копировать всю цепочку или требование получить одинаковую случайную маску на другом сервере.

OilPaint при radius=2 использует окно 5×5, при radius=3 — 7×7 в этой сборке. Группировка выполняется по интенсивности, затем копируются исходные каналы одного выбранного соседа; результат может оставаться цветным. Число 256 — количество корзин, а не значение radius или число новых цветов в итоговой палитре. Малый ярлык и штрихкод могут потерять читаемость.

Перед полной сравнительной программой: все три переменные ниже — независимые clone исходника; 1,1 — пиксельные параметры charcoal/sketch, 45 — градусы sketch, 2 — radius oil. Эти короткие вызовы показывают ядро без инфраструктуры чтения и сохранения.

$image->charcoalImage(1, 1);
$sketched->sketchImage(1, 1, 45);
$painted->oilPaintImage(2);
Сравнить уголь, карандашную фактуру и цветные пятнаПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/art-fixture.php';
$source = loadArtSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->charcoalImage(1, 1)) {
    throw new RuntimeException('Не удалось применить charcoalImage');
}
$sketched = clone $source;
if (!$sketched->sketchImage(1, 1, 45)) {
    throw new RuntimeException('Не удалось применить sketchImage');
}
$painted = clone $source;
if (!$painted->oilPaintImage(2)) {
    throw new RuntimeException('Не удалось применить oilPaintImage');
}
saveArtComparison([$source, $image, $sketched, $painted], 'art-controls.png');
$source->clear();
$image->clear();
$sketched->clear();
$painted->clear();

Результат: Панели: исходник, charcoal(1,1), один sketch(1,1,45), oilPaint(2). Образцы текстуры/текста/цвета раскрывают разные потери; sketch — сохранённый результат именно этого выполнения. Архив содержит example.php, art-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске. Выходной PNG откройте обычным просмотрщиком; stdout содержит его имя. Первая панель — исходник, далее варианты в указанном порядке; размер 1600×320, каждая панель 400×320. Надписи исходного растра описывают вход и автоматически не пересчитываются фильтром.

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

Выбрать единицы, размер и версионный mapping

Radius — радиус окрестности в пикселях; sigma — стандартное отклонение Gaussian в пикселях, то есть численный масштаб размытия. Angle — угол направленного размытия в градусах. Важная особенность Imagick 3.8.1: charcoal/sketch получают PHP(radius,sigma), но вызывают Core(sigma,radius). Поэтому PHP(1,1) однозначен; PHP(1,0) означает Core(radius=0 автоматически,sigma=1), а PHP(1,3) — Core(radius=3,sigma=1). OilPaint принимает только radius. Числа RGB на картинках 0..255 — уровни сохранённого PNG8; Q обозначал бы QuantumRange, внутренний максимум канала: в проверенной Q16-сборке 65535. Эти три вызова Q не требуют.

Параметры PHPФактический native-вызов 3.8.1Полезная проверка
charcoal/sketch(1,1)Core radius=1,sigma=1Симметричные числа не требуют угадывать перестановку.
charcoal/sketch(1,0)Core radius=0auto,sigma=1Автоматический radius находится во втором PHP-аргументе.
charcoal/sketch(1,3)Core radius=3,sigma=1Явное увеличение размера окрестности, не силы opacity.
sketch(...,0/90)Angle в градусах внутри MotionBlurСравнение двух случайных рисунков не изолирует только угол.
oilPaintImage(2)Core radius2,internal sigma15×5 окно, потеря тонких деталей.
oilPaintImage(3)Core radius3,internal sigma17×7 окно; относительный масштаб зависит от размера PNG.

Параметры всех трёх API обязательны; channel-аргумента нет. Ввод из формы проверяйте на конечность и разумную верхнюю границу. Не используйте отрицательные или огромные радиусы как способ получить «более художественный» эффект. Масштаб деталей в пикселях меняется при resize, поэтому сравнивайте область и реальный размер публикации, а не только числа в вызове.

Правила имён Manual и текущая реализация показаны вместе: raw XML не переписан под один бинарник. Для иной версии проверьте наличие метода, сигнатуру и зависимость ImageMagick; успешный bool не подтверждает качество рисунка. Обычные blur/sharpen решают другую задачу, а edge показывает все перепады без случайного художественного смешивания.

Сопоставить зерно, буквы и размер цветных пятен

Пустая бумага, буквы и прямой/подготовленный угольный рисунок
Пустая бумага, буквы и прямой/подготовленный угольный рисунок

Угольный эффект усиливает перепады, поэтому шум бумаги становится частью рисунка. Проверяем известную пустую область ярлыка x=80..219,y=177..185, где нет букв. Разброс R здесь оценивает зерно именно этого участка; меньшее число не доказывает читаемость всех букв или художественное качество. Normalize меняет распределение на всём обрабатываемом кадре.

В сохранённых PNG8 разброс R пустой бумаги после прямого charcoal равен 13.86518, после Gaussian→charcoal — 7.39439. Средний R при этом изменился с 209.76825 до 241.89841: бумага стала и ровнее, и светлее. Это факты конкретного кадра, а не обещание для любого скана; сравнивайте буквы рядом с пустой областью.

Цветной постер и отдельная миниатюра: мелкая фактура и маркировка теряют детали при укрупнении пятен
Цветной постер и отдельная миниатюра: мелкая фактура и маркировка теряют детали при укрупнении пятен

В контрольном блоке мелкие линии имеют другой уровень поверх основного RGB(82,136,170). OilPaint может заменить редкий цвет значениями более частой локальной корзины. В сохранённом oilPaint(2) отдельная точка (33,262) изменилась с RGB(210,75,55) на RGB(82,136,170), а разброс R участка фактуры x=20..119,y=280..299 уменьшился с 5.19615 до 0. Шесть внутренних точек постоянных цветных пятен сохранились точно. Это намеренная потеря фактуры, не универсальная очистка дефектов. Гладкий цветной участок и область с текстом требуют разных критериев: красивое крупное пятно не заменяет читаемый артикул. Радиус 3 на миниатюре 200×160 охватывает большую долю исходного предмета, чем на 400×320.

Сохранить именно выбранную случайную фактуру

Два сохранённых случайных скетча при углах 0°/90°: не чистый эксперимент одного угла
Два сохранённых случайных скетча при углах 0°/90°: не чистый эксперимент одного угла
Утверждённый результат и повторно прочитанная точная копия его PNG
Утверждённый результат и повторно прочитанная точная копия его PNG

Повторный sketch с теми же аргументами создаёт новую случайную карту. В малом опыте два вызова без seed дали разные RGBA. Статический Imagick::setSeed(380031) перед каждым вызовом дал одинаковые RGBA в нашей сборке и размере 41×41. :: со скобками здесь вызывает статический метод класса; это иной случай, чем чтение константы. SetSeed возвращает null. Этот ограниченный опыт не обещает переносимую PNG-байтовую идентичность между версиями, потоками или параметрами.

Для утверждённой иллюстрации надёжная задача проще: сохранить конкретный файл и читать его. В полном сценарии hash_file проверяет фактическое совпадение байтов approved/delivered, а оба new Imagick повторно читают файлы. В этом выполнении каждый файл занимает 83089 байтов; и байты PNG, и прочитанные RGBA обоих файлов совпадают. Случайный hash не захардкожен в программе; stdout остаётся фиксированным именем сравнения. Копирование не улучшает рисунок, зато сохраняет выбранный результат. Ротация файлов, HTTP-кеш и удалённое хранилище требуют отдельной реализации.

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

Восемь программ выполнены на PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 Q16. Выходы сохранены непрозрачными RGB PNG8; внутренние уровни при этом квантуются. Основной источник фиксирован, sketch добавляет собственную случайность. Возвращаемое true и правильная геометрия подтверждают успешную операцию, но не пригодность для печати или OCR.

В отдельной малой проверке alpha-шахматка изменилась у всех трёх методов; charcoal отключил alpha. В основных программах непрозрачный вход и белый comparison-canvas, поэтому они не доказывают произвольную прозрачность. Виртуальные EDGE/TILE дали одинаковый charcoal на том контрольном входе и разные oilPaint; для случайного sketch этот фактор отдельно не изолирован. Не превращайте один опыт в общее обещание о рамке всех изображений.

До чтения внешних данных ограничьте формат, площадь, число кадров и ресурсы; ядра, clone и временная карта sketch 2× по каждой стороне требуют native-памяти. Проверяйте права записи и ошибки чтения/обработки/сохранения отдельно. Вход здесь RGB без ICC/CMYK/HDR и один кадр. Для другого цветового пространства, профиля, разрядности или прозрачности нужна своя проверка; сравнительная скорость не измерялась.

Официальные примеры сохраняются в полном XML каждой карточки. Наши задачи выросли из реальных вопросов о лишней штриховке, переносе команд между bindings, копиях объектов и повторном использовании PNG. Эти обсуждения — свидетельства задач, не контракт API; решения и учебный источник оригинальные.

Выбрать оформительский эффект и сделать свой вариант

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

Упражнение: подготовить миниатюру 200×160 с radius=3 и сохранить отдельно от сравнения. Решение: clone исходника; resizeImage(200,160,FILTER_LANCZOS,1); oilPaintImage(3); depth8/color-type2; writeImage. SampleImage нужен только для увеличенного просмотра. Объясните, почему этот вариант не равен простому уменьшению уже обработанного большого постера. Полная программа — миниатюра oilPaint.

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

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

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

Imagick::charcoalImageПодготовить угольный постер и сравнить прямую обработку с подавлением зерна.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::charcoalImage(float $radius, float $sigma): bool

Подготовить угольный постер и сравнить прямую обработку с подавлением зерна.

Radius — радиус окрестности в пикселях; sigma — стандартное отклонение Gaussian в пикселях, то есть численный масштаб размытия. Angle — угол направленного размытия в градусах. Важная особенность Imagick 3.8.1: charcoal/sketch получают PHP(radius,sigma), но вызывают Core(sigma,radius). Поэтому PHP(1,1) однозначен; PHP(1,0) означает Core(radius=0 автоматически,sigma=1), а PHP(1,3) — Core(radius=3,sigma=1). OilPaint принимает только radius. Числа RGB на картинках 0..255 — уровни сохранённого PNG8; Q обозначал бы QuantumRange, внутренний максимум канала: в проверенной Q16-сборке 65535. Эти три вызова Q не требуют.

Точный Core строит Edge, ограничивает значения, размывает, нормализует тональный диапазон, инвертирует и переводит в серый. Это цепочка численных операций; она не узнаёт, какой контур важен художнику. В этой реализации alpha отключается.

Механизмы стилизации и пределы модели; исходник и новый вариант — разные объекты
Механизмы стилизации и пределы модели; исходник и новый вариант — разные объекты

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

В $image уже находится загруженная копия. Две единицы задают масштабы по 1 пикселю: при одинаковых числах перестановка wrapper не влияет. Стрелка -> вызывает метод объекта; круглые скобки содержат аргументы, запятые их отделяют, ; завершает команду.

$image->charcoalImage(1, 1);

$image = clone $source; создаёт независимую копию оригинала. Простое присваивание объект не копирует. Метод меняет текущую картинку и возвращает bool, поэтому $image = $image->charcoalImage(...) уничтожило бы ссылку на картинку. В полном коде if с ! проверяет false, throw new RuntimeException останавливает отказавшую цепочку, clear освобождает native-ресурсы после сохранения. Подготовка: объекты и методы, clone, исключения.

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

Imagick::charcoalImage(float $radius, float $sigma): bool

Точный Core строит Edge, ограничивает значения, размывает, нормализует тональный диапазон, инвертирует и переводит в серый. Это цепочка численных операций; она не узнаёт, какой контур важен художнику. В этой реализации alpha отключается.

АргументСмысл, единицы и обязательность
$radiusОбязательный float. В Manual: радиус Gaussian в пикселях без центрального пикселя. В PHP-wrapper 3.8.1 это число фактически передаётся как Core sigma.
$sigmaОбязательный float. В Manual: стандартное отклонение Gaussian в пикселях. В PHP-wrapper 3.8.1 это число фактически передаётся как Core radius. В примере оба равны 1, перестановка ничего не меняет.

Все параметры обязательны, default-аргументов нет. Channel в этих сигнатурах отсутствует. Доступность PHP Manual: PECL imagick 2, PECL imagick 3. Возврат: true при успехе; изменяется текущий объект, новый Imagick не возвращается. Пустой объект в проверенной сборке вызывает ImagickException; native-отказ также может вызвать исключение. Пустая секция errors/changelog в исходном XML не означает отсутствия возможных отказов.

Политика приложения: конечные ограниченные числа, неотрицательный native radius и положительная native sigma; для oil допускаем 0 как auto. Это наш разумный интерфейс подбора, не обещание одинаковой PHP-валидации любых чисел. Размер окрестности влияет на стоимость и относительный масштаб деталей. Ошибки чтения, обработки и записи рассматривайте отдельно; исключения и файлы.

Полный исходный официальный XML без исправления raw-контракта
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.charcoalimage">
 <refnamediv>
  <refname>Imagick::charcoalImage</refname>
  <refpurpose>Simulates a charcoal drawing</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::charcoalImage</methodname>
   <methodparam><type>float</type><parameter>radius</parameter></methodparam>
   <methodparam><type>float</type><parameter>sigma</parameter></methodparam>
  </methodsynopsis>
  <para>
   Simulates a charcoal drawing.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>radius</parameter></term>
     <listitem>
      <para>
       The radius of the Gaussian, in pixels, not counting the center pixel
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>sigma</parameter></term>
     <listitem>
      <para>
       The standard deviation of the Gaussian, in pixels
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>

 </refsect1>
 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>



 <refsect1 role="examples">
  &reftitle.examples;
  <para>
    <example>
      <title> <function>Imagick::charcoalImage</function></title>
      <programlisting role="php">
      <![CDATA[
<?php
function charcoalImage($imagePath, $radius, $sigma) {
    $imagick = new \Imagick(realpath($imagePath));
    $imagick->charcoalImage($radius, $sigma);
    header("Content-Type: image/jpg");
    echo $imagick->getImageBlob();
}

?>
]]>
      </programlisting>
    </example>
  </para>
 </refsect1>

</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

Официальный HTTP-пример внутри XML оформлен как function с путём и параметрами: new Imagick(realpath(...)) читает файл, затем метод меняет объект, header задаёт Content-Type, getImageBlob возвращает двоичные данные для echo. Его надо выполнять как веб-ответ без постороннего вывода; наши восемь программ — самостоятельные локальные PNG и не являются тестом HTTP. Смысл функции, файлового пути и HTTP-ответа разбирается отдельно; исходный пример сохранён полностью.

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

require __DIR__ . '/art-fixture.php';
$source = loadArtSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->charcoalImage(1, 1)) {
    throw new RuntimeException('Не удалось применить charcoalImage');
}
saveArtComparison([$source, $image], 'art-charcoal-basic.png');
$source->clear();
$image->clear();

Результат: Панели: исходный макет и charcoal(1,1). Цвет исчезает; перепады, мелкие буквы и шум участвуют в построении рисунка. Это самостоятельный оформительский PNG, а не автоматическое выделение только главных линий товара. Архив содержит example.php, art-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске. Выходной PNG откройте обычным просмотрщиком; stdout содержит его имя. Первая панель — исходник, далее варианты в указанном порядке; размер 800×320, каждая панель 400×320. Надписи исходного растра описывают вход и автоматически не пересчитываются фильтром.

Ожидаемый вывод
art-charcoal-basic.png

Когда меняется требование

Шумный ярлык превращается в множество мелких тёмных отметок. Сравним прямую стилизацию и предварительный Gaussian на независимом исходнике; подготовка действует на весь кадр и может ослабить полезный мелкий текст.

GaussianBlurImage(0,0.8) перед charcoal — обычный blur с native radius0auto и sigma0.8 пикселя; у этого отдельного blur нет описанной перестановки charcoal/sketch. $prepared взят заново из $source. Связанный разбор: Gaussian и цена сглаживания.

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

require __DIR__ . '/art-fixture.php';
$source = loadArtSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->charcoalImage(1, 1)) {
    throw new RuntimeException('Не удалось применить charcoalImage');
}
$prepared = clone $source;
if (!$prepared->gaussianBlurImage(0, 0.8)) {
    throw new RuntimeException('Не удалось применить gaussianBlurImage');
}
if (!$prepared->charcoalImage(1, 1)) {
    throw new RuntimeException('Не удалось применить charcoalImage');
}
saveArtComparison([$source, $image, $prepared], 'art-charcoal-prepared.png');
$source->clear();
$image->clear();
$prepared->clear();

Результат: Панели: исходник, прямой charcoal(1,1), Gaussian(0,0.8)→charcoal(1,1). Разброс на известной пустой бумаге уменьшается. Charcoal включает Normalize, поэтому может измениться и общая подача тонов; это не доказательство улучшения каждой детали. Архив содержит example.php, art-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске. Выходной PNG откройте обычным просмотрщиком; stdout содержит его имя. Первая панель — исходник, далее варианты в указанном порядке; размер 1200×320, каждая панель 400×320. Надписи исходного растра описывают вход и автоматически не пересчитываются фильтром.

Ожидаемый вывод
art-charcoal-prepared.png

Проверка и следующий выбор

Смотрите итог в размере использования: буквы, фактуру, цвет и alpha. Сохраняйте оригинал отдельно; эти преобразования не восстанавливают утраченную деталь. Если нужна точная маркировка, стилизуйте товар до наложения служебного текста либо работайте с осмысленной маской. Наша полноформатная стилизация не обещает сохранить SKU пиксель в пиксель. Для очистки импульсов вместо оформления есть локальные статистики; для выделения перепадов — edge.

Связанные варианты: sketchImage · oilPaintImage.

Imagick::sketchImageВыбрать карандашную фактуру, затем сохранить конкретный утверждённый вариант.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::sketchImage(float $radius, float $sigma, float $angle): bool

Выбрать карандашную фактуру, затем сохранить конкретный утверждённый вариант.

Radius — радиус окрестности в пикселях; sigma — стандартное отклонение Gaussian в пикселях, то есть численный масштаб размытия. Angle — угол направленного размытия в градусах. Важная особенность Imagick 3.8.1: charcoal/sketch получают PHP(radius,sigma), но вызывают Core(sigma,radius). Поэтому PHP(1,1) однозначен; PHP(1,0) означает Core(radius=0 автоматически,sigma=1), а PHP(1,3) — Core(radius=3,sigma=1). OilPaint принимает только radius. Числа RGB на картинках 0..255 — уровни сохранённого PNG8; Q обозначал бы QuantumRange, внутренний максимум канала: в проверенной Q16-сборке 65535. Эти три вызова Q не требуют.

Core создаёт случайную карту с удвоенными шириной и высотой, направленно размывает её, строит перепады, ограничивает/нормализует/инвертирует, уменьшает вдвое и смешивает с исходником через ColorDodge и Blend. Это процедурная фактура и исходные тона, а не распознавание карандашных штрихов или главных объектов.

Механизмы стилизации и пределы модели; исходник и новый вариант — разные объекты
Механизмы стилизации и пределы модели; исходник и новый вариант — разные объекты

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

В $image уже находится загруженная копия. Две единицы — пиксельные параметры, 45 — угол в градусах; все три обязательны. Стрелка -> вызывает метод объекта; круглые скобки содержат аргументы, запятые их отделяют, ; завершает команду.

$image->sketchImage(1, 1, 45);

$image = clone $source; создаёт независимую копию оригинала. Простое присваивание объект не копирует. Метод меняет текущую картинку и возвращает bool, поэтому $image = $image->sketchImage(...) уничтожило бы ссылку на картинку. В полном коде if с ! проверяет false, throw new RuntimeException останавливает отказавшую цепочку, clear освобождает native-ресурсы после сохранения. Подготовка: объекты и методы, clone, исключения.

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

Imagick::sketchImage(float $radius, float $sigma, float $angle): bool

Core создаёт случайную карту с удвоенными шириной и высотой, направленно размывает её, строит перепады, ограничивает/нормализует/инвертирует, уменьшает вдвое и смешивает с исходником через ColorDodge и Blend. Это процедурная фактура и исходные тона, а не распознавание карандашных штрихов или главных объектов.

АргументСмысл, единицы и обязательность
$radiusОбязательный float, по Manual радиус Gaussian в пикселях без центра. В проверенной обёртке 3.8.1 попадает в Core sigma.
$sigmaОбязательный float, по Manual стандартное отклонение Gaussian в пикселях. В проверенной обёртке 3.8.1 попадает в Core radius.
$angleОбязательный float, угол направленного размытия фактуры в градусах. Примеры 0,45,90; это не поворот всего PNG. Случайность остаётся отдельным источником различий.

Все параметры обязательны, default-аргументов нет. Channel в этих сигнатурах отсутствует. Доступность PHP Manual: PECL imagick 2, PECL imagick 3. Возврат: true при успехе; изменяется текущий объект, новый Imagick не возвращается. Пустой объект в проверенной сборке вызывает ImagickException; native-отказ также может вызвать исключение. Пустая секция errors/changelog в исходном XML не означает отсутствия возможных отказов.

Официальное описание рекомендует radius больше sigma для разумного результата и разрешает radius=0 для автоматического подбора; это не жёсткая PHP-валидация. Совет относится к смыслу native-параметров: в этой обёртке Core radius находится во втором PHP-аргументе. Условие исходного XML [imagick.method.available.0x629] означает ImageMagick 6.2.9 или новее. Угол задаёт направление blur внутри фактуры; эффект не обязан повторять одни байты при повторном вызове.

Политика приложения: конечные ограниченные числа, неотрицательный native radius и положительная native sigma; для oil допускаем 0 как auto. Это наш разумный интерфейс подбора, не обещание одинаковой PHP-валидации любых чисел. Размер окрестности влияет на стоимость и относительный масштаб деталей. Ошибки чтения, обработки и записи рассматривайте отдельно; исключения и файлы.

Полный исходный официальный XML без исправления raw-контракта
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.sketchimage">
 <refnamediv>
  <refname>Imagick::sketchImage</refname>
  <refpurpose>Simulates a pencil sketch</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::sketchImage</methodname>
   <methodparam><type>float</type><parameter>radius</parameter></methodparam>
   <methodparam><type>float</type><parameter>sigma</parameter></methodparam>
   <methodparam><type>float</type><parameter>angle</parameter></methodparam>
  </methodsynopsis>

  <para>
   Simulates a pencil sketch. We convolve the image with a Gaussian operator
   of the given radius and standard deviation (sigma). For reasonable
   results, radius should be larger than sigma.  Use a radius of 0 and
   Imagick::sketchImage() selects a suitable radius for you. Angle gives the
   angle of the blurring motion. 
   &imagick.method.available.0x629;
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>radius</parameter></term>
     <listitem>
      <para>
       The radius of the Gaussian, in pixels, not counting the center pixel
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>sigma</parameter></term>
     <listitem>
      <para>
       The standard deviation of the Gaussian, in pixels.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>angle</parameter></term>
     <listitem>
      <para>
       Apply the effect along this angle.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>



 <refsect1 role="examples">
  &reftitle.examples;
  <para>
    <example>
      <title> <function>Imagick::sketchImage</function></title>
      <programlisting role="php">
      <![CDATA[
<?php
function sketchImage($imagePath, $radius, $sigma, $angle) {
    $imagick = new \Imagick(realpath($imagePath));
    $imagick->sketchimage($radius, $sigma, $angle);
    header("Content-Type: image/jpg");
    echo $imagick->getImageBlob();
}

?>
]]>
      </programlisting>
    </example>
  </para>
 </refsect1>

</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

Официальный HTTP-пример внутри XML оформлен как function с путём и параметрами: new Imagick(realpath(...)) читает файл, затем метод меняет объект, header задаёт Content-Type, getImageBlob возвращает двоичные данные для echo. Его надо выполнять как веб-ответ без постороннего вывода; наши восемь программ — самостоятельные локальные PNG и не являются тестом HTTP. Смысл функции, файлового пути и HTTP-ответа разбирается отдельно; исходный пример сохранён полностью.

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

require __DIR__ . '/art-fixture.php';
$source = loadArtSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->sketchImage(1, 1, 0)) {
    throw new RuntimeException('Не удалось применить sketchImage');
}
$vertical = clone $source;
if (!$vertical->sketchImage(1, 1, 90)) {
    throw new RuntimeException('Не удалось применить sketchImage');
}
saveArtComparison([$source, $image, $vertical], 'art-sketch-angles.png');
$source->clear();
$image->clear();
$vertical->clear();

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

Ожидаемый вывод
art-sketch-angles.png

Когда меняется требование

Дизайнер выбрал конкретную случайную фактуру. Её нужно сохранить и переносить как готовый PNG, а не заново вызывать sketchImage при каждом локальном использовании.

Один sketch → фактический approved PNG → чтение байтов → точная локальная копия → reload обоих файлов
Один sketch → фактический approved PNG → чтение байтов → точная локальная копия → reload обоих файлов

WriteImage записывает готовый файл. File_get_contents читает все его байты, file_put_contents записывает те же данные; strlen проверяет число записанных байтов. Hash_file с sha256 сравнивает содержимое файлов; !== прекращает цепочку при различии. New Imagick(path) заново читает сохранённый PNG, а не генерирует фактуру. Оба вспомогательных PNG создаются кодом, их нет среди входов ZIP. Здесь нет отправки по сети; сервер позже может читать выбранный файл как готовый ресурс. Файловые операции и HTTP-ответ имеют собственные условия ошибок.

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

require __DIR__ . '/art-fixture.php';
$source = loadArtSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->sketchImage(1, 1, 45)) {
    throw new RuntimeException('Не удалось применить sketchImage');
}
$image->setImageFormat('png');
$image->setImageDepth(8);
$image->setOption('png:color-type', '2');
$approvedPath = __DIR__ . '/sketch-approved.png';
$deliveredPath = __DIR__ . '/sketch-delivered.png';
if (!$image->writeImage($approvedPath)) {
    throw new RuntimeException('Не удалось сохранить утверждённый скетч');
}
$bytes = file_get_contents($approvedPath);
if ($bytes === false || file_put_contents($deliveredPath, $bytes) !== strlen($bytes)) {
    throw new RuntimeException('Не удалось скопировать готовые байты PNG');
}
if (hash_file('sha256', $approvedPath) !== hash_file('sha256', $deliveredPath)) {
    throw new RuntimeException('Байты сохранённой копии отличаются');
}
$image->clear();
$image = new Imagick($approvedPath);
$delivered = new Imagick($deliveredPath);
saveArtComparison([$source, $image, $delivered], 'art-sketch-saved.png');
$source->clear();
$image->clear();
$delivered->clear();

Результат: Панели: исходник, повторно открытый sketch-approved.png, повторно открытая точная копия sketch-delivered.png. Sketch вызывается один раз; затем читаются, записываются и проверяются байты PNG. Оба самостоятельных файла 400×320 присутствуют после запуска. Это локальная подготовка/копирование, без проверки HTTP-выдачи по сети. Архив содержит example.php, art-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске. Выходной PNG откройте обычным просмотрщиком; stdout содержит его имя. Первая панель — исходник, далее варианты в указанном порядке; размер 1200×320, каждая панель 400×320. Надписи исходного растра описывают вход и автоматически не пересчитываются фильтром.

Ожидаемый вывод
art-sketch-saved.png

Проверка и следующий выбор

Смотрите итог в размере использования: буквы, фактуру, цвет и alpha. Сохраняйте оригинал отдельно; эти преобразования не восстанавливают утраченную деталь. Если нужна точная маркировка, стилизуйте товар до наложения служебного текста либо работайте с осмысленной маской. Наша полноформатная стилизация не обещает сохранить SKU пиксель в пиксель. Для очистки импульсов вместо оформления есть локальные статистики; для выделения перепадов — edge.

Связанные варианты: charcoalImage · oilPaintImage.

Imagick::oilPaintImageУкрупнить цветовые пятна и подготовить самостоятельную миниатюру с осмысленным масштабом.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::oilPaintImage(float $radius): bool

Укрупнить цветовые пятна и подготовить самостоятельную миниатюру с осмысленным масштабом.

Radius — радиус окрестности в пикселях; sigma — стандартное отклонение Gaussian в пикселях, то есть численный масштаб размытия. Angle — угол направленного размытия в градусах. Важная особенность Imagick 3.8.1: charcoal/sketch получают PHP(radius,sigma), но вызывают Core(sigma,radius). Поэтому PHP(1,1) однозначен; PHP(1,0) означает Core(radius=0 автоматически,sigma=1), а PHP(1,3) — Core(radius=3,sigma=1). OilPaint принимает только radius. Числа RGB на картинках 0..255 — уровни сохранённого PNG8; Q обозначал бы QuantumRange, внутренний максимум канала: в проверенной Q16-сборке 65535. Эти три вызова Q не требуют.

Точный Core выбирает квадратное локальное окно, считает 256 корзин интенсивности и копирует канальные значения одного выбранного соседа из преобладающей корзины. Интенсивность — численная яркость, вычисленная из цветовых компонентов. Это не среднее, не медиана и не поиск самого частого полного RGB-кортежа.

Механизмы стилизации и пределы модели; исходник и новый вариант — разные объекты
Механизмы стилизации и пределы модели; исходник и новый вариант — разные объекты

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

В $image уже находится загруженная копия. 2 — радиус в пикселях. Второго sigma в этой PHP-сигнатуре нет. Стрелка -> вызывает метод объекта; круглые скобки содержат аргументы, запятые их отделяют, ; завершает команду.

$image->oilPaintImage(2);

$image = clone $source; создаёт независимую копию оригинала. Простое присваивание объект не копирует. Метод меняет текущую картинку и возвращает bool, поэтому $image = $image->oilPaintImage(...) уничтожило бы ссылку на картинку. В полном коде if с ! проверяет false, throw new RuntimeException останавливает отказавшую цепочку, clear освобождает native-ресурсы после сохранения. Подготовка: объекты и методы, clone, исключения.

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

Imagick::oilPaintImage(float $radius): bool

Точный Core выбирает квадратное локальное окно, считает 256 корзин интенсивности и копирует канальные значения одного выбранного соседа из преобладающей корзины. Интенсивность — численная яркость, вычисленная из цветовых компонентов. Это не среднее, не медиана и не поиск самого частого полного RGB-кортежа.

АргументСмысл, единицы и обязательность
$radiusЕдинственный обязательный float, радиус окрестности в пикселях. Для обычных радиусов 2 и 3 в точном IM7 ширина окна 2×ceil(radius)+1: 2 даёт 5×5, 3 даёт 7×7. Ceil означает округление вверх; эту формулу не обобщаем на сколь угодно малое положительное число, потому что Core использует порог MagickEpsilon. 0 — автоматический выбор по внутренней sigma=1.0, которую задаёт wrapper, а не дополнительный PHP-аргумент.

Все параметры обязательны, default-аргументов нет. Channel в этих сигнатурах отсутствует. Доступность PHP Manual: PECL imagick 2, PECL imagick 3. Возврат: true при успехе; изменяется текущий объект, новый Imagick не возвращается. Пустой объект в проверенной сборке вызывает ImagickException; native-отказ также может вызвать исключение. Пустая секция errors/changelog в исходном XML не означает отсутствия возможных отказов.

Политика приложения: конечные ограниченные числа, неотрицательный native radius и положительная native sigma; для oil допускаем 0 как auto. Это наш разумный интерфейс подбора, не обещание одинаковой PHP-валидации любых чисел. Размер окрестности влияет на стоимость и относительный масштаб деталей. Ошибки чтения, обработки и записи рассматривайте отдельно; исключения и файлы.

Полный исходный официальный XML без исправления raw-контракта
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.oilpaintimage">
 <refnamediv>
  <refname>Imagick::oilPaintImage</refname>
  <refpurpose>Simulates an oil painting</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::oilPaintImage</methodname>
   <methodparam><type>float</type><parameter>radius</parameter></methodparam>
  </methodsynopsis>
  <para>
   Applies a special effect filter that simulates an oil painting.
   Each pixel is replaced by the most frequent color occurring in
   a circular region defined by radius.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>radius</parameter></term>
     <listitem>
      <para>
      The radius of the circular neighborhood.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>



 <refsect1 role="examples">
  &reftitle.examples;
  <para>
    <example>
      <title> <function>Imagick::oilPaintImage</function></title>
      <programlisting role="php">
      <![CDATA[
<?php
function oilPaintImage($imagePath, $radius) {
    $imagick = new \Imagick(realpath($imagePath));
    $imagick->oilPaintImage($radius);
    header("Content-Type: image/jpg");
    echo $imagick->getImageBlob();
}

?>
]]>
      </programlisting>
    </example>
  </para>
 </refsect1>

</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

Официальный HTTP-пример внутри XML оформлен как function с путём и параметрами: new Imagick(realpath(...)) читает файл, затем метод меняет объект, header задаёт Content-Type, getImageBlob возвращает двоичные данные для echo. Его надо выполнять как веб-ответ без постороннего вывода; наши восемь программ — самостоятельные локальные PNG и не являются тестом HTTP. Смысл функции, файлового пути и HTTP-ответа разбирается отдельно; исходный пример сохранён полностью.

Фактические сохранённые варианты: Укрупнить мелкую фактуру в цветном варианте постера
Фактические сохранённые варианты: Укрупнить мелкую фактуру в цветном варианте постера
Укрупнить мелкую фактуру в цветном варианте постераПример для указанного окружения
<?php
declare(strict_types=1);

require __DIR__ . '/art-fixture.php';
$source = loadArtSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->oilPaintImage(2)) {
    throw new RuntimeException('Не удалось применить oilPaintImage');
}
saveArtComparison([$source, $image], 'art-oilpaint-basic.png');
$source->clear();
$image->clear();

Результат: Панели: исходник и oilPaintImage(2). На контрольной фактуре редкая тонкая линия и отдельный цветной пиксель могут уступить преобладающей локальной интенсивности. Большие цветные участки сохраняют цвет; буквы, штрихкод и тонкие штрихи нужно проверять отдельно. Архив содержит example.php, art-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске. Выходной PNG откройте обычным просмотрщиком; stdout содержит его имя. Первая панель — исходник, далее варианты в указанном порядке; размер 800×320, каждая панель 400×320. Надписи исходного растра описывают вход и автоматически не пересчитываются фильтром.

Ожидаемый вывод
art-oilpaint-basic.png

Когда меняется требование

Нужен файл 200×160 для небольшой карточки каталога. Сначала уменьшаем исходник и лишь затем применяем radius=3; сравним с radius=3 на полном кадре. Одинаковое число пикселей радиуса занимает разную долю исходного товара.

ResizeImage(200,160,FILTER_LANCZOS,1) уменьшает независимый исходник с интерполяцией Lanczos; последняя 1 — коэффициент blur фильтра resize. После oilPaint(3) файл сохраняется в 200×160 и вновь читается. SampleImage(400,320) создаёт только ближайший пиксельный обзор: вдвое шире и выше, блоками 2×2. Третья панель не является файлом миниатюры; реальный oilpaint-thumb.png имеет 200×160. Сравнение меняет размер перед эффектом и относительный размер окна, а не один изолированный параметр.

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

require __DIR__ . '/art-fixture.php';
$source = loadArtSource();
$source->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$image = clone $source;
if (!$image->oilPaintImage(3)) {
    throw new RuntimeException('Не удалось применить oilPaintImage');
}
$thumb = clone $source;
if (!$thumb->resizeImage(200, 160, Imagick::FILTER_LANCZOS, 1)) {
    throw new RuntimeException('Не удалось уменьшить исходник');
}
if (!$thumb->oilPaintImage(3)) {
    throw new RuntimeException('Не удалось применить oilPaintImage');
}
$thumb->setImageFormat('png');
$thumb->setImageDepth(8);
$thumb->setOption('png:color-type', '2');
$thumbPath = __DIR__ . '/oilpaint-thumb.png';
if (!$thumb->writeImage($thumbPath)) {
    throw new RuntimeException('Не удалось сохранить миниатюру');
}
$thumb->clear();
$preview = new Imagick($thumbPath);
if (!$preview->sampleImage(400, 320)) {
    throw new RuntimeException('Не удалось показать миниатюру в масштабе 2:1');
}
saveArtComparison([$source, $image, $preview], 'art-oilpaint-size.png');
$source->clear();
$image->clear();
$preview->clear();

Результат: Панели: исходник, oilPaint(3) на 400×320, сохранённая миниатюра 200×160 после oilPaint(3), показанная ближайшими пикселями в масштабе 2:1. Реальный файл oilpaint-thumb.png остаётся 200×160. SampleImage увеличивает только обзор; каждый пиксель миниатюры повторён блоком 2×2, новые детали не возникают. Архив содержит example.php, art-fixture.php и source.png.b64. Распакуйте все три файла рядом и выполните php example.php в папке с правом записи и PHP/Imagick. Помощник проверит SHA256 и восстановит точный source.png без интернета и шрифтов при запуске. Выходной PNG откройте обычным просмотрщиком; stdout содержит его имя. Первая панель — исходник, далее варианты в указанном порядке; размер 1200×320, каждая панель 400×320. Надписи исходного растра описывают вход и автоматически не пересчитываются фильтром.

Ожидаемый вывод
art-oilpaint-size.png

Проверка и следующий выбор

Смотрите итог в размере использования: буквы, фактуру, цвет и alpha. Сохраняйте оригинал отдельно; эти преобразования не восстанавливают утраченную деталь. Если нужна точная маркировка, стилизуйте товар до наложения служебного текста либо работайте с осмысленной маской. Наша полноформатная стилизация не обещает сохранить SKU пиксель в пиксель. Для очистки импульсов вместо оформления есть локальные статистики; для выделения перепадов — edge.

Связанные варианты: charcoalImage · sketchImage.

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

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

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

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

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