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

Дерево руководства
Глава 363 · После RGBA и композиции OVER
Imagick: отдельная PNG-вставка и полотно с полями
Самостоятельный ярлык, прозрачная вставка, полный canvas и точное различие цвета пикселей и background metadata.
Получить отдельный ярлык и карточку с полями
Для инструкции нужен только ярлык с артикулом, а не вся товарная фотография. Сохраним этот фрагмент отдельным label.png и положим на небольшую карточку с ровными полями. Оригинальная PNG-наклейка останется полной: она пригодится для следующего макета и другого фона. Так получатель скачает готовое изображение, а не будет вручную вырезать нужный участок.
Собственный вход 400×320 уже содержит коробку, кружку, напечатанный ярлык и прозрачное отверстие ручки. Мы продолжаем работу с тем же RGBA-файлом предыдущей главы. Методы не ищут товар и не распознают текст: координаты известны заранее. Надписи — часть исходного растра, не новые измерения после обработки.


| Понятие до схемы | Конкретное значение |
|---|---|
| Координаты и размеры | x идёт вправо, y вниз; верхний левый пиксель 0,0. w/h — ширина/высота в пикселях. Для ярлыка x=72,y=140,w=156,h=50; в PHP порядок getImageRegion(w,h,x,y). |
| Полотно | Новый растр 220×100. Вставка 156×50 лежит в 32,25: (220−156)/2=32 и (100−50)/2=25. Новое полотно добавляет место, а выбор области уменьшает изображение. |
| Page | Метаданные виртуальной страницы: размер и offset изображения внутри неё. Это отдельно от реальных пикселей, от x/y наложения на новый canvas и от размещения панелей сравнения. |
| RGB / RGBA / alpha | Красная, зелёная и синяя компоненты; A — непрозрачность:0 прозрачно, 1 непрозрачно. Здесь PNG хранит 8 бит на компоненту:0..255, type2 для RGB и type6 для RGBA. Q=QuantumRange=65535 — внутренний максимум проверенной Q16-сборки, не ширина изображения. |
| Цвет заполнения / background | Третий аргумент newImage заполняет пиксели. getImageBackgroundColor читает отдельную настройку, которая может не совпасть с заполнением, углом и любым преобладающим цветом. |
| Три результата вызова | newImage→bool-статус в том же Imagick; getImageRegion→новый Imagick; getImageBackgroundColor→новый ImagickPixel. Ни один из этих возвратов сам не записывает файл. |

