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

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

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

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

Глава 364 · После свёртки, RGBA и самостоятельной области

Imagick: края и дробные пиксели без неожиданной примеси

Настроить виртуальный край, прочитать и восстановить политику, проверить nearest/bilinear на тонком штрихе и RGBA-вставке.

Получить готовую карточку с обработанной полосой

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

Собственная RGBA-наклейка 400×320 содержит товар и прозрачную ручку. Отдельная учебная полоса 160×50 создана нами с разными краями и тонкими штрихами, чтобы было видно действие настройки; это не скрытая область товара. Напечатанные надписи исходника остаются частью растра и не измеряют новые цвета. PNG здесь хранит 8 бит на компоненту RGB/RGBA, не индексированную палитру.

Точный собственный RGBA-вход 400×320
Точный собственный RGBA-вход 400×320
Полоса до фильтра → EDGE-свёртка → самостоятельная карточка без изменения артикула
Полоса до фильтра → EDGE-свёртка → самостоятельная карточка без изменения артикула
Понятие до схемыЗначение в этих программах
Растр и virtual pixelНастоящая полоса имеет 160×50 пикселей. Фильтр у x=0 спрашивает также x=−4..−1. EDGE повторяет x=0, TILE оборачивает к правому краю, BACKGROUND возвращает заданный цвет.
Фильтр и весаГоризонтальное ядро содержит 9 чисел 1/9, сумма 1. В непрозрачном RGB оно усредняет 9 отсчётов от x−4 до x+4; у границы нужны virtual pixels.
Координаты и дробная выборкаx/i растут вправо, y/j вниз, начало 0,0. FX p{i+0.5,j} читает источник между i и i+1. Непрозрачные значения 40 и 200 дают bilinear 120; nearest выбирает 200.
RGB / RGBA / alphaRGB — красная, зелёная и синяя компоненты. A — непрозрачность: 0 прозрачно, 1 непрозрачно. Внутренний Q=65535 — максимум проверенной Q16-сборки; enum настройки не выражается в Q или процентах.
Состояние и результатМетоды установки меняют настройки текущего объекта и возвращают bool. Метод чтения возвращает int. convolveImage меняет рабочую копию; fxImage возвращает новый Imagick. Файл появляется после writeImage в открытом helper.
Настройка → конкретное чтение соседей → сохранённые пиксели, без роста canvas
Настройка → конкретное чтение соседей → сохранённые пиксели, без роста canvas

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

$image уже содержит изображение. $ задаёт имя переменной; = присваивает результат; -> вызывает метод объекта; () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса Imagick. int — целый код настройки, bool — true/false как статус. Не записывайте статус setter обратно в $image.

$ok = $image->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);

У нашего RGB-орнамента этот вызов сохранил пиксели и размер. Только следующий фильтр читает за краем. EDGE продолжает край, TILE повторяет растр, BACKGROUND читает цвет из setImageBackgroundColor. Нужен именно метод-потребитель, учитывающий это свойство.

В полной программе clone создаёт рабочую копию, [] записывает массив, | объединяет маски красного/зелёного/синего каналов. if проверяет условие, ! отрицает статус, throw new RuntimeException останавливает цепочку при отказе. echo выводит текст, . соединяет строки, "\n" переводит строку; (int) показывает bool как 0/1. Основы: объекты, массивы, исключения.

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

$image уже содержит изображение. $ задаёт имя переменной; = присваивает результат; -> вызывает метод объекта; () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса Imagick. int — целый код настройки, bool — true/false как статус. Не записывайте статус setter обратно в $image.

$method = $image->getImageVirtualPixelMethod();
$isEdge = ($method === Imagick::VIRTUALPIXELMETHOD_EDGE);

=== сравнивает значение и тип; $isEdge — bool-ответ на наш вопрос, а $method остаётся int. Getter не фильтрует, не измеряет фон и не возвращает предыдущую настройку. Задайте ожидаемую политику явно: default произвольного файла здесь не фиксируется.

В полной программе clone создаёт рабочую копию, [] записывает массив, | объединяет маски красного/зелёного/синего каналов. if проверяет условие, ! отрицает статус, throw new RuntimeException останавливает цепочку при отказе. echo выводит текст, . соединяет строки, "\n" переводит строку; (int) показывает bool как 0/1. Основы: объекты, массивы, исключения.

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

$image уже содержит изображение. $ задаёт имя переменной; = присваивает результат; -> вызывает метод объекта; () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса Imagick. int — целый код настройки, bool — true/false как статус. Не записывайте статус setter обратно в $image.

Координаты x/y измеряются в пикселях, верхний левый отсчёт 0,0. В выражении FX i/j — текущий выходной столбец/строка; p{x,y} читает абсолютную координату источника. Поэтому p{i+0.5,j} спрашивает источник на полпикселя правее выходной позиции. Это обратное чтение, а не перенос рисунка вправо. fxImage возвращает новый Imagick, его обязательно сохраняем в отдельную переменную:

$ok = $image->setImageInterpolateMethod(Imagick::INTERPOLATE_BILINEAR);
$sampled = $image->fxImage('p{i+0.5,j}');

Для непрозрачных соседей 40 и 200 по красному каналу в середине получаем (40+200)/2=120. NEAREST_PIXEL выбирает 200, floor — математическое округление вниз: например, floor(2.5)=2. INTEGER из ограниченной проверки выбирал эту целую координату и 40. RGB означает красную, зелёную и синюю компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно. У активной alpha RGB-смешивание взвешивается по непрозрачности; простое среднее RGBA неверно.

В полной программе clone создаёт рабочую копию, [] записывает массив, | объединяет маски красного/зелёного/синего каналов. if проверяет условие, ! отрицает статус, throw new RuntimeException останавливает цепочку при отказе. echo выводит текст, . соединяет строки, "\n" переводит строку; (int) показывает bool как 0/1. Основы: объекты, массивы, исключения.

Перед первой полной программой: ImagickKernel::fromMatrix создаёт ядро из вложенных строк массива; [array_fill(0,9,1/9)] — одна строка из девяти одинаковых весов. array_fill заполняет массив, / выполняет деление. $rgb объединяет три маски через |. convolveImage($kernel,$rgb) фильтрует только RGB. Самый малый потребитель:

$kernel = ImagickKernel::fromMatrix([array_fill(0, 9, 1 / 9)]);
$image->convolveImage($kernel, Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE);

В полном файле <?php открывает PHP, declare(strict_types=1) включает строгие типы. require подключает helper в папке __DIR__. [$source,$strip] распаковывает возвращённую пару объектов. Helper декодирует Base64 и проверяет SHA обоих входов; samplingPreview накладывает прозрачный вход на явную подложку. compositeImage с COMPOSITE_OVER помещает отдельную полосу в 120,270. saveSamplingNative сохраняет самостоятельный PNG; saveSamplingComparison размещает полные панели без изменения масштаба. Сохраните все файлы ZIP.

Сохранить карточку с аккуратно обработанной декоративной полосой

