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

Дерево руководства
Глава 419 · После первых изображений и объектов Gmagick
Gmagick: текстовый слой, прозрачность и готовая карточка
Построить прозрачный слой, рассчитать отступ, выбрать оператор и сохранить карточку с манифестом.
Наложить прозрачный текстовый слой
Подготовим водяной знак отдельным прозрачным изображением. Модель: основа 320×200 + слой 160×56 + точка 150,132 → основа с надписью. Слой остаётся отдельным объектом.



$layer = gmCanvas("none",160,56);
$draw = gmPen(20,"white");
$draw->annotate(8,36,"МОЙ КАТАЛОГ");
$layer->drawImage($draw);
$base->compositeImage($layer,Gmagick::COMPOSITE_OVER,150,132);
gmPng($base,"watermarked.png");none создаёт прозрачный холст. OVER накладывает источник с учётом прозрачности. x и y — целые смещения в столбцах и строках основы. Метод меняет base и возвращает его; layer не изменяется. Прозрачный слой показан на сером фоне просмотра, который не входит в PNG.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$base=new Gmagick(__DIR__.'/product.ppm');$sourceSignature=$base->getImageSignature();gmPng(clone $base,'gm98-text-overlay-first-before.png');
$layer=gmCanvas('none',160,56);$draw=gmPen(20,'white');$draw->annotate(8,36,'МОЙ КАТАЛОГ');$layer->drawImage($draw);$layerSignature=$layer->getImageSignature();
gmPng(clone $layer,'gm98-text-overlay-first-layer.png');
$ret=$base->compositeImage($layer,Gmagick::COMPOSITE_OVER,150,132);gmPng($base,'gm98-text-overlay-first-after.png');
gmReport('gm98-text-overlay-first',["gmagick.compositeimage", "gmagickdraw.annotate", "gmagick.drawimage"],["gm98-text-overlay-first-before.png", "gm98-text-overlay-first-layer.png", "gm98-text-overlay-first-after.png"],['target_mutates'=>$ret===$base&&$sourceSignature!==$base->getImageSignature(),'layer_unchanged'=>$layerSignature===$layer->getImageSignature()],$errors??[],[]);
echo "overlay: OVER target=changed source-layer=unchanged png=3\n";
Ожидаемый результат
overlay: OVER target=changed source-layer=unchanged png=3
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Сохранены основа, слой и результат. На светлом участке белым буквам не хватает контраста; ниже показана отдельная подложка для решения этой задачи. Упражнение: какой объект вызывать для изменения товара? Решение: $base->compositeImage($layer,...). Перестановка объектов меняет назначение операции. Надпись обозначает происхождение, но не является защитой от копирования или доказательством авторства.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Вычислить отступ от правого нижнего края
Вычислим размещение у правого нижнего края. Для основы 320×200, слоя 136×52 и поля 12px получаем 172,136. Рядом намеренно показано положение, при котором большая часть ценника выходит за холст.


$margin = 12;
$x = $base->getImageWidth() - $layer->getImageWidth() - $margin;
$y = $base->getImageHeight() - $layer->getImageHeight() - $margin;
$base->compositeImage($layer,Gmagick::COMPOSITE_OVER,$x,$y);
gmPng($base,"corner-price.png");От правого края отнимаем ширину слоя и поле, от нижнего — высоту и поле. compositeImage не расширяет основу ради вышедшей части. При 284,168 холст остаётся 320×200, но ценник обрезается. Так видна роль конкретных координат.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$base=new Gmagick(__DIR__.'/product.ppm');$layer=gmCanvas('#244f65',136,52);$d=gmPen(24,'white');$layer->annotateImage($d,10,34,0,'129 ₽');
$margin=12;$x=$base->getImageWidth()-$layer->getImageWidth()-$margin;$y=$base->getImageHeight()-$layer->getImageHeight()-$margin;
$corner=clone $base;$corner->compositeImage($layer,Gmagick::COMPOSITE_OVER,$x,$y);
$clipped=clone $base;$clipped->compositeImage($layer,Gmagick::COMPOSITE_OVER,284,168);
gmPng($corner,'gm98-text-overlay-margin-fit.png');gmPng($clipped,'gm98-text-overlay-margin-clipped.png');
gmReport('gm98-text-overlay-margin',["gmagick.compositeimage", "gmagick.annotateimage", "gmagick.getimagewidth", "gmagick.getimageheight"],["gm98-text-overlay-margin-fit.png", "gm98-text-overlay-margin-clipped.png"],['computed_position'=>$x===172&&$y===136,'canvas_stays'=>$clipped->getImageWidth()===320&&$clipped->getImageHeight()===200,'positions_differ'=>$corner->getImageSignature()!==$clipped->getImageSignature()],$errors??[],['x'=>$x,'y'=>$y,'margin'=>$margin]);
echo "position: x172 y136 margin12 clipping-does-not-expand-canvas png=2\n";
Ожидаемый результат
position: x172 y136 margin12 clipping-does-not-expand-canvas png=2
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Упражнение: слой шириной 400 при основе 320 даст положительный x? Решение: нет; сначала выберите уменьшение, перенос или отказ. Отрицательные смещения могут быть намеренными для показа фрагмента, но не заменяют политику размещения целого ценника.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Сравнить OVER и COPY на одном прозрачном слое
Прозрачность сама не выбирает алгоритм композиции. Сравним OVER и COPY на одном слое в одной точке. Геометрия одинаковая, а пиксели различаются.