Самая маленькая запись
Переменная $image содержит картинку, $canvas — отдельный будущий холст. $ обозначает имя переменной, = присваивает результат. new Imagick() создаёт пустой объект; -> вызывает его метод; () содержит аргументы, запятые разделяют их, ; завершает инструкцию. Строки в кавычках — путь, цвет или формат. RGB — красная/зелёная/синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно. Сначала используем фиксированные размеры и координаты.
В первых двух позициях стоят размеры 156×50, затем точка 72,140. Полученный $label — новый объект; $image остаётся полным. Координаты начинаются с 0; выбранные столбцы 72..227, строки 140..189. setImagePage обнуляет виртуальную рамку самостоятельной вставки, не сдвигая её пиксели:
$label = $image->getImageRegion(156, 50, 72, 140);
$label->setImagePage(0, 0, 0, 0);В полной программе if проверяет условие, ! отрицает статус, throw new RuntimeException прекращает цепочку при отказе. clone копирует объект; echo выводит строку, . соединяет строки, "\n" добавляет перевод строки. Основы: объекты и методы, массивы, копии, исключения.
Самая маленькая запись
Переменная $image содержит картинку, $canvas — отдельный будущий холст. $ обозначает имя переменной, = присваивает результат. new Imagick() создаёт пустой объект; -> вызывает его метод; () содержит аргументы, запятые разделяют их, ; завершает инструкцию. Строки в кавычках — путь, цвет или формат. RGB — красная/зелёная/синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно. Сначала используем фиксированные размеры и координаты.
После первой строки $canvas — объект, после второго вызова он содержит полотно 220×100. Вызов возвращает true как статус; запись $canvas=$canvas->newImage(...) заменила бы объект логическим значением. Третий аргумент закрашивает сам растр, четвёртый выбирает формат объекта:
$canvas = new Imagick();
$created = $canvas->newImage(220, 100, '#e6edf1', 'png');В полной программе if проверяет условие, ! отрицает статус, throw new RuntimeException прекращает цепочку при отказе. clone копирует объект; echo выводит строку, . соединяет строки, "\n" добавляет перевод строки. Основы: объекты и методы, массивы, копии, исключения.
Самая маленькая запись
Переменная $image содержит картинку, $canvas — отдельный будущий холст. $ обозначает имя переменной, = присваивает результат. new Imagick() создаёт пустой объект; -> вызывает его метод; () содержит аргументы, запятые разделяют их, ; завершает инструкцию. Строки в кавычках — путь, цвет или формат. RGB — красная/зелёная/синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно. Сначала используем фиксированные размеры и координаты.
Сначала прочитаем настройку; $background теперь ImagickPixel. getColor(1) возвращает массив нормированных компонентов 0..1; 1 передаём именно целым числом. ['r'] читает красную компоненту по ключу, *255 переводит её для показа в обычную восьмибитную шкалу, round округляет, (int) делает целое число. Это чтение сохранённого цвета, а не анализ угла изображения:
$background = $image->getImageBackgroundColor();
$color = $background->getColor(1);
$red = (int)round(255 * $color['r']);В полной программе if проверяет условие, ! отрицает статус, throw new RuntimeException прекращает цепочку при отказе. clone копирует объект; echo выводит строку, . соединяет строки, "\n" добавляет перевод строки. Основы: объекты и методы, массивы, копии, исключения.
Перед полной программой: <?php открывает PHP; declare(strict_types=1) включает строгие типы. require подключает открытый helper из той же папки, __DIR__ — её путь. loadCanvasSource восстанавливает точный PNG из Base64 и проверяет SHA; это упаковка входа, не вырезание. setImageBackgroundColor задаёт настройку, которую затем читает getter. Imagick::COMPOSITE_OVER — именованная константа класса, :: обращается к ней; compositeImage накладывает ярлык в явной точке 32,25. Вспомогательная canvasPreview создаёт только подложку просмотра, saveCanvasNative записывает файл, saveCanvasComparison собирает полные панели. [] задаёт массив по порядку. Полный helper открыт ниже; функции, файлы и OVER объяснены отдельно.
Вынести готовый ярлык в отдельный PNG и сделать карточку с полями
Слева весь вход, в середине самостоятельная вставка label.png 156×50, справа label-card.png 220×100. Ярлык лежит в (32,25), поэтому слева/справа по 32 пикселя, сверху/снизу по 25. Вставка сохраняет alpha края, карточка смешана с непрозрачным светлым фоном.
<?php
declare(strict_types=1);
require __DIR__ . '/canvas-fixture.php';
$source = loadCanvasSource();
$label = $source->getImageRegion(156, 50, 72, 140);
$label->setImagePage(0, 0, 0, 0);
$source->setImageBackgroundColor('#e6edf1');
$background = $source->getImageBackgroundColor();
$card = new Imagick();
if (!$card->newImage(220, 100, $background, 'png')) { throw new RuntimeException('New card failed'); }
$card->compositeImage($label, Imagick::COMPOSITE_OVER, 32, 25);
saveCanvasNative($label, 'label.png', true);
saveCanvasNative($card, 'label-card.png', false);
saveCanvasComparison([canvasPreview($source, 'white'), canvasPreview($label, 'white'), $card], 'first-canvas.png');
echo "first-canvas.png\nlabel.png\nlabel-card.png\n";
Слева весь вход, в середине самостоятельная вставка label.png 156×50, справа label-card.png 220×100. Ярлык лежит в (32,25), поэтому слева/справа по 32 пикселя, сверху/снизу по 25. Вставка сохраняет alpha края, карточка смешана с непрозрачным светлым фоном. В одной папке нужны example.php, canvas-fixture.php и source.png.b64; сохраните также остальные файлы ZIP. Запуск: php example.php с Imagick. Все входы включены; PHP не требует сети и шрифтов. Главный PNG содержит полные панели сравнения без масштабирования; самостоятельные PNG перечислены в программе.
Ожидаемый вывод
first-canvas.png
label.png
label-card.png
Различить статус, картинку и объект цвета
Три метода имеют разные возвращаемые значения. В controls сохраняем статус newImage в $created, новую область в $region, цвет в $background. get_debug_type выводит имя PHP-типа, а (int) показывает bool как 0/1. Прозрачное пустое полотно выглядит как выбранная подложка просмотра; это не значит, что подложка закрашена в его RGBA.
Различить статус создания, новую область и объект цвета
После входа идут заполненное светлое полотно, пустое прозрачное полотно поверх тёмной подложки и новая область ярлыка. True от newImage — статус, getImageRegion возвращает Imagick, getter background возвращает ImagickPixel. Размеры панелей естественные, меньшие панели окружены белым контекстом сравнения.
<?php
declare(strict_types=1);
require __DIR__ . '/canvas-fixture.php';
$source = loadCanvasSource();
$canvas = new Imagick();
$created = $canvas->newImage(220, 100, '#e6edf1', 'png');
if (!$created) { throw new RuntimeException('New canvas failed'); }
$transparent = new Imagick();
if (!$transparent->newImage(220, 100, 'transparent', 'png')) { throw new RuntimeException('Transparent canvas failed'); }
$region = $source->getImageRegion(156, 50, 72, 140);
$background = $canvas->getImageBackgroundColor();
saveCanvasComparison([canvasPreview($source, 'white'), $canvas, canvasPreview($transparent, '#243c4d'), canvasPreview($region, 'white')], 'canvas-controls.png');
echo "canvas-controls.png\ncreated=" . (int)$created . " region=" . get_debug_type($region) . " background=" . get_debug_type($background) . "\n";
После входа идут заполненное светлое полотно, пустое прозрачное полотно поверх тёмной подложки и новая область ярлыка. True от newImage — статус, getImageRegion возвращает Imagick, getter background возвращает ImagickPixel. Размеры панелей естественные, меньшие панели окружены белым контекстом сравнения. В одной папке нужны example.php, canvas-fixture.php и source.png.b64; сохраните также остальные файлы ZIP. Запуск: php example.php с Imagick. Все входы включены; PHP не требует сети и шрифтов. Главный PNG содержит полные панели сравнения без масштабирования; самостоятельные PNG перечислены в программе.
Ожидаемый вывод
canvas-controls.png
created=1 region=Imagick background=ImagickPixel
Создать непрозрачную карточку или прозрачные поля
Самая маленькая запись
Переменная $image содержит картинку, $canvas — отдельный будущий холст. $ обозначает имя переменной, = присваивает результат. new Imagick() создаёт пустой объект; -> вызывает его метод; () содержит аргументы, запятые разделяют их, ; завершает инструкцию. Строки в кавычках — путь, цвет или формат. RGB — красная/зелёная/синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно. Сначала используем фиксированные размеры и координаты.
После первой строки $canvas — объект, после второго вызова он содержит полотно 220×100. Вызов возвращает true как статус; запись $canvas=$canvas->newImage(...) заменила бы объект логическим значением. Третий аргумент закрашивает сам растр, четвёртый выбирает формат объекта:
$canvas = new Imagick();
$created = $canvas->newImage(220, 100, '#e6edf1', 'png');В полной программе if проверяет условие, ! отрицает статус, throw new RuntimeException прекращает цепочку при отказе. clone копирует объект; echo выводит строку, . соединяет строки, "\n" добавляет перевод строки. Основы: объекты и методы, массивы, копии, исключения.