Полоса фильтруется отдельно с EDGE и ложится на карточку в (120,270). Край не подтягивает оранжевый цвет с противоположной стороны. Вся область артикула выше полосы сохранена. sampling-card.png — готовая самостоятельная карточка, filtered-strip.png — её вставка.

Сохранить карточку с аккуратно обработанной декоративной полосойПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/sampling-fixture.php';
[$source, $strip] = loadSamplingInputs();
$rgb = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$kernel = ImagickKernel::fromMatrix([array_fill(0, 9, 1 / 9)]);
$filtered = clone $strip;
$filtered->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
if (!$filtered->convolveImage($kernel, $rgb)) { throw new RuntimeException('Convolution failed'); }
$card = samplingPreview($source, 'white');
$card->compositeImage($filtered, Imagick::COMPOSITE_OVER, 120, 270);
saveSamplingNative($filtered, 'filtered-strip.png');
saveSamplingNative($card, 'sampling-card.png');
saveSamplingComparison([samplingPreview($source, 'white'), $strip, $filtered, $card], 'first-sampling.png');
echo "first-sampling.png\nfiltered-strip.png\nsampling-card.png\n";

Полоса фильтруется отдельно с EDGE и ложится на карточку в (120,270). Край не подтягивает оранжевый цвет с противоположной стороны. Вся область артикула выше полосы сохранена. sampling-card.png — готовая самостоятельная карточка, filtered-strip.png — её вставка. В одной папке нужны example.php, sampling-fixture.php, source.png.b64 и strip.png.b64; оставьте и остальные файлы ZIP. Команда: php example.php с Imagick. Сеть и шрифты не нужны. Полный открытый helper расположен ниже; он восстанавливает входы, собирает просмотры и сохраняет PNG, не скрывает три изучаемых метода, свёртку или FX.

Ожидаемый вывод
first-sampling.png
filtered-strip.png
sampling-card.png

Настройка сама по себе и последующее чтение

Вторая панель содержит только выбранные настройки и равна исходной полосе. Три следующие панели — разные чтения за границей одной свёрткой. Getter печатает код 3; это не три пикселя и не значение силы эффекта. Все результаты остаются 160×50.

Отделить сохранённую настройку от вызова, который читает пиксели

После входа: полоса только с настройками, затем её EDGE/TILE/BACKGROUND-свёртки. Настроенная полоса равна исходной; результаты фильтра отличаются у границы. Ни один режим не увеличил размер 160×50.

Отделить сохранённую настройку от вызова, который читает пикселиПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/sampling-fixture.php';
[$source, $strip] = loadSamplingInputs();
$rgb = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$kernel = ImagickKernel::fromMatrix([array_fill(0, 9, 1 / 9)]);
$configured = clone $strip;
$set = $configured->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$method = $configured->getImageVirtualPixelMethod();
$configured->setImageInterpolateMethod(Imagick::INTERPOLATE_BILINEAR);
$edge = clone $configured;
if (!$edge->convolveImage($kernel, $rgb)) { throw new RuntimeException('EDGE failed'); }
$tile = clone $strip; $tile->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TILE);
if (!$tile->convolveImage($kernel, $rgb)) { throw new RuntimeException('TILE failed'); }
$background = clone $strip; $background->setImageBackgroundColor('#203040');
$background->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_BACKGROUND);
if (!$background->convolveImage($kernel, $rgb)) { throw new RuntimeException('BACKGROUND failed'); }
saveSamplingComparison([samplingPreview($source, 'white'), $configured, $edge, $tile, $background], 'sampling-controls.png');
echo "sampling-controls.png\nset=" . (int)$set . " method=" . $method . "\n";

После входа: полоса только с настройками, затем её EDGE/TILE/BACKGROUND-свёртки. Настроенная полоса равна исходной; результаты фильтра отличаются у границы. Ни один режим не увеличил размер 160×50. В одной папке нужны example.php, sampling-fixture.php, source.png.b64 и strip.png.b64; оставьте и остальные файлы ZIP. Команда: php example.php с Imagick. Сеть и шрифты не нужны. Полный открытый helper расположен ниже; он восстанавливает входы, собирает просмотры и сохраняет PNG, не скрывает три изучаемых метода, свёртку или FX.

Ожидаемый вывод
sampling-controls.png
set=1 method=3

Выбрать смысл границы перед фильтром

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

$image уже содержит изображение. $ задаёт имя переменной; = присваивает результат; -> вызывает метод объекта; () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса Imagick. int — целый код настройки, bool — true/false как статус. Не записывайте статус setter обратно в $image.

$ok = $image->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);

У нашего RGB-орнамента этот вызов сохранил пиксели и размер. Только следующий фильтр читает за краем. EDGE продолжает край, TILE повторяет растр, BACKGROUND читает цвет из setImageBackgroundColor. Нужен именно метод-потребитель, учитывающий это свойство.

В полной программе clone создаёт рабочую копию, [] записывает массив, | объединяет маски красного/зелёного/синего каналов. if проверяет условие, ! отрицает статус, throw new RuntimeException останавливает цепочку при отказе. echo выводит текст, . соединяет строки, "\n" переводит строку; (int) показывает bool как 0/1. Основы: объекты, массивы, исключения.

EDGE для изолированной полосы и TILE для периодического предположения
EDGE для изолированной полосы и TILE для периодического предположения

Не смешать противоположные края отдельного орнамента

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

Не смешать противоположные края отдельного орнаментаПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/sampling-fixture.php';
[$source, $strip] = loadSamplingInputs();
$rgb = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$kernel = ImagickKernel::fromMatrix([array_fill(0, 9, 1 / 9)]);
$edge = clone $strip; $edge->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
if (!$edge->convolveImage($kernel, $rgb)) { throw new RuntimeException('EDGE failed'); }
$tile = clone $strip; $tile->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TILE);
if (!$tile->convolveImage($kernel, $rgb)) { throw new RuntimeException('TILE failed'); }
saveSamplingComparison([samplingPreview($source, 'white'), $strip, $edge, $tile], 'virtual-edge.png');
echo "virtual-edge.png\n";

Исходная полоса, EDGE и TILE показаны полностью. EDGE повторяет ближайший край при чтении за растром; TILE оборачивает координату и берёт другой край. Это выбор смысла границы, а не универсальный рейтинг качества. В одной папке нужны example.php, sampling-fixture.php, source.png.b64 и strip.png.b64; оставьте и остальные файлы ZIP. Команда: php example.php с Imagick. Сеть и шрифты не нужны. Полный открытый helper расположен ниже; он восстанавливает входы, собирает просмотры и сохраняет PNG, не скрывает три изучаемых метода, свёртку или FX.

Ожидаемый вывод
virtual-edge.png

Для повторяемой бесшовной текстуры TILE может быть нужным. Наши края специально различаются, поэтому перенос цвета виден. BACKGROUND означает предположение о цвете за краем: setImageBackgroundColor задаёт #203040 до фильтра, а не рисует готовую рамку. В обеих карточках меняется только прямоугольник 160×50 в 120,270.

Продолжить край либо учитывать внешний цвет при фильтрации отдельной вставки
Продолжить край либо учитывать внешний цвет при фильтрации отдельной вставки