$over = clone $base;
$over->compositeImage($layer,Gmagick::COMPOSITE_OVER,150,132);
$copy = clone $base;
$copy->compositeImage($layer,Gmagick::COMPOSITE_COPY,150,132);
gmPng($over,"over.png");
gmPng($copy,"copy.png");OVER смешивает слой с основой с учётом прозрачности. COPY следует другому правилу копирования; в нашем GraphicsMagick 1.3.42 результат не похож на обычную прозрачную надпись. Показан именно сохранённый PNG, а подписи доказывают различие. Для водяного знака выбран OVER.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$base=new Gmagick(__DIR__.'/product.ppm');$layer=gmCanvas('none',160,56);$d=gmPen(20,'white');$d->annotate(8,36,'МОЙ КАТАЛОГ');$layer->drawImage($d);
$over=clone $base;$over->compositeImage($layer,Gmagick::COMPOSITE_OVER,150,132);
$copy=clone $base;$copy->compositeImage($layer,Gmagick::COMPOSITE_COPY,150,132);
gmPng($over,'gm98-text-overlay-operators-over.png');gmPng($copy,'gm98-text-overlay-operators-copy.png');
gmReport('gm98-text-overlay-operators',["gmagick.compositeimage", "gmagickdraw.annotate", "gmagick.drawimage"],["gm98-text-overlay-operators-over.png", "gm98-text-overlay-operators-copy.png"],['operators_differ'=>$over->getImageSignature()!==$copy->getImageSignature(),'same_size'=>$over->getImageWidth()===$copy->getImageWidth()],$errors??[],[]);
echo "operators: same-layer same-position OVER-differs-from-COPY png=2\n";
Ожидаемый результат
operators: same-layer same-position OVER-differs-from-COPY png=2
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Упражнение: достаточно заменить оператор на «похожий»? Решение: нет, он определяет действие над источником и получателем. Не исправляйте неверную композицию удалением всего чёрного цвета: так исчезнут и настоящие чёрные детали товара.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Отличить сохранённый оператор от выполненного наложения
Изображение хранит настройку композиции, но сама настройка ничего не накладывает. Сохраним MULTIPLY, прочитаем его getter и сравним явный OVER с применением прочитанного значения.