Добавить поля — значит создать большее полотно. Для входа 400×320 и полей 20 с каждой стороны получаем 440×360; накладываем исходник в 20,20. Прозрачный фон сохраняем в padded-sticker.png, а белый/тёмный вид показываем отдельно. Копия не меняет масштаб товара.
Создать полотно заданного размера для отдельной карточки ярлыка
В середине настоящий новый RGB-растр 220×100, справа тот же растр с ярлыком в (32,25). new-label-card.png — отдельный готовый результат. Параметр png задаёт формат объекта; файл появляется только после сохранения.
<?php
declare(strict_types=1);
require __DIR__ . '/canvas-fixture.php';
$source = loadCanvasSource();
$label = $source->getImageRegion(156, 50, 72, 140);
$label->setImagePage(0, 0, 0, 0);
$card = new Imagick();
if (!$card->newImage(220, 100, '#e6edf1', 'png')) { throw new RuntimeException('New card failed'); }
$blank = clone $card;
$card->compositeImage($label, Imagick::COMPOSITE_OVER, 32, 25);
saveCanvasNative($card, 'new-label-card.png', false);
saveCanvasComparison([canvasPreview($source, 'white'), $blank, $card], 'new-label.png');
echo "new-label.png\n";
В середине настоящий новый RGB-растр 220×100, справа тот же растр с ярлыком в (32,25). new-label-card.png — отдельный готовый результат. Параметр png задаёт формат объекта; файл появляется только после сохранения. В одной папке нужны example.php, canvas-fixture.php и source.png.b64; сохраните также остальные файлы ZIP. Запуск: php example.php с Imagick. Все входы включены; PHP не требует сети и шрифтов. Главный PNG содержит полные панели сравнения без масштабирования; самостоятельные PNG перечислены в программе.
Ожидаемый вывод
new-label.png
Добавить прозрачные поля вокруг всей PNG-наклейки
padded-sticker.png имеет полный размер 440×360 и 20 прозрачных пикселей с каждой стороны. Две правые панели показывают одни RGBA-пиксели на белом и тёмном. Исходные 400×320 не масштабируются и не обрезаются; alpha отверстия ручки остаётся прозрачной.
<?php
declare(strict_types=1);
require __DIR__ . '/canvas-fixture.php';
$source = loadCanvasSource();
$padded = new Imagick();
if (!$padded->newImage(440, 360, 'transparent', 'png')) { throw new RuntimeException('New transparent canvas failed'); }
$padded->compositeImage($source, Imagick::COMPOSITE_OVER, 20, 20);
saveCanvasNative($padded, 'padded-sticker.png', true);
saveCanvasComparison([canvasPreview($source, 'white'), canvasPreview($padded, 'white'), canvasPreview($padded, '#243c4d')], 'new-padded.png');
echo "new-padded.png\n";
padded-sticker.png имеет полный размер 440×360 и 20 прозрачных пикселей с каждой стороны. Две правые панели показывают одни RGBA-пиксели на белом и тёмном. Исходные 400×320 не масштабируются и не обрезаются; alpha отверстия ручки остаётся прозрачной. В одной папке нужны example.php, canvas-fixture.php и source.png.b64; сохраните также остальные файлы ZIP. Запуск: php example.php с Imagick. Все входы включены; PHP не требует сети и шрифтов. Главный PNG содержит полные панели сравнения без масштабирования; самостоятельные PNG перечислены в программе.
Ожидаемый вывод
new-padded.png
Извлечь две вставки и согласовать page
Самая маленькая запись
Переменная $image содержит картинку, $canvas — отдельный будущий холст. $ обозначает имя переменной, = присваивает результат. new Imagick() создаёт пустой объект; -> вызывает его метод; () содержит аргументы, запятые разделяют их, ; завершает инструкцию. Строки в кавычках — путь, цвет или формат. RGB — красная/зелёная/синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно. Сначала используем фиксированные размеры и координаты.
В первых двух позициях стоят размеры 156×50, затем точка 72,140. Полученный $label — новый объект; $image остаётся полным. Координаты начинаются с 0; выбранные столбцы 72..227, строки 140..189. setImagePage обнуляет виртуальную рамку самостоятельной вставки, не сдвигая её пиксели:
$label = $image->getImageRegion(156, 50, 72, 140);
$label->setImagePage(0, 0, 0, 0);В полной программе if проверяет условие, ! отрицает статус, throw new RuntimeException прекращает цепочку при отказе. clone копирует объект; echo выводит строку, . соединяет строки, "\n" добавляет перевод строки. Основы: объекты и методы, массивы, копии, исключения.

Получить самостоятельный точный фрагмент ярлыка без изменения исходника
label-extract.png содержит выбранные 156×50 пикселей исходника от (72,140). Нет изменения масштаба или интерполяции; alpha края сохраняется. Для самостоятельного файла page явно обнулён, исходное изображение не обрезано.
<?php
declare(strict_types=1);
require __DIR__ . '/canvas-fixture.php';
$source = loadCanvasSource();
$label = $source->getImageRegion(156, 50, 72, 140);
$label->setImagePage(0, 0, 0, 0);
saveCanvasNative($label, 'label-extract.png', true);
saveCanvasComparison([canvasPreview($source, 'white'), canvasPreview($label, 'white')], 'region-label.png');
echo "region-label.png\n";
label-extract.png содержит выбранные 156×50 пикселей исходника от (72,140). Нет изменения масштаба или интерполяции; alpha края сохраняется. Для самостоятельного файла page явно обнулён, исходное изображение не обрезано. В одной папке нужны example.php, canvas-fixture.php и source.png.b64; сохраните также остальные файлы ZIP. Запуск: php example.php с Imagick. Все входы включены; PHP не требует сети и шрифтов. Главный PNG содержит полные панели сравнения без масштабирования; самостоятельные PNG перечислены в программе.
Ожидаемый вывод
region-label.png
Для кружки берём 160×190 в 232,72. getImagePage возвращает массив, ['x']/['y'] читают смещение. После reset page пиксели не двигаются: задаём самостоятельной вставке нулевое виртуальное положение, а фактическое место на следующем canvas всё равно задаётся координатами compositeImage.

Сохранить прозрачную вставку кружки и обнулить её виртуальное положение
mug-insert.png — целая RGBA-вставка 160×190 из области (232,72). После извлечения текущий объект помнит page-offset232,72; reset задаёт 0,0 без изменения пикселей. Белая и тёмная панели — только два просмотра прозрачной вставки, а не два её фона.
<?php
declare(strict_types=1);
require __DIR__ . '/canvas-fixture.php';
$source = loadCanvasSource();
$mug = $source->getImageRegion(160, 190, 232, 72);
$pageBefore = $mug->getImagePage();
$mug->setImagePage(0, 0, 0, 0);
$pageAfter = $mug->getImagePage();
saveCanvasNative($mug, 'mug-insert.png', true);
saveCanvasComparison([canvasPreview($source, 'white'), canvasPreview($mug, 'white'), canvasPreview($mug, '#243c4d')], 'region-insert.png');
echo "region-insert.png\npage-before=" . $pageBefore['x'] . "," . $pageBefore['y'] . "\npage-after=" . $pageAfter['x'] . "," . $pageAfter['y'] . "\n";
mug-insert.png — целая RGBA-вставка 160×190 из области (232,72). После извлечения текущий объект помнит page-offset232,72; reset задаёт 0,0 без изменения пикселей. Белая и тёмная панели — только два просмотра прозрачной вставки, а не два её фона. В одной папке нужны example.php, canvas-fixture.php и source.png.b64; сохраните также остальные файлы ZIP. Запуск: php example.php с Imagick. Все входы включены; PHP не требует сети и шрифтов. Главный PNG содержит полные панели сравнения без масштабирования; самостоятельные PNG перечислены в программе.
Ожидаемый вывод
region-insert.png
page-before=232,72
page-after=0,0
Прочитать настройку и перенести явный цвет шаблона
Самая маленькая запись
Переменная $image содержит картинку, $canvas — отдельный будущий холст. $ обозначает имя переменной, = присваивает результат. new Imagick() создаёт пустой объект; -> вызывает его метод; () содержит аргументы, запятые разделяют их, ; завершает инструкцию. Строки в кавычках — путь, цвет или формат. RGB — красная/зелёная/синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно. Сначала используем фиксированные размеры и координаты.
Сначала прочитаем настройку; $background теперь ImagickPixel. getColor(1) возвращает массив нормированных компонентов 0..1; 1 передаём именно целым числом. ['r'] читает красную компоненту по ключу, *255 переводит её для показа в обычную восьмибитную шкалу, round округляет, (int) делает целое число. Это чтение сохранённого цвета, а не анализ угла изображения:
$background = $image->getImageBackgroundColor();
$color = $background->getColor(1);
$red = (int)round(255 * $color['r']);В полной программе if проверяет условие, ! отрицает статус, throw new RuntimeException прекращает цепочку при отказе. clone копирует объект; echo выводит строку, . соединяет строки, "\n" добавляет перевод строки. Основы: объекты и методы, массивы, копии, исключения.