Выбрать поведение края для готовой карточки

Обе карточки используют один орнамент в (120,270). EDGE продолжает край; BACKGROUND читает снаружи явно заданный #203040 и затемняет узкие внешние полосы свёртки. Настройка background сама не рисует рамку. Артикул и остальные пиксели карточки за пределами вставки сохранены.

Выбрать поведение края для готовой карточкиПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/sampling-fixture.php';
[$source, $strip] = loadSamplingInputs();
$rgb = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$kernel = ImagickKernel::fromMatrix([array_fill(0, 9, 1 / 9)]);
$edge = clone $strip; $edge->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
if (!$edge->convolveImage($kernel, $rgb)) { throw new RuntimeException('EDGE failed'); }
$paper = clone $strip; $paper->setImageBackgroundColor('#203040');
$paper->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_BACKGROUND);
if (!$paper->convolveImage($kernel, $rgb)) { throw new RuntimeException('BACKGROUND failed'); }
$edgeCard = samplingPreview($source, 'white'); $edgeCard->compositeImage($edge, Imagick::COMPOSITE_OVER, 120, 270);
$paperCard = samplingPreview($source, 'white'); $paperCard->compositeImage($paper, Imagick::COMPOSITE_OVER, 120, 270);
saveSamplingNative($paperCard, 'background-card.png');
saveSamplingComparison([samplingPreview($source, 'white'), $edgeCard, $paperCard], 'virtual-policy.png');
echo "virtual-policy.png\n";

Обе карточки используют один орнамент в (120,270). EDGE продолжает край; BACKGROUND читает снаружи явно заданный #203040 и затемняет узкие внешние полосы свёртки. Настройка background сама не рисует рамку. Артикул и остальные пиксели карточки за пределами вставки сохранены. В одной папке нужны example.php, sampling-fixture.php, source.png.b64 и strip.png.b64; оставьте и остальные файлы ZIP. Команда: php example.php с Imagick. Сеть и шрифты не нужны. Полный открытый helper расположен ниже; он восстанавливает входы, собирает просмотры и сохраняет PNG, не скрывает три изучаемых метода, свёртку или FX.

Ожидаемый вывод
virtual-policy.png

Прочитать, перенести и восстановить политику

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

$image уже содержит изображение. $ задаёт имя переменной; = присваивает результат; -> вызывает метод объекта; () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса Imagick. int — целый код настройки, bool — true/false как статус. Не записывайте статус setter обратно в $image.

$method = $image->getImageVirtualPixelMethod();
$isEdge = ($method === Imagick::VIRTUALPIXELMETHOD_EDGE);

=== сравнивает значение и тип; $isEdge — bool-ответ на наш вопрос, а $method остаётся int. Getter не фильтрует, не измеряет фон и не возвращает предыдущую настройку. Задайте ожидаемую политику явно: default произвольного файла здесь не фиксируется.

В полной программе clone создаёт рабочую копию, [] записывает массив, | объединяет маски красного/зелёного/синего каналов. if проверяет условие, ! отрицает статус, throw new RuntimeException останавливает цепочку при отказе. echo выводит текст, . соединяет строки, "\n" переводит строку; (int) показывает bool как 0/1. Основы: объекты, массивы, исключения.

Прочитать правило, перенести его и восстановить после временного изменения
Прочитать правило, перенести его и восстановить после временного изменения

Прочитать и перенести выбранную политику в рабочую копию

Getter возвращает int-код EDGE=3 этой сборки. Передаём его setter рабочей копии, затем явно запускаем фильтр. Число не является ни шириной, ни bool-статусом, ни доказательством поведения любого будущего метода.

Прочитать и перенести выбранную политику в рабочую копиюПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/sampling-fixture.php';
[$source, $strip] = loadSamplingInputs();
$rgb = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$kernel = ImagickKernel::fromMatrix([array_fill(0, 9, 1 / 9)]);
$strip->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$method = $strip->getImageVirtualPixelMethod();
$copy = clone $strip; $copy->setImageVirtualPixelMethod($method);
if (!$copy->convolveImage($kernel, $rgb)) { throw new RuntimeException('Copied policy failed'); }
saveSamplingComparison([samplingPreview($source, 'white'), $strip, $copy], 'virtual-read.png');
echo "virtual-read.png\nmethod=" . $method . "\n";

Getter возвращает int-код EDGE=3 этой сборки. Передаём его setter рабочей копии, затем явно запускаем фильтр. Число не является ни шириной, ни bool-статусом, ни доказательством поведения любого будущего метода. В одной папке нужны example.php, sampling-fixture.php, source.png.b64 и strip.png.b64; оставьте и остальные файлы ZIP. Команда: php example.php с Imagick. Сеть и шрифты не нужны. Полный открытый helper расположен ниже; он восстанавливает входы, собирает просмотры и сохраняет PNG, не скрывает три изучаемых метода, свёртку или FX.

Ожидаемый вывод
virtual-read.png
method=3

Когда обработчик временно меняет чужую настройку, сначала сохраняем её. try отмечает выполняемый участок; finally выполняет восстановление и при нормальном завершении, и при исключении. Это восстановление состояния, не отмена уже сделанного результата. Мы фильтруем отдельную копию $temporary, затем восстанавливаем политику $strip и получаем второй результат.

Временно проверить TILE и восстановить прежнее правило чтения

В середине результат временного TILE, справа результат восстановленного EDGE. Getter сохраняет предыдущую настройку; finally восстанавливает её даже при исключении. Обрабатывается копия полосы, исходный товар и его артикул не меняются.

Временно проверить TILE и восстановить прежнее правило чтенияПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/sampling-fixture.php';
[$source, $strip] = loadSamplingInputs();
$rgb = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$kernel = ImagickKernel::fromMatrix([array_fill(0, 9, 1 / 9)]);
$strip->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$previous = $strip->getImageVirtualPixelMethod();
try {
    $strip->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TILE);
    $temporary = clone $strip;
    if (!$temporary->convolveImage($kernel, $rgb)) { throw new RuntimeException('Temporary policy failed'); }
} finally {
    $strip->setImageVirtualPixelMethod($previous);
}
$restored = clone $strip;
if (!$restored->convolveImage($kernel, $rgb)) { throw new RuntimeException('Restored policy failed'); }
saveSamplingComparison([samplingPreview($source, 'white'), $temporary, $restored], 'virtual-restore.png');
echo "virtual-restore.png\nrestored=" . $strip->getImageVirtualPixelMethod() . "\n";

В середине результат временного TILE, справа результат восстановленного EDGE. Getter сохраняет предыдущую настройку; finally восстанавливает её даже при исключении. Обрабатывается копия полосы, исходный товар и его артикул не меняются. В одной папке нужны example.php, sampling-fixture.php, source.png.b64 и strip.png.b64; оставьте и остальные файлы ZIP. Команда: php example.php с Imagick. Сеть и шрифты не нужны. Полный открытый helper расположен ниже; он восстанавливает входы, собирает просмотры и сохраняет PNG, не скрывает три изучаемых метода, свёртку или FX.