$base->setImageCompose(Gmagick::COMPOSITE_MULTIPLY);
$savedOperator = $base->getImageCompose();
$over = clone $base;
$over->compositeImage($layer,Gmagick::COMPOSITE_OVER,172,136);
$multiply = clone $base;
$multiply->compositeImage($layer,$savedOperator,172,136);setImageCompose задаёт ассоциированный оператор, getImageCompose возвращает целый код. В compositeImage второй аргумент обязателен: явный OVER не заменяется сохранённым MULTIPLY. Чтобы применить настройку, программа сама передаёт savedOperator. Умножение цветовых значений отличается от обычного наложения.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$base=new Gmagick(__DIR__.'/product.ppm');$before=$base->getImageSignature();
$base->setImageCompose(Gmagick::COMPOSITE_MULTIPLY);$savedOperator=$base->getImageCompose();$afterSetting=$base->getImageSignature();
$layer=gmCanvas('#e5a74a',136,52);$d=gmPen(24);$layer->annotateImage($d,10,34,0,'129 ₽');
$explicit=clone $base;$explicit->compositeImage($layer,Gmagick::COMPOSITE_OVER,172,136);
$usingSetting=clone $base;$usingSetting->compositeImage($layer,$savedOperator,172,136);
gmPng(clone $base,'gm98-text-overlay-setting-only.png');gmPng($explicit,'gm98-text-overlay-setting-over.png');gmPng($usingSetting,'gm98-text-overlay-setting-multiply.png');
gmReport('gm98-text-overlay-setting',["gmagick.setimagecompose", "gmagick.getimagecompose", "gmagick.compositeimage", "gmagick.annotateimage"],["gm98-text-overlay-setting-only.png", "gm98-text-overlay-setting-over.png", "gm98-text-overlay-setting-multiply.png"],['property_roundtrip'=>$savedOperator===Gmagick::COMPOSITE_MULTIPLY,'setting_not_render'=>$before===$afterSetting,'explicit_operator_wins'=>$explicit->getImageSignature()!==$usingSetting->getImageSignature()],$errors??[],[]);
echo "compose-setting: stored=MULTIPLY pixels=unchanged explicit-OVER=different png=3\n";
Ожидаемый результат
compose-setting: stored=MULTIPLY pixels=unchanged explicit-OVER=different png=3
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Три PNG показывают основу после setter и два результата. Упражнение: почему одного setImageCompose недостаточно? Решение: ещё нет выполненной операции с источником. Проверяйте отдельно состояние настройки и изменение пикселей.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Положить полупрозрачную подложку под подпись
На светлой части товара белый текст теряется. Положим под тёмную подпись полупрозрачную белую подложку. Подложка и текст находятся в одном слое, но имеют разную непрозрачность.



$draw = new GmagickDraw();
$draw->setFillColor(new GmagickPixel("white"));
$draw->setFillOpacity(0.5);
$draw->rectangle(0,0,195,55);
$layer->drawImage($draw);
$base->compositeImage($layer,Gmagick::COMPOSITE_OVER,112,132);Это конкретный проверенный путь Gmagick 2.0.6RC1/GraphicsMagick 1.3.42 Q16: запрос setFillOpacity(0.5) фактически даёт в сохранённом PNG alpha64/255, то есть около 25% непрозрачности. Getter около 0.5 не доказывает 50%-альфу. Передача Pixel с opacity0.5 через setFillColor в отдельной диагностике вообще дала непрозрачный результат; смешивать эти интерфейсы по имени нельзя. Полная программа ограничена указанной версией, добавляет тёмный непрозрачный текст и сохраняет слой 196×56.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$version=Gmagick::getVersion()['versionString'];
if(phpversion('gmagick')!=='2.0.6RC1'||!str_starts_with($version,'GraphicsMagick 1.3.42 ')||Gmagick::QUANTUM_DEPTH!==16)throw new LogicException('Recheck Draw opacity in this runtime; this sample binds the observed1.3.42 result');
$base=new Gmagick(__DIR__.'/product.ppm');gmPng(clone $base,'gm98-text-overlay-alpha-before.png');
$layer=gmCanvas('none',196,56);$draw=new GmagickDraw();$draw->setFillColor(new GmagickPixel('white'));$draw->setFillOpacity(0.5);$requested=$draw->getFillOpacity();
$draw->rectangle(0,0,195,55);$layer->drawImage($draw);
$text=gmPen(22);$layer->annotateImage($text,12,36,0,'Чай с мятой');gmPng(clone $layer,'gm98-text-overlay-alpha-layer.png');
$saved=new Gmagick(__DIR__.'/gm98-text-overlay-alpha-layer.png');$saved->cropImage(1,1,2,2);$actualOpacity=$saved->getImageHistogram()[0]->getColorValue(Gmagick::COLOR_OPACITY);
$base->compositeImage($layer,Gmagick::COMPOSITE_OVER,112,132);gmPng($base,'gm98-text-overlay-alpha-after.png');
gmReport('gm98-text-overlay-alpha',["gmagick.compositeimage", "gmagick.annotateimage", "gmagickdraw.setfillopacity", "gmagickdraw.getfillopacity", "gmagickpixel.getcolorvalue", "gmagickdraw.rectangle"],["gm98-text-overlay-alpha-before.png", "gm98-text-overlay-alpha-layer.png", "gm98-text-overlay-alpha-after.png"],['setter_readback'=>abs($requested-0.5)<0.00002,'saved_alpha_is64'=>abs($actualOpacity-191/255)<1e-9,'result_changed'=>$base->getImageSignature()!==(new Gmagick(__DIR__."/product.ppm"))->getImageSignature()],$errors??[],['draw_fill_getter'=>$requested,'saved_png_opacity'=>$actualOpacity,'saved_png_alpha'=>64]);
echo "alpha: requested-fill0.5 saved-alpha64-of255 OVER png=3\n";
Ожидаемый результат
alpha: requested-fill0.5 saved-alpha64-of255 OVER png=3
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Проверка заново читает записанный PNG и исследует пиксель 2,2 без текста: его COLOR_OPACITY=191/255, противоположная величина альфы. Независимая проверка требует RGBA255,255,255,64. OVER на цветной основе действительно оставляет фон видимым. Упражнение: достаточно совпавшего getter для обещания 50% в файле? Решение: нет, нужно проверить закодированный пиксель. В другой версии сначала заново подтвердите результат; пример останавливается вместо молчаливого переноса этого различия.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Выпустить карточку товара с ценником и манифестом
Завершим каталог: создадим небольшой ценник, наложим его с полем 12px и запишем манифест. Используемый шрифт и собственный исходный рисунок входят в скачивание.