Не принять настройку background за цвет реального поля
Тёмное полотно заполнено через newImage, но его metadata background в проверенной сборке белая. Чтение настройки и создание нового поля этим цветом даёт белую панель справа. filled-canvas.png остаётся тёмным: getter не измеряет пиксели и не ищет доминирующий цвет.
<?php
declare(strict_types=1);
require __DIR__ . '/canvas-fixture.php';
$source = loadCanvasSource();
$filled = new Imagick();
if (!$filled->newImage(220, 100, '#243c4d', 'png')) { throw new RuntimeException('New filled canvas failed'); }
$background = $filled->getImageBackgroundColor();
$fromSetting = new Imagick();
if (!$fromSetting->newImage(220, 100, $background, 'png')) { throw new RuntimeException('New metadata canvas failed'); }
$color = $background->getColor(1);
saveCanvasNative($filled, 'filled-canvas.png', false);
saveCanvasComparison([canvasPreview($source, 'white'), $filled, $fromSetting], 'background-read.png');
echo "background-read.png\nstored-rgb=" . (int)round(255 * $color['r']) . "," . (int)round(255 * $color['g']) . "," . (int)round(255 * $color['b']) . "\n";
Тёмное полотно заполнено через newImage, но его metadata background в проверенной сборке белая. Чтение настройки и создание нового поля этим цветом даёт белую панель справа. filled-canvas.png остаётся тёмным: getter не измеряет пиксели и не ищет доминирующий цвет. В одной папке нужны example.php, canvas-fixture.php и source.png.b64; сохраните также остальные файлы ZIP. Запуск: php example.php с Imagick. Все входы включены; PHP не требует сети и шрифтов. Главный PNG содержит полные панели сравнения без масштабирования; самостоятельные PNG перечислены в программе.
Ожидаемый вывод
background-read.png
stored-rgb=255,255,255
Для шаблона цвет должен быть задан осознанно. setImageBackgroundColor('#e6edf1') сохраняет его в исходнике. Getter возвращает независимый ImagickPixel, который можно передать новому холсту и затем изменить через setColor для второй версии. Изменение этого объекта не является setter исходника: повторное чтение настройки остаётся светлым.
Использовать явный цвет шаблона и сделать независимый второй вариант
Явно заданный background исходника прочитан как ImagickPixel и передан новому светлому полотну. Затем изменён только возвращённый объект цвета: создана тёмная карточка, а настройка исходника осталась 230/237/241. Оба самостоятельных RGB-файла 440×360 сохраняют полный товар с полями 20 пикселей.
<?php
declare(strict_types=1);
require __DIR__ . '/canvas-fixture.php';
$source = loadCanvasSource();
$source->setImageBackgroundColor('#e6edf1');
$background = $source->getImageBackgroundColor();
$light = new Imagick();
if (!$light->newImage(440, 360, $background, 'png')) { throw new RuntimeException('Light card failed'); }
$light->compositeImage($source, Imagick::COMPOSITE_OVER, 20, 20);
$background->setColor('#243c4d');
$dark = new Imagick();
if (!$dark->newImage(440, 360, $background, 'png')) { throw new RuntimeException('Dark card failed'); }
$dark->compositeImage($source, Imagick::COMPOSITE_OVER, 20, 20);
$stored = $source->getImageBackgroundColor()->getColor(1);
saveCanvasNative($light, 'metadata-light-card.png', false);
saveCanvasNative($dark, 'metadata-dark-card.png', false);
saveCanvasComparison([canvasPreview($source, 'white'), $light, $dark], 'metadata-cards.png');
echo "metadata-cards.png\nstored-rgb=" . (int)round(255 * $stored['r']) . "," . (int)round(255 * $stored['g']) . "," . (int)round(255 * $stored['b']) . "\n";
Явно заданный background исходника прочитан как ImagickPixel и передан новому светлому полотну. Затем изменён только возвращённый объект цвета: создана тёмная карточка, а настройка исходника осталась 230/237/241. Оба самостоятельных RGB-файла 440×360 сохраняют полный товар с полями 20 пикселей. В одной папке нужны example.php, canvas-fixture.php и source.png.b64; сохраните также остальные файлы ZIP. Запуск: php example.php с Imagick. Все входы включены; PHP не требует сети и шрифтов. Главный PNG содержит полные панели сравнения без масштабирования; самостоятельные PNG перечислены в программе.
Ожидаемый вывод
metadata-cards.png
stored-rgb=230,237,241
Проверить размеры, фон и границы запроса
| Симптом | Причина и действие |
|---|---|
| После newImage вместо картинки bool | Сохраняйте объект $canvas отдельно, результат вызова — статус $created. Файл записывается отдельно через writeImage. |
| Полотно тёмное, getter сообщил белый | Прочитана metadata, а не цвет заливки. Если нужен preset, задайте его явно; если нужен цвет пикселя — читайте пиксель другим API. |
| Область меньше запрошенной | Часть запроса лежит за растром и clipping уменьшил результат. Для точного размера заранее проверьте всю область после согласования page. |
| Нужны прозрачные поля за границей | Выбор области не добавляет пустое пространство. Создайте новое большее полотно и поместите полный вход в явной точке. |
| Следующая операция учитывает старое смещение | Извлечённая область может помнить виртуальную страницу. Для самостоятельного PNG явно сбросьте page; это не замена координатам последующего наложения. |
| Ошибка format оставила изображение | Создание кадра произошло раньше установки формата. Отказ не обещает атомарный rollback; отбросьте ошибочную заготовку. |
| Большой пользовательский запрос исчерпал память | Ограничьте стороны, площадь, число кадров и размер входа до выделения. Не проверяйте отрицательные размеры реальным вызовом, который преобразует их в unsigned size. |
Проверенные PNG созданы локальным CLI. Это не HTTP-загрузчик и не браузерный crop-editor: координаты CSS с масштабированием нужно переводить к натуральным пикселям отдельно. Контроль сохранности относится к собственному RGBA-входу; мы не сертифицируем одинаковый показ всех редакторов, OCR, профили CMYK или произвольные анимации. Цветной preview не доказывает alpha; raw RGBA-файлы сохранены отдельно. Поля сравнения белые, они не входят в самостоятельные вставки. PNG type2/type6 хранит 8 бит на компоненту, это не индексированный PNG.
Полный переносимый helper
<?php
declare(strict_types=1);
function loadCanvasSource(): Imagick {
$encoded = file_get_contents(__DIR__ . '/source.png.b64');
if ($encoded === false) { throw new RuntimeException('Cannot read source.png.b64'); }
$bytes = base64_decode($encoded, true);
if ($bytes === false || hash('sha256', $bytes) !== 'f51e5780445e0f5130a7f23112b2a00618035afd5545b8e3042c7ccff09b617c') {
throw new RuntimeException('Unexpected RGBA source bytes');
}
if (file_put_contents(__DIR__ . '/source.png', $bytes) === false) { throw new RuntimeException('Cannot restore source.png'); }
return new Imagick(__DIR__ . '/source.png');
}
function canvasPreview(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 saveCanvasNative(Imagick $image, string $filename, bool $withAlpha): 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 saveCanvasComparison(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();
}
saveCanvasNative($canvas, $filename, false);
}
| Задача из обсуждения | Наш ответ и граница |
|---|---|
| SO 45351307 | Новый фон и наложение требуют объекта и явной позиции; bool от обработки не является готовым изображением. Мы сохраняем полный canvas и отдельно записываем файл. |
| SO 66154842 | Настройка label не рисует текст. Наш урок извлекает уже напечатанный ярлык; генерация новой надписи и шрифт — другая задача, без обещания автоматической подгонки текста. |
| SO 29849358 | Выход crop за границы не создаёт запрошенные пустые поля. Для прозрачных полей по 20 пикселей создаём новый больший canvas и явно накладываем полный вход. |
| SO 46775277 | Координаты CSS/UI и исходных пикселей различаются. Наши ROI заданы в натуральном 400×320; веб-редактор с масштабированием должен отдельно переводить координаты. |
| SO 21907665 | Большая область и копии требуют памяти/лимитов и диагностики. Умеренные фиксированные размеры учебного примера не доказывают безопасность произвольной загрузки. |
| SO 78262402 | Вид в редакторе и кодирование PNG не заменяют проверку alpha. Сохраняем raw RGBA-вставки отдельно от непрозрачных preview и не обещаем одинаковый показ во всех приложениях. |
Самостоятельные поля и следующий шаг