Ожидаемый вывод
virtual-restore.png
restored=3

Выбрать отсчёт между целыми координатами

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

$image уже содержит изображение. $ задаёт имя переменной; = присваивает результат; -> вызывает метод объекта; () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса Imagick. int — целый код настройки, bool — true/false как статус. Не записывайте статус setter обратно в $image.

Координаты x/y измеряются в пикселях, верхний левый отсчёт 0,0. В выражении FX i/j — текущий выходной столбец/строка; p{x,y} читает абсолютную координату источника. Поэтому p{i+0.5,j} спрашивает источник на полпикселя правее выходной позиции. Это обратное чтение, а не перенос рисунка вправо. fxImage возвращает новый Imagick, его обязательно сохраняем в отдельную переменную:

$ok = $image->setImageInterpolateMethod(Imagick::INTERPOLATE_BILINEAR);
$sampled = $image->fxImage('p{i+0.5,j}');

Для непрозрачных соседей 40 и 200 по красному каналу в середине получаем (40+200)/2=120. NEAREST_PIXEL выбирает 200, floor — математическое округление вниз: например, floor(2.5)=2. INTEGER из ограниченной проверки выбирал эту целую координату и 40. RGB означает красную, зелёную и синюю компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно. У активной alpha RGB-смешивание взвешивается по непрозрачности; простое среднее RGBA неверно.

В полной программе clone создаёт рабочую копию, [] записывает массив, | объединяет маски красного/зелёного/синего каналов. if проверяет условие, ! отрицает статус, throw new RuntimeException останавливает цепочку при отказе. echo выводит текст, . соединяет строки, "\n" переводит строку; (int) показывает bool как 0/1. Основы: объекты, массивы, исключения.

Одна half-coordinate выборка: тонкий RGB-штрих и отдельная RGBA-вставка
Одна half-coordinate выборка: тонкий RGB-штрих и отдельная RGBA-вставка

Выбрать чтение тонкого штриха между соседними пикселями

После исходной полосы идут nearest и bilinear при одной координате чтения p{i+0.5,j}. Первый выбирает следующий целый отсчёт, второй смешивает соседние цвета. Это сдвиг выборки без изменения размера; bilinear может уменьшить контраст тонкого штриха.

Выбрать чтение тонкого штриха между соседними пикселямиПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/sampling-fixture.php';
[$source, $strip] = loadSamplingInputs();
$rgb = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$kernel = ImagickKernel::fromMatrix([array_fill(0, 9, 1 / 9)]);
$nearestInput = clone $strip; $nearestInput->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$nearestInput->setImageInterpolateMethod(Imagick::INTERPOLATE_NEAREST_PIXEL);
$nearest = $nearestInput->fxImage('p{i+0.5,j}');
$linearInput = clone $strip; $linearInput->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$linearInput->setImageInterpolateMethod(Imagick::INTERPOLATE_BILINEAR);
$linear = $linearInput->fxImage('p{i+0.5,j}');
saveSamplingNative($linear, 'shifted-strip.png');
saveSamplingComparison([samplingPreview($source, 'white'), $strip, $nearest, $linear], 'interpolate-strip.png');
echo "interpolate-strip.png\n";

После исходной полосы идут nearest и bilinear при одной координате чтения p{i+0.5,j}. Первый выбирает следующий целый отсчёт, второй смешивает соседние цвета. Это сдвиг выборки без изменения размера; bilinear может уменьшить контраст тонкого штриха. В одной папке нужны example.php, sampling-fixture.php, source.png.b64 и strip.png.b64; оставьте и остальные файлы ZIP. Команда: php example.php с Imagick. Сеть и шрифты не нужны. Полный открытый helper расположен ниже; он восстанавливает входы, собирает просмотры и сохраняет PNG, не скрывает три изучаемых метода, свёртку или FX.

Ожидаемый вывод
interpolate-strip.png

При активной alpha невидимый красный отсчёт не должен стать красным ореолом у видимого синего. Наша маленькая проверка A=0/red и A=1/blue дала при bilinear синий RGB и A≈0.5, а не фиолетовый RGB. Это объясняет взвешивание; полный реальный результат ниже берётся из сохранённого PNG. Для другой геометрии, профиля и обработчика отдельно проверяют его контракт. getImageRegion извлекает полную кружку 160×190, setImagePage обнуляет виртуальное положение; FX читает её координаты, а исходный товар не изменяется.

Подготовить прозрачную вставку с дробной выборкой и проверить её на двух фонах

Полная вставка кружки извлекается из (232,72), исходный артикул не затрагивается. shifted-mug.png хранит RGBA 160×190; белый и тёмный просмотры показывают одни сохранённые пиксели. В этой операции RGB у прозрачных границ взвешивается по alpha; это не независимое среднее четырёх каналов.

Подготовить прозрачную вставку с дробной выборкой и проверить её на двух фонахПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/sampling-fixture.php';
[$source, $strip] = loadSamplingInputs();
$rgb = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$kernel = ImagickKernel::fromMatrix([array_fill(0, 9, 1 / 9)]);
$mug = $source->getImageRegion(160, 190, 232, 72);
$mug->setImagePage(0, 0, 0, 0);
$mug->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$mug->setImageInterpolateMethod(Imagick::INTERPOLATE_BILINEAR);
$shifted = $mug->fxImage('p{i+0.5,j}');
saveSamplingNative($shifted, 'shifted-mug.png', true);
saveSamplingComparison([samplingPreview($source, 'white'), samplingPreview($mug, 'white'), samplingPreview($shifted, 'white'), samplingPreview($shifted, '#243c4d')], 'interpolate-alpha.png');
echo "interpolate-alpha.png\nshifted-mug.png\n";

Полная вставка кружки извлекается из (232,72), исходный артикул не затрагивается. shifted-mug.png хранит RGBA 160×190; белый и тёмный просмотры показывают одни сохранённые пиксели. В этой операции RGB у прозрачных границ взвешивается по alpha; это не независимое среднее четырёх каналов. В одной папке нужны example.php, sampling-fixture.php, source.png.b64 и strip.png.b64; оставьте и остальные файлы ZIP. Команда: php example.php с Imagick. Сеть и шрифты не нужны. Полный открытый helper расположен ниже; он восстанавливает входы, собирает просмотры и сохраняет PNG, не скрывает три изучаемых метода, свёртку или FX.

Ожидаемый вывод
interpolate-alpha.png
shifted-mug.png

Проверить края, alpha и потребителя настройки