$product->setImageCompose(Gmagick::COMPOSITE_OVER);
$operator = $product->getImageCompose();
$x = $product->getImageWidth() - $badge->getImageWidth() - 12;
$y = $product->getImageHeight() - $badge->getImageHeight() - 12;
$product->compositeImage($badge,$operator,$x,$y);
gmPng($product,"catalog.png");Ценник 136×68 содержит название 16pt и цену 30pt. Настройка OVER читается и передаётся явно. Для основы 320×200 позиция 172,120. JSON фиксирует имя и SHA256 результата, геометрию, текст, хеш шрифта, оператор и координаты. Это позволяет проверить конкретную карточку после записи.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$product=new Gmagick(__DIR__.'/product.ppm');gmPng(clone $product,'gm98-text-overlay-catalog-before.png');
$badge=gmCanvas('#244f65',136,68);$draw=gmPen(16,'white');$draw->annotate(12,23,'ЧАЙ С МЯТОЙ');$draw->setFontSize(30);$draw->annotate(12,56,'129 ₽');$badge->drawImage($draw);
$product->setImageCompose(Gmagick::COMPOSITE_OVER);$operator=$product->getImageCompose();
$x=$product->getImageWidth()-$badge->getImageWidth()-12;$y=$product->getImageHeight()-$badge->getImageHeight()-12;
$product->compositeImage($badge,$operator,$x,$y);gmPng($product,'gm98-text-overlay-catalog-after.png');
$manifest=['image'=>gmInspect('gm98-text-overlay-catalog-after.png'),'text'=>'ЧАЙ С МЯТОЙ;129 ₽','font'=>'DejaVuSans.ttf','font_sha256'=>GM_INPUT_HASHES['DejaVuSans.ttf'],'operator'=>$operator,'x'=>$x,'y'=>$y];
file_put_contents(__DIR__.'/gm98-text-overlay-catalog.json',json_encode($manifest,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_THROW_ON_ERROR));
gmReport('gm98-text-overlay-catalog',["gmagick.setimagecompose", "gmagick.getimagecompose", "gmagick.compositeimage", "gmagickdraw.annotate", "gmagick.drawimage"],["gm98-text-overlay-catalog-before.png", "gm98-text-overlay-catalog-after.png"],['operator'=>$operator===Gmagick::COMPOSITE_OVER,'placement'=>$x===172&&$y===120,'output_geometry'=>$manifest["image"]["width"]===320&&$manifest["image"]["height"]===200],$errors??[],$manifest);
echo "catalog: UTF-8 badge OVER margin12 manifest=written png=2\n";
Ожидаемый результат
catalog: UTF-8 badge OVER margin12 manifest=written png=2
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Получаются исходный PNG, результат и JSON. Упражнение: что нужно повторить на другом сервере? Решение: точные байты строки, файл шрифта, настройки, библиотеку и координаты. Одного имени «sans-serif» недостаточно. Здесь выполнен локальный выпуск изображения; HTTP-загрузку и хранение добавляет приложение.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Из реального вопроса разработчика
How to keep transparency with "-compose" and "-flatten" on GraphicsMagick. После композиции PNG автор теряет прозрачность и опасается удалять весь чёрный цвет, поскольку он есть и у полезных деталей. Вместо замены цвета на прозрачный мы создаём настоящий прозрачный слой, выбираем OVER и сравниваем с COPY. Отдельный пример задаёт полупрозрачную подложку через значение пикселя. CLI flatten из вопроса не объявляется исполненным PHP-методом.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Gmagick::compositeimageНаложить источник на текущую основу
PECL gmagick >= Unknown · gmagick
Gmagick::compositeimage(Gmagick $source, int $COMPOSE, int $x, int $y): GmagickGmagick::compositeimage(Gmagick $source, int $COMPOSE, int $x, int $y): GmagickОбязательны Gmagick source, int COMPOSE, int x и y. Source — накладываемое изображение; объект, у которого вызывается метод, является получателем. X и y — смещения столбца и строки. Возвращается изменённый Gmagick; источник в нашем примере остаётся неизменным. Оператор передаётся явно, например Gmagick::COMPOSITE_OVER. Настройка setImageCompose не отменяет этот аргумент. Выход за края обрезает видимую часть, а не увеличивает холст. Официальная ошибка — GmagickException. Для прозрачных слоёв выбирайте и проверяйте конкретный оператор; OVER и COPY показаны на одинаковом входе.
| Параметр | Официальный тип | Назначение |
|---|---|---|
| $source | Gmagick; обязательный | Изображение-источник, которое накладывается на получателя. |
| $COMPOSE | int; обязательный | Явный оператор композиции. |
| $x | int; обязательный | Горизонтальное положение; для композиции смещение столбца. |
| $y | int; обязательный | Базовая линия текста; для композиции смещение строки. |
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Наложить прозрачный текстовый слой; Выпустить карточку товара с ценником и манифестом.
Gmagick::getimagecomposeПрочитать оператор, связанный с изображением
PECL gmagick >= Unknown · gmagick
Gmagick::getimagecompose(): intGmagick::getimagecompose(): intАргументов нет, результат int — ассоциированный оператор композиции. Сравнивайте его с константой Gmagick::COMPOSITE_*, а не запоминайте числовой код из одной сборки. Getter не выполняет композицию и не доказывает, какой обязательный аргумент был передан в прошлый compositeImage. Два сценария читают сохранённые MULTIPLY и OVER и явно используют значение. Ошибка обработки по PHP.net — GmagickException.
Параметров нет: вызов записывается с пустыми скобками.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Отличить сохранённый оператор от выполненного наложения; Выпустить карточку товара с ценником и манифестом.
Gmagick::setimagecomposeСохранить ассоциированный оператор композиции
PECL gmagick >= Unknown · gmagick
Gmagick::setimagecompose(int $composite): GmagickGmagick::setimagecompose(int $composite): GmagickОбязательный int composite — код оператора Gmagick::COMPOSITE_*. Возвращается Gmagick. Setter меняет состояние изображения, но сам не получает источник и ничего не накладывает. В самостоятельной проверке пиксельная подпись после установки MULTIPLY осталась прежней. compositeImage всё равно требует явный оператор; пример передаёт либо OVER, либо значение, прочитанное getter. Официальная ошибка — GmagickException. Не считайте изменение свойства доказательством изменения картинки.
| Параметр | Официальный тип | Назначение |
|---|---|---|
| $composite | int; обязательный | Ассоциированный оператор композиции. |
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Отличить сохранённый оператор от выполненного наложения; Выпустить карточку товара с ценником и манифестом.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