Упражнение: оставить ярлык 156×50, но сделать поля по 20 пикселей со всех сторон. Решение: новое полотно 196×90, наложение в 20,20; исходный getImageRegion(156,50,72,140) не менять. Сохраните новый самостоятельный PNG и проверьте размер 196×90, точную область в 20,20 и цвет углов. Этот изменённый вариант выполните отдельно; свидетельства относятся к исходным восьми программам.
Дальше: канал alpha и настройка фона, тень и композиция, рамка и размер растра, градиенты и текстуры. getImageRegion не заменяет исторические crop/paint aliases; оставшиеся методы сохраняются в полном объёме справочника.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Imagick::newImageСоздаёт заполненный растр в текущем Imagick и возвращает bool true при успехе; не возвращает новую картинку.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::newImage(int $cols, int $rows, mixed $background, string $format = ?): boolСамая маленькая запись
Переменная $image содержит картинку, $canvas — отдельный будущий холст. $ обозначает имя переменной, = присваивает результат. new Imagick() создаёт пустой объект; -> вызывает его метод; () содержит аргументы, запятые разделяют их, ; завершает инструкцию. Строки в кавычках — путь, цвет или формат. RGB — красная/зелёная/синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно. Сначала используем фиксированные размеры и координаты.
После первой строки $canvas — объект, после второго вызова он содержит полотно 220×100. Вызов возвращает true как статус; запись $canvas=$canvas->newImage(...) заменила бы объект логическим значением. Третий аргумент закрашивает сам растр, четвёртый выбирает формат объекта:
$canvas = new Imagick();
$created = $canvas->newImage(220, 100, '#e6edf1', 'png');В полной программе if проверяет условие, ! отрицает статус, throw new RuntimeException прекращает цепочку при отказе. clone копирует объект; echo выводит строку, . соединяет строки, "\n" добавляет перевод строки. Основы: объекты и методы, массивы, копии, исключения.
Официальная сигнатура, возврат и ошибки
Imagick::newImage(int $cols, int $rows, mixed $background, string $format = ?): bool| Аргумент | Значение |
|---|---|
| $cols / $rows | Обязательные int: ширина и высота нового растра в пикселях. В программах положительные фиксированные 220×100 или 440×360. Размеры не проценты, не координаты правого нижнего угла. |
| $background | Обязательный цвет заполнения пикселей: строка либо ImagickPixel. transparent создаёт прозрачный растр; alpha цвета участвует в заполнении. Это отдельно от metadata background, которую читает getter. |
| $format | Необязательная строка формата; в проверенной Reflection default null и тип ?string. В примерах явный png. Выбор формата не записывает файл и не гарантирует заданный PNG color-type без настроек сохранения. |
Официальная доступность: PECL imagick 2, PECL imagick 3. Полный raw XML ниже сохранён целиком. Текущие страницы PHP.net также прочитаны; рабочие различия дополнены exact Imagick 3.8.1 / ImageMagick 7.1.1-46 и одной ограниченной проверкой PHP 8.5.11, а не заменой исходного контракта.
Четвёртый format добавлен в Imagick 2.0.1; строки цвета разрешены с PECL 2.1.0, раньше нужен был ImagickPixel. В проверенной 3.8.1 Reflection имена columns/rows/background_color/format отличаются от raw cols/rows/background/format: примеры используют позиционные аргументы. Для named arguments нужны имена вашей версии. На непустом Imagick операция вставляет изображение в список с учётом текущего итератора, а wrapper выбирает последний кадр. Два последовательных вызова в нашей пробе дали 2 кадра, текущий 9×7. Для одного полотна каждый раз создаём свежий пустой объект.
Цвет заполнения и metadata background — разные свойства. У нового светлого/прозрачного/полупрозрачного полотна проверка прочитала белый background, хотя RGBA-пиксели были заданного цвета. Некорректный цвет дал ImagickException до создания кадра; неизвестный format дал ImagickException после создания одного кадра. Отказ не гарантирует откат объекта к пустому состоянию: при ошибке подготовки лучше отбросить эту заготовку. Отрицательные размеры могут попасть в unsigned native size; их не проверяют опасным пробным выделением памяти, а отклоняют во внешней валидации.
Пустой объект для двух getter дал ImagickException. Ошибка создания/неподдержанный формат также преобразуются в ImagickException; неверный PHP-тип может дать TypeError. Наличие нового объекта или статус true не подтверждают желаемый размер/фон/формат файла: это проверяется отдельно. Область не распознаёт буквы и не исправляет текст; она переносит уже существующие пиксели. Крупное новое полотно, копия области и несколько кадров требуют памяти; скорость здесь не измерялась. Исходник сохраните отдельно.
Полный официальный XML и исходные примеры
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.newimage">
<refnamediv>
<refname>Imagick::newImage</refname>
<refpurpose>Creates a new image</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>bool</type><methodname>Imagick::newImage</methodname>
<methodparam><type>int</type><parameter>cols</parameter></methodparam>
<methodparam><type>int</type><parameter>rows</parameter></methodparam>
<methodparam><type>mixed</type><parameter>background</parameter></methodparam>
<methodparam choice="opt"><type>string</type><parameter>format</parameter></methodparam>
</methodsynopsis>
<para>
Creates a new image and associates ImagickPixel value as background color
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>cols</parameter></term>
<listitem>
<para>
Columns in the new image
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>rows</parameter></term>
<listitem>
<para>
Rows in the new image
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>background</parameter></term>
<listitem>
<para>
The background color used for this image
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>format</parameter></term>
<listitem>
<para>
Image format. This parameter was added in Imagick version 2.0.1.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&imagick.return.success;
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
&imagick.imagick.throws;
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>PECL imagick 2.1.0</entry>
<entry>
Now allows a string representing the color as the third parameter.
Previous versions allow only an ImagickPixel object.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Using <function>Imagick::newImage</function>:</title>
<para>
Create a new image and display it.
</para>
<programlisting role="php">
<![CDATA[
<?php
$image = new Imagick();
$image->newImage(100, 100, new ImagickPixel('red'));
$image->setImageFormat('png');
header('Content-type: image/png');
echo $image;
?>
]]>
</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
-->
Создать полотно заданного размера для отдельной карточки ярлыка
В середине настоящий новый RGB-растр 220×100, справа тот же растр с ярлыком в (32,25). new-label-card.png — отдельный готовый результат. Параметр png задаёт формат объекта; файл появляется только после сохранения.
<?php
declare(strict_types=1);
require __DIR__ . '/canvas-fixture.php';
$source = loadCanvasSource();
$label = $source->getImageRegion(156, 50, 72, 140);
$label->setImagePage(0, 0, 0, 0);
$card = new Imagick();
if (!$card->newImage(220, 100, '#e6edf1', 'png')) { throw new RuntimeException('New card failed'); }
$blank = clone $card;
$card->compositeImage($label, Imagick::COMPOSITE_OVER, 32, 25);
saveCanvasNative($card, 'new-label-card.png', false);
saveCanvasComparison([canvasPreview($source, 'white'), $blank, $card], 'new-label.png');
echo "new-label.png\n";
В середине настоящий новый RGB-растр 220×100, справа тот же растр с ярлыком в (32,25). new-label-card.png — отдельный готовый результат. Параметр png задаёт формат объекта; файл появляется только после сохранения. В одной папке нужны example.php, canvas-fixture.php и source.png.b64; сохраните также остальные файлы ZIP. Запуск: php example.php с Imagick. Все входы включены; PHP не требует сети и шрифтов. Главный PNG содержит полные панели сравнения без масштабирования; самостоятельные PNG перечислены в программе.
Ожидаемый вывод
new-label.png
Добавить прозрачные поля вокруг всей PNG-наклейки
padded-sticker.png имеет полный размер 440×360 и 20 прозрачных пикселей с каждой стороны. Две правые панели показывают одни RGBA-пиксели на белом и тёмном. Исходные 400×320 не масштабируются и не обрезаются; alpha отверстия ручки остаётся прозрачной.
<?php
declare(strict_types=1);
require __DIR__ . '/canvas-fixture.php';
$source = loadCanvasSource();
$padded = new Imagick();
if (!$padded->newImage(440, 360, 'transparent', 'png')) { throw new RuntimeException('New transparent canvas failed'); }
$padded->compositeImage($source, Imagick::COMPOSITE_OVER, 20, 20);
saveCanvasNative($padded, 'padded-sticker.png', true);
saveCanvasComparison([canvasPreview($source, 'white'), canvasPreview($padded, 'white'), canvasPreview($padded, '#243c4d')], 'new-padded.png');
echo "new-padded.png\n";
padded-sticker.png имеет полный размер 440×360 и 20 прозрачных пикселей с каждой стороны. Две правые панели показывают одни RGBA-пиксели на белом и тёмном. Исходные 400×320 не масштабируются и не обрезаются; alpha отверстия ручки остаётся прозрачной. В одной папке нужны example.php, canvas-fixture.php и source.png.b64; сохраните также остальные файлы ZIP. Запуск: php example.php с Imagick. Все входы включены; PHP не требует сети и шрифтов. Главный PNG содержит полные панели сравнения без масштабирования; самостоятельные PNG перечислены в программе.
Ожидаемый вывод
new-padded.png
Imagick::getImageRegionВозвращает новый Imagick с выбранной областью; исходный объект не обрезает. Копирует пиксели без изменения масштаба.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::getImageRegion(int $width, int $height, int $x, int $y): ImagickСамая маленькая запись
Переменная $image содержит картинку, $canvas — отдельный будущий холст. $ обозначает имя переменной, = присваивает результат. new Imagick() создаёт пустой объект; -> вызывает его метод; () содержит аргументы, запятые разделяют их, ; завершает инструкцию. Строки в кавычках — путь, цвет или формат. RGB — красная/зелёная/синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно. Сначала используем фиксированные размеры и координаты.
В первых двух позициях стоят размеры 156×50, затем точка 72,140. Полученный $label — новый объект; $image остаётся полным. Координаты начинаются с 0; выбранные столбцы 72..227, строки 140..189. setImagePage обнуляет виртуальную рамку самостоятельной вставки, не сдвигая её пиксели:
$label = $image->getImageRegion(156, 50, 72, 140);
$label->setImagePage(0, 0, 0, 0);В полной программе if проверяет условие, ! отрицает статус, throw new RuntimeException прекращает цепочку при отказе. clone копирует объект; echo выводит строку, . соединяет строки, "\n" добавляет перевод строки. Основы: объекты и методы, массивы, копии, исключения.
Официальная сигнатура, возврат и ошибки
Imagick::getImageRegion(int $width, int $height, int $x, int $y): Imagick| Аргумент | Значение |
|---|---|
| $width / $height | Обязательные int: размеры области в пикселях, первые два аргумента. Для ярлыка 156/50, для кружки 160/190. |
| $x / $y | Обязательные int: координаты верхнего левого угла области с учётом virtual page. У нашего исходника page-offset0,0, поэтому 72,140 — обычная позиция в растре. Не путать порядок PHP width,height,x,y с описанием ROI x,y,width,height. |
Официальная доступность: PECL imagick 2, PECL imagick 3. Полный raw XML ниже сохранён целиком. Текущие страницы PHP.net также прочитаны; рабочие различия дополнены exact Imagick 3.8.1 / ImageMagick 7.1.1-46 и одной ограниченной проверкой PHP 8.5.11, а не заменой исходного контракта.
Exact wrapper вызывает Core CropImage и создаёт новый Wand/Imagick. Координаты учитывают page: у маленького 7×5 контроля с виртуальной страницей 20×15 и offset4,3 запрос 3×2 в 5,4 взял локальные пиксели от 1,1. Полученная область помнила page20×15+5+4. После setImagePage(0,0,0,0) размер и RGBA не изменились. Наша самостоятельная вставка явно сбрасывает это положение до сохранения; координаты на картинке сравнения — ещё одна отдельная система.
Граница не является универсальным исключением: запрос 4×3 в 5,3 у 7×5 дал 2×2, отрицательное начало−1,−1 дало обрезанную 3×2 область, нулевые размеры в 0,0 дали весь 7×5. Полностью внешняя область 20,20 дала 1×1 прозрачный результат с page−1,−1; другая граничная ветвь может отказать. Поэтому если приложение обещает строго заданный размер, оно заранее проверяет width>0,height>0,x>=0,y>=0,x+width<=W,y+height<=H после согласования page. Это рекомендуемая политика внешних данных, а не утверждение, что API сам запрещает всё остальное.
Пустой объект для двух getter дал ImagickException. Ошибка создания/неподдержанный формат также преобразуются в ImagickException; неверный PHP-тип может дать TypeError. Наличие нового объекта или статус true не подтверждают желаемый размер/фон/формат файла: это проверяется отдельно. Область не распознаёт буквы и не исправляет текст; она переносит уже существующие пиксели. Крупное новое полотно, копия области и несколько кадров требуют памяти; скорость здесь не измерялась. Исходник сохраните отдельно.
Полный официальный XML и исходные примеры
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimageregion">
<refnamediv>
<refname>Imagick::getImageRegion</refname>
<refpurpose>Extracts a region of the image</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>Imagick</type><methodname>Imagick::getImageRegion</methodname>
<methodparam><type>int</type><parameter>width</parameter></methodparam>
<methodparam><type>int</type><parameter>height</parameter></methodparam>
<methodparam><type>int</type><parameter>x</parameter></methodparam>
<methodparam><type>int</type><parameter>y</parameter></methodparam>
</methodsynopsis>
<para>
Extracts a region of the image and returns it as a new Imagick object.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>width</parameter></term>
<listitem>
<para>
The width of the extracted region.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>height</parameter></term>
<listitem>
<para>
The height of the extracted region.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>x</parameter></term>
<listitem>
<para>
X-coordinate of the top-left corner of the extracted region.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>y</parameter></term>
<listitem>
<para>
Y-coordinate of the top-left corner of the extracted region.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Extracts a region of the image and returns it as a new wand.
</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
-->
Получить самостоятельный точный фрагмент ярлыка без изменения исходника
label-extract.png содержит выбранные 156×50 пикселей исходника от (72,140). Нет изменения масштаба или интерполяции; alpha края сохраняется. Для самостоятельного файла page явно обнулён, исходное изображение не обрезано.
<?php
declare(strict_types=1);
require __DIR__ . '/canvas-fixture.php';
$source = loadCanvasSource();
$label = $source->getImageRegion(156, 50, 72, 140);
$label->setImagePage(0, 0, 0, 0);
saveCanvasNative($label, 'label-extract.png', true);
saveCanvasComparison([canvasPreview($source, 'white'), canvasPreview($label, 'white')], 'region-label.png');
echo "region-label.png\n";
label-extract.png содержит выбранные 156×50 пикселей исходника от (72,140). Нет изменения масштаба или интерполяции; alpha края сохраняется. Для самостоятельного файла page явно обнулён, исходное изображение не обрезано. В одной папке нужны example.php, canvas-fixture.php и source.png.b64; сохраните также остальные файлы ZIP. Запуск: php example.php с Imagick. Все входы включены; PHP не требует сети и шрифтов. Главный PNG содержит полные панели сравнения без масштабирования; самостоятельные PNG перечислены в программе.
Ожидаемый вывод
region-label.png
Сохранить прозрачную вставку кружки и обнулить её виртуальное положение
mug-insert.png — целая RGBA-вставка 160×190 из области (232,72). После извлечения текущий объект помнит page-offset232,72; reset задаёт 0,0 без изменения пикселей. Белая и тёмная панели — только два просмотра прозрачной вставки, а не два её фона.
<?php
declare(strict_types=1);
require __DIR__ . '/canvas-fixture.php';
$source = loadCanvasSource();
$mug = $source->getImageRegion(160, 190, 232, 72);
$pageBefore = $mug->getImagePage();
$mug->setImagePage(0, 0, 0, 0);
$pageAfter = $mug->getImagePage();
saveCanvasNative($mug, 'mug-insert.png', true);
saveCanvasComparison([canvasPreview($source, 'white'), canvasPreview($mug, 'white'), canvasPreview($mug, '#243c4d')], 'region-insert.png');
echo "region-insert.png\npage-before=" . $pageBefore['x'] . "," . $pageBefore['y'] . "\npage-after=" . $pageAfter['x'] . "," . $pageAfter['y'] . "\n";
mug-insert.png — целая RGBA-вставка 160×190 из области (232,72). После извлечения текущий объект помнит page-offset232,72; reset задаёт 0,0 без изменения пикселей. Белая и тёмная панели — только два просмотра прозрачной вставки, а не два её фона. В одной папке нужны example.php, canvas-fixture.php и source.png.b64; сохраните также остальные файлы ZIP. Запуск: php example.php с Imagick. Все входы включены; PHP не требует сети и шрифтов. Главный PNG содержит полные панели сравнения без масштабирования; самостоятельные PNG перечислены в программе.
Ожидаемый вывод
region-insert.png
page-before=232,72
page-after=0,0
Imagick::getImageBackgroundColorВозвращает новый ImagickPixel с копией сохранённого цвета background текущего изображения. Не измеряет цвета пикселей.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::getImageBackgroundColor(): ImagickPixelСамая маленькая запись
Переменная $image содержит картинку, $canvas — отдельный будущий холст. $ обозначает имя переменной, = присваивает результат. new Imagick() создаёт пустой объект; -> вызывает его метод; () содержит аргументы, запятые разделяют их, ; завершает инструкцию. Строки в кавычках — путь, цвет или формат. RGB — красная/зелёная/синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно. Сначала используем фиксированные размеры и координаты.
Сначала прочитаем настройку; $background теперь ImagickPixel. getColor(1) возвращает массив нормированных компонентов 0..1; 1 передаём именно целым числом. ['r'] читает красную компоненту по ключу, *255 переводит её для показа в обычную восьмибитную шкалу, round округляет, (int) делает целое число. Это чтение сохранённого цвета, а не анализ угла изображения:
$background = $image->getImageBackgroundColor();
$color = $background->getColor(1);
$red = (int)round(255 * $color['r']);В полной программе if проверяет условие, ! отрицает статус, throw new RuntimeException прекращает цепочку при отказе. clone копирует объект; echo выводит строку, . соединяет строки, "\n" добавляет перевод строки. Основы: объекты и методы, массивы, копии, исключения.
Официальная сигнатура, возврат и ошибки
Imagick::getImageBackgroundColor(): ImagickPixel| Аргумент | Значение |
|---|---|
| Нет аргументов | Пустые скобки (). Возврат ImagickPixel, а не строка #rrggbb, массив RGB, bool или новое изображение. Для компонентов отдельно вызывается getColor(1). |
Официальная доступность: PECL imagick 2, PECL imagick 3. Полный raw XML ниже сохранён целиком. Текущие страницы PHP.net также прочитаны; рабочие различия дополнены exact Imagick 3.8.1 / ImageMagick 7.1.1-46 и одной ограниченной проверкой PHP 8.5.11, а не заменой исходного контракта.
Getter читает image.background_color и возвращает независимый объект цвета. В пробе изменение возвращённого ImagickPixel через setColor не меняло настройку исходника и его RGBA-пиксели. Чтобы изменить именно настройку изображения, нужен setImageBackgroundColor. Чтобы получить цвет конкретного пикселя, нужен другой API; чтобы найти преобладающий фон фотографии — отдельный анализ. Не подменяем эти задачи словом background.
Пустой объект для двух getter дал ImagickException. Ошибка создания/неподдержанный формат также преобразуются в ImagickException; неверный PHP-тип может дать TypeError. Наличие нового объекта или статус true не подтверждают желаемый размер/фон/формат файла: это проверяется отдельно. Область не распознаёт буквы и не исправляет текст; она переносит уже существующие пиксели. Крупное новое полотно, копия области и несколько кадров требуют памяти; скорость здесь не измерялась. Исходник сохраните отдельно.
Полный официальный XML и исходные примеры
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimagebackgroundcolor">
<refnamediv>
<refname>Imagick::getImageBackgroundColor</refname>
<refpurpose>Returns the image background color</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>ImagickPixel</type><methodname>Imagick::getImageBackgroundColor</methodname>
<void/>
</methodsynopsis>
<para>
Returns the image background color.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
&no.function.parameters;
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Returns an ImagickPixel set to the background color of the image.
</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
-->
Не принять настройку background за цвет реального поля
Тёмное полотно заполнено через newImage, но его metadata background в проверенной сборке белая. Чтение настройки и создание нового поля этим цветом даёт белую панель справа. filled-canvas.png остаётся тёмным: getter не измеряет пиксели и не ищет доминирующий цвет.
<?php
declare(strict_types=1);
require __DIR__ . '/canvas-fixture.php';
$source = loadCanvasSource();
$filled = new Imagick();
if (!$filled->newImage(220, 100, '#243c4d', 'png')) { throw new RuntimeException('New filled canvas failed'); }
$background = $filled->getImageBackgroundColor();
$fromSetting = new Imagick();
if (!$fromSetting->newImage(220, 100, $background, 'png')) { throw new RuntimeException('New metadata canvas failed'); }
$color = $background->getColor(1);
saveCanvasNative($filled, 'filled-canvas.png', false);
saveCanvasComparison([canvasPreview($source, 'white'), $filled, $fromSetting], 'background-read.png');
echo "background-read.png\nstored-rgb=" . (int)round(255 * $color['r']) . "," . (int)round(255 * $color['g']) . "," . (int)round(255 * $color['b']) . "\n";
Тёмное полотно заполнено через newImage, но его metadata background в проверенной сборке белая. Чтение настройки и создание нового поля этим цветом даёт белую панель справа. filled-canvas.png остаётся тёмным: getter не измеряет пиксели и не ищет доминирующий цвет. В одной папке нужны example.php, canvas-fixture.php и source.png.b64; сохраните также остальные файлы ZIP. Запуск: php example.php с Imagick. Все входы включены; PHP не требует сети и шрифтов. Главный PNG содержит полные панели сравнения без масштабирования; самостоятельные PNG перечислены в программе.
Ожидаемый вывод
background-read.png
stored-rgb=255,255,255
Использовать явный цвет шаблона и сделать независимый второй вариант
Явно заданный background исходника прочитан как ImagickPixel и передан новому светлому полотну. Затем изменён только возвращённый объект цвета: создана тёмная карточка, а настройка исходника осталась 230/237/241. Оба самостоятельных RGB-файла 440×360 сохраняют полный товар с полями 20 пикселей.
<?php
declare(strict_types=1);
require __DIR__ . '/canvas-fixture.php';
$source = loadCanvasSource();
$source->setImageBackgroundColor('#e6edf1');
$background = $source->getImageBackgroundColor();
$light = new Imagick();
if (!$light->newImage(440, 360, $background, 'png')) { throw new RuntimeException('Light card failed'); }
$light->compositeImage($source, Imagick::COMPOSITE_OVER, 20, 20);
$background->setColor('#243c4d');
$dark = new Imagick();
if (!$dark->newImage(440, 360, $background, 'png')) { throw new RuntimeException('Dark card failed'); }
$dark->compositeImage($source, Imagick::COMPOSITE_OVER, 20, 20);
$stored = $source->getImageBackgroundColor()->getColor(1);
saveCanvasNative($light, 'metadata-light-card.png', false);
saveCanvasNative($dark, 'metadata-dark-card.png', false);
saveCanvasComparison([canvasPreview($source, 'white'), $light, $dark], 'metadata-cards.png');
echo "metadata-cards.png\nstored-rgb=" . (int)round(255 * $stored['r']) . "," . (int)round(255 * $stored['g']) . "," . (int)round(255 * $stored['b']) . "\n";
Явно заданный background исходника прочитан как ImagickPixel и передан новому светлому полотну. Затем изменён только возвращённый объект цвета: создана тёмная карточка, а настройка исходника осталась 230/237/241. Оба самостоятельных RGB-файла 440×360 сохраняют полный товар с полями 20 пикселей. В одной папке нужны example.php, canvas-fixture.php и source.png.b64; сохраните также остальные файлы ZIP. Запуск: php example.php с Imagick. Все входы включены; PHP не требует сети и шрифтов. Главный PNG содержит полные панели сравнения без масштабирования; самостоятельные PNG перечислены в программе.
Ожидаемый вывод
metadata-cards.png
stored-rgb=230,237,241
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