НаблюдениеПроверка и действие
Настройка не дала видимого эффектаСначала нужен потребитель, который читает это поле. В этих примерах свёртка использует правило края, а FX — выбранный способ интерполяции; другая операция может иметь собственные настройки.
Размер не выросVirtual pixels — правило чтения внешних координат. Для реальных полей нужен новый canvas: полотно и область.
После TILE появился чужой цветПротивоположные края не образуют периодическую текстуру. Выберите EDGE либо известный внешний фон и повторно обработайте исходную копию.
Тонкий штрих стал менее контрастнымBilinear смешивает значения. Nearest сохраняет выбранный отсчёт, но не обещает гладкость/сохранение геометрии. Цель и масштаб определяют выбор.
Пустой объект или неизвестная константаПроверенная проба дала ImagickException для трёх пустых вызовов. Сначала загрузите изображение; используйте фактически доступные имена IM7. Внешние размеры, память, enum whitelist и ошибки файла проверяются приложением.
Alpha выглядит белойБелый и тёмный preview — результат OVER для просмотра. shifted-mug.png отдельно хранит RGBA; фон редактора не измеряет alpha.

Сохранённые учебные файлы имеют 8 бит на компоненту, RGB color-type 2 или RGBA color-type 6. Свёртка и дробная RGB-выборка проверены с учётом округления до восьмибитных значений. Просмотр живого слоя и повторное наложение отдельно сохранённого RGBA могут различаться чуть больше чем на один уровень: вторая цепочка округляет промежуточную alpha ещё раз. Контроль no-op относится к выбранным входам/режимам; некоторые внутренние способы установки могут активировать alpha или менять colorspace. Не обещаем перенос внутренних настроек через любой формат, одинаковую визуализацию редакторов или восстановление потерянных деталей. FX интерпретирует выражение на пикселях; используем фиксированную доверенную строку и умеренные размеры. Отдельных скоростных измерений нет.

Весь переносимый helper
<?php
declare(strict_types=1);
function loadSamplingInputs(): array {
    $hashes = ['source' => 'f51e5780445e0f5130a7f23112b2a00618035afd5545b8e3042c7ccff09b617c', 'strip' => 'c005caa60842a4d9b113ca3dd3e3e9c107d148be37ea3a38e33e3a8e51797912'];
    $images = [];
    foreach ($hashes as $name => $hash) {
        $encoded = file_get_contents(__DIR__ . '/' . $name . '.png.b64');
        if ($encoded === false) { throw new RuntimeException('Cannot read ' . $name); }
        $bytes = base64_decode($encoded, true);
        if ($bytes === false || hash('sha256', $bytes) !== $hash) { throw new RuntimeException('Unexpected bytes for ' . $name); }
        if (file_put_contents(__DIR__ . '/' . $name . '.png', $bytes) === false) { throw new RuntimeException('Cannot restore ' . $name); }
        $images[$name] = new Imagick(__DIR__ . '/' . $name . '.png');
    }
    return [$images['source'], $images['strip']];
}
function samplingPreview(Imagick $image, string $background): Imagick {
    $preview = new Imagick();
    $preview->newImage($image->getImageWidth(), $image->getImageHeight(), $background);
    $preview->compositeImage($image, Imagick::COMPOSITE_OVER, 0, 0);
    return $preview;
}
function saveSamplingNative(Imagick $image, string $filename, bool $withAlpha=false): void {
    $saved = clone $image;
    $saved->setImageFormat('png'); $saved->setImageDepth(8);
    $saved->setOption('png:color-type', $withAlpha ? '6' : '2');
    if (!$saved->writeImage(__DIR__ . '/' . $filename)) { throw new RuntimeException('Cannot save ' . $filename); }
}
function saveSamplingComparison(array $panels, string $filename): void {
    $width = 0; $height = 0;
    foreach ($panels as $panel) { $width += $panel->getImageWidth(); $height = max($height, $panel->getImageHeight()); }
    $canvas = new Imagick(); $canvas->newImage($width, $height, 'white'); $x = 0;
    foreach ($panels as $panel) {
        $canvas->compositeImage($panel, Imagick::COMPOSITE_OVER, $x, intdiv($height - $panel->getImageHeight(), 2));
        $x += $panel->getImageWidth();
    }
    saveSamplingNative($canvas, $filename);
}
Реальная задача из обсужденияНаш ответ и граница
SO 29022575При добавлении реального бордюра спрайта нужны новые пиксели и геометрия. Виртуальная граница сама не расширяет canvas; наш фильтр остаётся 160×50.
SO 41722188Название interpolation setter не доказывает, что его читает выбранная операция. Мы проверяем конкретный FX-потребитель по Core и двум известным отсчётам; не переносим старые номера констант GD/IM6.
SO 39485178Двумерное смешивание четырёх цветов требует понятных весов. Здесь объясняем простой горизонтальный частный случай половинных весов; генерацию цветового поля рассматривает другая глава.
SO 78812571Фон и virtual policy влияют на край размытия, но сами не создают нужную направленную внутреннюю тень. Наш BACKGROUND показывает край фиксированной свёртки, не реализует CSS inset-shadow.
SO 40948437Перспективное преобразование может запросить источник вне растра; политика чтения и размер выходного полотна — разные решения. Мы не выдаём простой fractional sample за коррекцию перспективы.
SO 38200170Тоновая формула для alpha и координатная выборка — разные задачи. Наш FX читает существующие RGBA-отсчёты; он не строит маску по близости цвета и не сегментирует товар.

Предсказать четверть пикселя и продолжить

Внешняя координата → virtual policy; дробная координата → interpolation; прежняя политика → getter
Внешняя координата → virtual policy; дробная координата → interpolation; прежняя политика → getter

Упражнение: заменить в RGB-полосе half-coordinate p{i+0.5,j} на p{i+0.25,j}. До запуска предположите значение между 40 и 200 при bilinear: 0.75×40+0.25×200=80. Nearest при этой доле выбирает 40. Решение: измените только доверенную FX-строку и отдельно проверьте новый результат; свидетельства этого урока относятся к исходным восьми программам с 0.5. У краёв дополнительно действует virtual policy.

Дальше: ядра и свёртка, активность alpha, самостоятельная вставка и поля, таблица CLUT и её настройка интерполяции, бесшовная текстура. Исторические методы/aliases остаются отдельными узлами полного справочника; этот пакет их не исключает.

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

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

Imagick::setImageVirtualPixelMethodСохраняет правило чтения координат за пределами текущего растра; возвращает bool, не новое изображение.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::setImageVirtualPixelMethod(int $method): bool

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

$image уже содержит изображение. $ задаёт имя переменной; = присваивает результат; -> вызывает метод объекта; () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса Imagick. int — целый код настройки, bool — true/false как статус. Не записывайте статус setter обратно в $image.

$ok = $image->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);

У нашего RGB-орнамента этот вызов сохранил пиксели и размер. Только следующий фильтр читает за краем. EDGE продолжает край, TILE повторяет растр, BACKGROUND читает цвет из setImageBackgroundColor. Нужен именно метод-потребитель, учитывающий это свойство.

В полной программе clone создаёт рабочую копию, [] записывает массив, | объединяет маски красного/зелёного/синего каналов. if проверяет условие, ! отрицает статус, throw new RuntimeException останавливает цепочку при отказе. echo выводит текст, . соединяет строки, "\n" переводит строку; (int) показывает bool как 0/1. Основы: объекты, массивы, исключения.

Полный официальный контракт и уточнения проверенной версии

Imagick::setImageVirtualPixelMethod(int $method): bool
ПараметрЗначение
$methodОбязательный int — именованная константа Imagick::VIRTUALPIXELMETHOD_*. В примерах EDGE, TILE и BACKGROUND. Это код политики, не радиус, проценты, цвет или Quantum-значение.

Sets the image virtual pixel method. Официальная доступность: PECL imagick 2, PECL imagick 3. Возврат: Returns true on success. В этих трёх raw-записях нет исходных примеров или таблиц изменений; полный XML сохранён целиком, включая пустые разделы. Мы добавляем собственные программы, не выдавая их за официальный пример.

В Imagick 3.8.1 PHP-обёртка проверяет непустой объект, вызывает внутреннюю установку настройки и возвращает true; старый enum, который возвращает внутренний вызов, PHP-обёртка отбрасывает. Это статус настройки, не доказательство результата фильтра. В EDGE/TILE/непрозрачном BACKGROUND наша проба на RGB и RGBA дала точное сохранение пикселей и alpha. Это ограниченный факт: другие ветви библиотеки ImageMagick, например TRANSPARENT или прозрачный BACKGROUND, могут активировать alpha; цветной фон для gray может менять цветовое пространство. Не обещаем неизменность пикселей для любого кода настройки и любого входа.

Один ограниченный предварительный запуск: PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 Q16. Все три метода на пустом объекте дали ImagickException. Неверный PHP-тип может дать TypeError; неизвестный int не обязан быть отвергнут внутренним вызовом установки, поэтому для внешнего выбора нужна собственная проверка по разрешённым именованным константам. Наши программы используют фиксированные известные константы. Они не реализуют форму ввода или универсальную enum-валидацию. Крупные копии/FX требуют памяти и времени; скорость не измерялась.

Полный официальный XML без сокращения
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimagevirtualpixelmethod">
 <refnamediv>
  <refname>Imagick::setImageVirtualPixelMethod</refname>
  <refpurpose>Sets the image virtual pixel method</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageVirtualPixelMethod</methodname>
   <methodparam><type>int</type><parameter>method</parameter></methodparam>
  </methodsynopsis>
  <para>
   Sets the image virtual pixel method.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>method</parameter></term>
     <listitem>
      <para>
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </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
-->

Не смешать противоположные края отдельного орнамента

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

Не смешать противоположные края отдельного орнаментаПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/sampling-fixture.php';
[$source, $strip] = loadSamplingInputs();
$rgb = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$kernel = ImagickKernel::fromMatrix([array_fill(0, 9, 1 / 9)]);
$edge = clone $strip; $edge->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
if (!$edge->convolveImage($kernel, $rgb)) { throw new RuntimeException('EDGE failed'); }
$tile = clone $strip; $tile->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TILE);
if (!$tile->convolveImage($kernel, $rgb)) { throw new RuntimeException('TILE failed'); }
saveSamplingComparison([samplingPreview($source, 'white'), $strip, $edge, $tile], 'virtual-edge.png');
echo "virtual-edge.png\n";

Исходная полоса, EDGE и TILE показаны полностью. EDGE повторяет ближайший край при чтении за растром; TILE оборачивает координату и берёт другой край. Это выбор смысла границы, а не универсальный рейтинг качества. В одной папке нужны example.php, sampling-fixture.php, source.png.b64 и strip.png.b64; оставьте и остальные файлы ZIP. Команда: php example.php с Imagick. Сеть и шрифты не нужны. Полный открытый helper расположен ниже; он восстанавливает входы, собирает просмотры и сохраняет PNG, не скрывает три изучаемых метода, свёртку или FX.

Ожидаемый вывод
virtual-edge.png

Выбрать поведение края для готовой карточки

Обе карточки используют один орнамент в (120,270). EDGE продолжает край; BACKGROUND читает снаружи явно заданный #203040 и затемняет узкие внешние полосы свёртки. Настройка background сама не рисует рамку. Артикул и остальные пиксели карточки за пределами вставки сохранены.

Выбрать поведение края для готовой карточкиПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/sampling-fixture.php';
[$source, $strip] = loadSamplingInputs();
$rgb = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$kernel = ImagickKernel::fromMatrix([array_fill(0, 9, 1 / 9)]);
$edge = clone $strip; $edge->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
if (!$edge->convolveImage($kernel, $rgb)) { throw new RuntimeException('EDGE failed'); }
$paper = clone $strip; $paper->setImageBackgroundColor('#203040');
$paper->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_BACKGROUND);
if (!$paper->convolveImage($kernel, $rgb)) { throw new RuntimeException('BACKGROUND failed'); }
$edgeCard = samplingPreview($source, 'white'); $edgeCard->compositeImage($edge, Imagick::COMPOSITE_OVER, 120, 270);
$paperCard = samplingPreview($source, 'white'); $paperCard->compositeImage($paper, Imagick::COMPOSITE_OVER, 120, 270);
saveSamplingNative($paperCard, 'background-card.png');
saveSamplingComparison([samplingPreview($source, 'white'), $edgeCard, $paperCard], 'virtual-policy.png');
echo "virtual-policy.png\n";

Обе карточки используют один орнамент в (120,270). EDGE продолжает край; BACKGROUND читает снаружи явно заданный #203040 и затемняет узкие внешние полосы свёртки. Настройка background сама не рисует рамку. Артикул и остальные пиксели карточки за пределами вставки сохранены. В одной папке нужны example.php, sampling-fixture.php, source.png.b64 и strip.png.b64; оставьте и остальные файлы ZIP. Команда: php example.php с Imagick. Сеть и шрифты не нужны. Полный открытый helper расположен ниже; он восстанавливает входы, собирает просмотры и сохраняет PNG, не скрывает три изучаемых метода, свёртку или FX.

Ожидаемый вывод
virtual-policy.png
Imagick::getImageVirtualPixelMethodЧитает сохранённый int-код virtual pixel method текущего изображения.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::getImageVirtualPixelMethod(): int

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

$image уже содержит изображение. $ задаёт имя переменной; = присваивает результат; -> вызывает метод объекта; () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса Imagick. int — целый код настройки, bool — true/false как статус. Не записывайте статус setter обратно в $image.

$method = $image->getImageVirtualPixelMethod();
$isEdge = ($method === Imagick::VIRTUALPIXELMETHOD_EDGE);

=== сравнивает значение и тип; $isEdge — bool-ответ на наш вопрос, а $method остаётся int. Getter не фильтрует, не измеряет фон и не возвращает предыдущую настройку. Задайте ожидаемую политику явно: default произвольного файла здесь не фиксируется.

В полной программе clone создаёт рабочую копию, [] записывает массив, | объединяет маски красного/зелёного/синего каналов. if проверяет условие, ! отрицает статус, throw new RuntimeException останавливает цепочку при отказе. echo выводит текст, . соединяет строки, "\n" переводит строку; (int) показывает bool как 0/1. Основы: объекты, массивы, исключения.

Полный официальный контракт и уточнения проверенной версии

Imagick::getImageVirtualPixelMethod(): int
ПараметрЗначение
Нет аргументовПустые скобки (). Возвращает int, который можно сравнить с именованной константой или передать setter другой картинки. Код 0/UNDEFINED не равен ошибке bool false.

Returns the virtual pixel method for the specified image. Официальная доступность: PECL imagick 2, PECL imagick 3. Возврат: Returns the virtual pixel method on success. В этих трёх raw-записях нет исходных примеров или таблиц изменений; полный XML сохранён целиком, включая пустые разделы. Мы добавляем собственные программы, не выдавая их за официальный пример.

Метод чтения возвращает текущий код настройки конкретного изображения, а не список поддерживаемых методов и не фактически выбранную стратегию любого обработчика. В этой сборке EDGE=3, TILE=6, BACKGROUND=1; в коде используем имена, а не переносим эти числа между сборками. UNDEFINED является кодом настройки; не трактуйте его как false. Getter полезен для отчёта, переноса и восстановления состояния. Сериализация PNG не обещает перенос любого внутреннего состояния в чужой reader: задавайте необходимую политику после загрузки.

Один ограниченный предварительный запуск: PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 Q16. Все три метода на пустом объекте дали ImagickException. Неверный PHP-тип может дать TypeError; неизвестный int не обязан быть отвергнут внутренним вызовом установки, поэтому для внешнего выбора нужна собственная проверка по разрешённым именованным константам. Наши программы используют фиксированные известные константы. Они не реализуют форму ввода или универсальную enum-валидацию. Крупные копии/FX требуют памяти и времени; скорость не измерялась.

Полный официальный XML без сокращения
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimagevirtualpixelmethod">
 <refnamediv>
  <refname>Imagick::getImageVirtualPixelMethod</refname>
  <refpurpose>Returns the virtual pixel method</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>int</type><methodname>Imagick::getImageVirtualPixelMethod</methodname>
   <void/>
  </methodsynopsis>
  <para>
   Returns the virtual pixel method for the specified image.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  &no.function.parameters;
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   Returns the virtual pixel method on success.
  </para>
 </refsect1>

 <refsect1 role="errors">
  &reftitle.errors;
  <para>
   &imagick.imagick.throws;
  </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
-->

Прочитать и перенести выбранную политику в рабочую копию

Getter возвращает int-код EDGE=3 этой сборки. Передаём его setter рабочей копии, затем явно запускаем фильтр. Число не является ни шириной, ни bool-статусом, ни доказательством поведения любого будущего метода.

Прочитать и перенести выбранную политику в рабочую копиюПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/sampling-fixture.php';
[$source, $strip] = loadSamplingInputs();
$rgb = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$kernel = ImagickKernel::fromMatrix([array_fill(0, 9, 1 / 9)]);
$strip->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$method = $strip->getImageVirtualPixelMethod();
$copy = clone $strip; $copy->setImageVirtualPixelMethod($method);
if (!$copy->convolveImage($kernel, $rgb)) { throw new RuntimeException('Copied policy failed'); }
saveSamplingComparison([samplingPreview($source, 'white'), $strip, $copy], 'virtual-read.png');
echo "virtual-read.png\nmethod=" . $method . "\n";

Getter возвращает int-код EDGE=3 этой сборки. Передаём его setter рабочей копии, затем явно запускаем фильтр. Число не является ни шириной, ни bool-статусом, ни доказательством поведения любого будущего метода. В одной папке нужны example.php, sampling-fixture.php, source.png.b64 и strip.png.b64; оставьте и остальные файлы ZIP. Команда: php example.php с Imagick. Сеть и шрифты не нужны. Полный открытый helper расположен ниже; он восстанавливает входы, собирает просмотры и сохраняет PNG, не скрывает три изучаемых метода, свёртку или FX.

Ожидаемый вывод
virtual-read.png
method=3

Временно проверить TILE и восстановить прежнее правило чтения

В середине результат временного TILE, справа результат восстановленного EDGE. Getter сохраняет предыдущую настройку; finally восстанавливает её даже при исключении. Обрабатывается копия полосы, исходный товар и его артикул не меняются.

Временно проверить TILE и восстановить прежнее правило чтенияПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/sampling-fixture.php';
[$source, $strip] = loadSamplingInputs();
$rgb = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$kernel = ImagickKernel::fromMatrix([array_fill(0, 9, 1 / 9)]);
$strip->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$previous = $strip->getImageVirtualPixelMethod();
try {
    $strip->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TILE);
    $temporary = clone $strip;
    if (!$temporary->convolveImage($kernel, $rgb)) { throw new RuntimeException('Temporary policy failed'); }
} finally {
    $strip->setImageVirtualPixelMethod($previous);
}
$restored = clone $strip;
if (!$restored->convolveImage($kernel, $rgb)) { throw new RuntimeException('Restored policy failed'); }
saveSamplingComparison([samplingPreview($source, 'white'), $temporary, $restored], 'virtual-restore.png');
echo "virtual-restore.png\nrestored=" . $strip->getImageVirtualPixelMethod() . "\n";

В середине результат временного TILE, справа результат восстановленного EDGE. Getter сохраняет предыдущую настройку; finally восстанавливает её даже при исключении. Обрабатывается копия полосы, исходный товар и его артикул не меняются. В одной папке нужны example.php, sampling-fixture.php, source.png.b64 и strip.png.b64; оставьте и остальные файлы ZIP. Команда: php example.php с Imagick. Сеть и шрифты не нужны. Полный открытый helper расположен ниже; он восстанавливает входы, собирает просмотры и сохраняет PNG, не скрывает три изучаемых метода, свёртку или FX.

Ожидаемый вывод
virtual-restore.png
restored=3
Imagick::setImageInterpolateMethodСохраняет способ вычислять отсчёт между целыми пикселями текущего изображения; возвращает bool.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::setImageInterpolateMethod(int $method): bool

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

$image уже содержит изображение. $ задаёт имя переменной; = присваивает результат; -> вызывает метод объекта; () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса Imagick. int — целый код настройки, bool — true/false как статус. Не записывайте статус setter обратно в $image.

Координаты x/y измеряются в пикселях, верхний левый отсчёт 0,0. В выражении FX i/j — текущий выходной столбец/строка; p{x,y} читает абсолютную координату источника. Поэтому p{i+0.5,j} спрашивает источник на полпикселя правее выходной позиции. Это обратное чтение, а не перенос рисунка вправо. fxImage возвращает новый Imagick, его обязательно сохраняем в отдельную переменную:

$ok = $image->setImageInterpolateMethod(Imagick::INTERPOLATE_BILINEAR);
$sampled = $image->fxImage('p{i+0.5,j}');

Для непрозрачных соседей 40 и 200 по красному каналу в середине получаем (40+200)/2=120. NEAREST_PIXEL выбирает 200, floor — математическое округление вниз: например, floor(2.5)=2. INTEGER из ограниченной проверки выбирал эту целую координату и 40. RGB означает красную, зелёную и синюю компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно. У активной alpha RGB-смешивание взвешивается по непрозрачности; простое среднее RGBA неверно.

В полной программе clone создаёт рабочую копию, [] записывает массив, | объединяет маски красного/зелёного/синего каналов. if проверяет условие, ! отрицает статус, throw new RuntimeException останавливает цепочку при отказе. echo выводит текст, . соединяет строки, "\n" переводит строку; (int) показывает bool как 0/1. Основы: объекты, массивы, исключения.

Полный официальный контракт и уточнения проверенной версии

Imagick::setImageInterpolateMethod(int $method): bool
ПараметрЗначение
$methodОбязательный int — константа Imagick::INTERPOLATE_*. Здесь IM7 INTERPOLATE_NEAREST_PIXEL и INTERPOLATE_BILINEAR. Это выбор алгоритма, не величина смещения. Само смещение задаёт FX-выражение.

Sets the image interpolate pixel method. Официальная доступность: PECL imagick 2, PECL imagick 3. Возврат: Returns true on success. В этих трёх raw-записях нет исходных примеров или таблиц изменений; полный XML сохранён целиком, включая пустые разделы. Мы добавляем собственные программы, не выдавая их за официальный пример.

IM7 экспортирует имя INTERPOLATE_NEAREST_PIXEL; старое INTERPOLATE_NEARESTNEIGHBOR из ответов про IM6 в этом runtime отсутствует. INTEGER берёт floor-координату, NEAREST_PIXEL — floor(x+0.5), BILINEAR использует веса соседей. Здесь fxImage действительно читает внутреннее поле C image->interpolate библиотеки ImageMagick, а setImageInterpolateMethod устанавливает именно его. Это не PHP-свойство объекта. При внутреннем отказе установки PHP-обёртка выбрасывает ImagickException. Не смешивайте его с setInterpolateMethod: известный CLUT-путь читает другую настройку внутри библиотеки. Wave/Spread имеют собственные версионные ограничения; они не использованы для доказательства этого урока. Интерполяция не является универсальной настройкой любого resize и не добавляет потерянные детали.

Один ограниченный предварительный запуск: PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46 Q16. Все три метода на пустом объекте дали ImagickException. Неверный PHP-тип может дать TypeError; неизвестный int не обязан быть отвергнут внутренним вызовом установки, поэтому для внешнего выбора нужна собственная проверка по разрешённым именованным константам. Наши программы используют фиксированные известные константы. Они не реализуют форму ввода или универсальную enum-валидацию. Крупные копии/FX требуют памяти и времени; скорость не измерялась.

Полный официальный XML без сокращения
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimageinterpolatemethod">
 <refnamediv>
  <refname>Imagick::setImageInterpolateMethod</refname>
  <refpurpose>Sets the image interpolate pixel method</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageInterpolateMethod</methodname>
   <methodparam><type>int</type><parameter>method</parameter></methodparam>
  </methodsynopsis>
  <para>
   Sets the image interpolate pixel method.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>method</parameter></term>
     <listitem>
      <para>
       The method is one of the <constant>Imagick::INTERPOLATE_<replaceable>*</replaceable></constant> constants
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </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
-->

Выбрать чтение тонкого штриха между соседними пикселями

После исходной полосы идут nearest и bilinear при одной координате чтения p{i+0.5,j}. Первый выбирает следующий целый отсчёт, второй смешивает соседние цвета. Это сдвиг выборки без изменения размера; bilinear может уменьшить контраст тонкого штриха.

Выбрать чтение тонкого штриха между соседними пикселямиПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/sampling-fixture.php';
[$source, $strip] = loadSamplingInputs();
$rgb = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$kernel = ImagickKernel::fromMatrix([array_fill(0, 9, 1 / 9)]);
$nearestInput = clone $strip; $nearestInput->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$nearestInput->setImageInterpolateMethod(Imagick::INTERPOLATE_NEAREST_PIXEL);
$nearest = $nearestInput->fxImage('p{i+0.5,j}');
$linearInput = clone $strip; $linearInput->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$linearInput->setImageInterpolateMethod(Imagick::INTERPOLATE_BILINEAR);
$linear = $linearInput->fxImage('p{i+0.5,j}');
saveSamplingNative($linear, 'shifted-strip.png');
saveSamplingComparison([samplingPreview($source, 'white'), $strip, $nearest, $linear], 'interpolate-strip.png');
echo "interpolate-strip.png\n";

После исходной полосы идут nearest и bilinear при одной координате чтения p{i+0.5,j}. Первый выбирает следующий целый отсчёт, второй смешивает соседние цвета. Это сдвиг выборки без изменения размера; bilinear может уменьшить контраст тонкого штриха. В одной папке нужны example.php, sampling-fixture.php, source.png.b64 и strip.png.b64; оставьте и остальные файлы ZIP. Команда: php example.php с Imagick. Сеть и шрифты не нужны. Полный открытый helper расположен ниже; он восстанавливает входы, собирает просмотры и сохраняет PNG, не скрывает три изучаемых метода, свёртку или FX.

Ожидаемый вывод
interpolate-strip.png

Подготовить прозрачную вставку с дробной выборкой и проверить её на двух фонах

Полная вставка кружки извлекается из (232,72), исходный артикул не затрагивается. shifted-mug.png хранит RGBA 160×190; белый и тёмный просмотры показывают одни сохранённые пиксели. В этой операции RGB у прозрачных границ взвешивается по alpha; это не независимое среднее четырёх каналов.

Подготовить прозрачную вставку с дробной выборкой и проверить её на двух фонахПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/sampling-fixture.php';
[$source, $strip] = loadSamplingInputs();
$rgb = Imagick::CHANNEL_RED | Imagick::CHANNEL_GREEN | Imagick::CHANNEL_BLUE;
$kernel = ImagickKernel::fromMatrix([array_fill(0, 9, 1 / 9)]);
$mug = $source->getImageRegion(160, 190, 232, 72);
$mug->setImagePage(0, 0, 0, 0);
$mug->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_EDGE);
$mug->setImageInterpolateMethod(Imagick::INTERPOLATE_BILINEAR);
$shifted = $mug->fxImage('p{i+0.5,j}');
saveSamplingNative($shifted, 'shifted-mug.png', true);
saveSamplingComparison([samplingPreview($source, 'white'), samplingPreview($mug, 'white'), samplingPreview($shifted, 'white'), samplingPreview($shifted, '#243c4d')], 'interpolate-alpha.png');
echo "interpolate-alpha.png\nshifted-mug.png\n";

Полная вставка кружки извлекается из (232,72), исходный артикул не затрагивается. shifted-mug.png хранит RGBA 160×190; белый и тёмный просмотры показывают одни сохранённые пиксели. В этой операции RGB у прозрачных границ взвешивается по alpha; это не независимое среднее четырёх каналов. В одной папке нужны example.php, sampling-fixture.php, source.png.b64 и strip.png.b64; оставьте и остальные файлы ZIP. Команда: php example.php с Imagick. Сеть и шрифты не нужны. Полный открытый helper расположен ниже; он восстанавливает входы, собирает просмотры и сохраняет PNG, не скрывает три изучаемых метода, свёртку или FX.

Ожидаемый вывод
interpolate-alpha.png
shifted-mug.png
Источники и обсуждения

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

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

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

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