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

Дерево руководства
Глава 418 · После первых изображений и объектов Gmagick
Gmagick: русские подписи, цены и метаданные
Нарисовать кириллицу и рубль, отличить Draw-команду от пикселей и label-метаданных, собрать ценник.
Нарисовать русский ценник прямо на изображении
Нарисуем русский ценник со знаком рубля. Нужны корректная строка UTF-8, шрифт с нужными глифами и настройка Draw. Encoding не исправляет повреждённые байты автоматически.



$image = gmCanvas();
$draw = gmPen(26);
$draw->setTextEncoding("UTF-8");
$encoding = $draw->getTextEncoding();
$image->annotateImage($draw,20,80,0,"Чай 129 ₽");
gmPng($image,"price.png");annotateImage получает Draw, x, y, угол и строку. x задаёт положение слева, y — базовую линию, не верх букв. При 0° строка горизонтальна; полный пример сохраняет ещё 12°. Метод сразу меняет пиксели Gmagick и возвращает тот же объект. gmCanvas создаёт холст, gmPng записывает PNG8; оба помощника включены в архив.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$image=gmCanvas();$rotated=clone $image;gmPng(clone $image,'gm98-text-annotate-before.png');
$draw=gmPen();$draw->setTextEncoding('UTF-8');$encoding=$draw->getTextEncoding();
$before=$image->getImageSignature();$ret=$image->annotateImage($draw,20,80,0,'Чай 129 ₽');
gmPng($image,'gm98-text-annotate-after.png');
$rotated->annotateImage($draw,20,80,12,'Чай 129 ₽');gmPng($rotated,'gm98-text-annotate-angle.png');
gmReport('gm98-text-annotate',["gmagick.annotateimage", "gmagickdraw.settextencoding", "gmagickdraw.gettextencoding"],["gm98-text-annotate-before.png", "gm98-text-annotate-after.png", "gm98-text-annotate-angle.png"],['utf8'=>$encoding==="UTF-8",'same_object'=>$ret===$image,'pixels_changed'=>$before!==$image->getImageSignature(),'angle_changes'=>$rotated->getImageSignature()!==$image->getImageSignature()],$errors??[],[]);
echo "annotate: UTF-8 text=drawn same-image=yes angles=0,12 png=3\n";
Ожидаемый результат
annotate: UTF-8 text=drawn same-image=yes angles=0,12 png=3
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Результат: пустой холст и два настоящих текстовых PNG. getTextEncoding возвращает UTF-8; без настройки может вернуть false. Официально поддержано UTF-8, пустая строка выбирает системное значение. Упражнение: y=80 — верх строки? Решение: нет, часть букв лежит выше базовой линии, нижние элементы — ниже.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Собрать надпись в GmagickDraw и применить её
Для нескольких надписей удобно собрать команды в Draw и применить их вместе. GmagickDraw::annotate добавляет команду. До drawImage само изображение остаётся прежним — первая картинка это показывает.


$image = gmCanvas();
$draw = gmPen();
$draw->setTextEncoding("UTF-8");
$draw->annotate(20,80,"Чай с мятой");
$image->drawImage($draw);
gmPng($image,"queued-text.png");У annotate три аргумента: x, базовая линия y и строка; отдельного угла нет. Возвращается GmagickDraw, тогда как annotateImage возвращает Gmagick. Полная программа проверяет неизменную подпись пикселей после добавления команды и изменение после применения. Одного Draw::annotate недостаточно для сохранения видимой надписи.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$image=gmCanvas();$before=$image->getImageSignature();
$draw=gmPen();$draw->setTextEncoding('UTF-8');$encoding=$draw->getTextEncoding();
$ret=$draw->annotate(20,80,'Чай с мятой');$stillBefore=$image->getImageSignature();
gmPng(clone $image,'gm98-text-draw-queue-before.png');
$image->drawImage($draw);gmPng($image,'gm98-text-draw-queue-after.png');
gmReport('gm98-text-draw-queue',["gmagickdraw.annotate", "gmagickdraw.settextencoding", "gmagickdraw.gettextencoding", "gmagick.drawimage"],["gm98-text-draw-queue-before.png", "gm98-text-draw-queue-after.png"],['draw_return'=>$ret===$draw,'queued_only'=>$before===$stillBefore,'applied_changes'=>$before!==$image->getImageSignature(),'encoding'=>$encoding==="UTF-8"],$errors??[],[]);
echo "draw: queued-before=no-pixel-change applied-after=changed png=2\n";
Ожидаемый результат
draw: queued-before=no-pixel-change applied-after=changed png=2
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Ожидаются пустой PNG и PNG с текстом. Упражнение: что выполнять после annotate? Решение: $image->drawImage($draw). Повторное применение того же Draw может снова выполнить накопленные команды; для нового независимого набора создавайте новый объект.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Отличить label-метаданные от видимой подписи
Label легко принять за видимую наклейку. Проверим на собственном рисунке: labelImage добавляет метаданные, затем annotateImage отдельно рисует подпись поверх пикселей.



$image = new Gmagick(__DIR__ . "/product.ppm");
$image->labelImage("Чай catalog:tea98");
gmPng(clone $image,"label-only.png");
$draw = gmPen(22,"#244f65");
$image->annotateImage($draw,64,184,0,"Чай с мятой");
gmPng($image,"visible-caption.png");labelImage получает строку и возвращает текущий Gmagick, хотя официальная сигнатура mixed. Подпись пикселей после label не изменилась, а служебная строка действительно найдена в PNG. Тёмная видимая надпись появилась только после annotateImage. Сохранение метаданных зависит от формата.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$image=new Gmagick(__DIR__.'/product.ppm');$before=$image->getImageSignature();gmPng(clone $image,'gm98-text-label-before.png');
$ret=$image->labelImage('Чай catalog:tea98');$afterLabel=$image->getImageSignature();gmPng(clone $image,'gm98-text-label-data.png');
$draw=gmPen(22,'#244f65');$image->annotateImage($draw,64,184,0,'Чай с мятой');gmPng($image,'gm98-text-label-visible.png');
$labelBytes=file_get_contents(__DIR__.'/gm98-text-label-data.png');
gmReport('gm98-text-label-data',["gmagick.labelimage", "gmagick.annotateimage"],["gm98-text-label-before.png", "gm98-text-label-data.png", "gm98-text-label-visible.png"],['label_same_object'=>$ret===$image,'label_no_pixels'=>$before===$afterLabel,'label_written'=>str_contains($labelBytes,"catalog:tea98"),'annotation_changes'=>$before!==$image->getImageSignature()],$errors??[],[]);
echo "label: metadata=stored pixels=same annotation=pixels-changed png=3\n";
Ожидаемый результат
label: metadata=stored pixels=same annotation=pixels-changed png=3
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Три PNG: исходник, визуально та же версия с label и настоящая подпись. Упражнение: получится водяной знак одним labelImage? Решение: нет, нужна операция над пикселями. Метод также не равен псевдоформату label: командной строки: похожее имя не делает интерфейсы одинаковыми.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Показать обычную, подчёркнутую и зачёркнутую цену
Оформление передаёт смысл: подчёркивание выделяет подпись, зачёркивание отмечает старую цену. Покажем три варианта одной строки с одинаковыми шрифтом, размером и положением.



$image = gmCanvas();
$draw = gmPen(32);
$draw->setTextDecoration(Gmagick::DECORATION_LINETROUGH);
$decoration = $draw->getTextDecoration();
$draw->annotate(24,104,"Чай 129 ₽");
$image->drawImage($draw);Константа Gmagick действительно называется DECORATION_LINETROUGH. Также существуют DECORATION_NO, DECORATION_UNDERLINE, DECORATION_OVERLINE. Setter задаёт оформление последующего текста, getter возвращает код. В полной программе отдельные Draw не дают настройкам случайно перейти между вариантами.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$images=[];$settings=[];
foreach(['plain'=>Gmagick::DECORATION_NO,'underline'=>Gmagick::DECORATION_UNDERLINE,'strike'=>Gmagick::DECORATION_LINETROUGH]as $name=>$decoration){
$image=gmCanvas();$draw=gmPen(32);$draw->setTextDecoration($decoration);$settings[$name]=$draw->getTextDecoration();
$draw->annotate(24,104,'Чай 129 ₽');$image->drawImage($draw);$images[$name]=$image;gmPng($image,'gm98-text-decoration-'.$name.'.png');
}
gmReport('gm98-text-decoration',["gmagickdraw.settextdecoration", "gmagickdraw.gettextdecoration", "gmagickdraw.annotate", "gmagick.drawimage"],["gm98-text-decoration-plain.png", "gm98-text-decoration-underline.png", "gm98-text-decoration-strike.png"],['settings'=>$settings["plain"]===0&&$settings["underline"]===1&&$settings["strike"]===3,'different_under'=>$images["plain"]->getImageSignature()!==$images["underline"]->getImageSignature(),'different_strike'=>$images["plain"]->getImageSignature()!==$images["strike"]->getImageSignature()],$errors??[],$settings);
echo "decoration: none underline line-through png=3\n";
Ожидаемый результат
decoration: none underline line-through png=3
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Три PNG отличаются оформлением. Упражнение: как снять зачёркивание перед новой ценой? Решение: setTextDecoration(Gmagick::DECORATION_NO). Оформление не меняет саму строку и не объясняет условия скидки: смысл остаётся ответственностью интерфейса.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Расположить две строки по отдельным базовым линиям
Расположим название и фасовку на двух отдельных базовых линиях. Это следующий шаг после одной надписи, без обещания автоматического переноса строк.

$draw = gmPen(24);
$metrics = $image->queryFontMetrics($draw,"Чай с мятой");
$step = $metrics["ascender"] - $metrics["descender"] + 8;
$draw->annotate(24,64,"Чай с мятой");
$draw->annotate(24,64 + $step,"100 г · 129 ₽");
$image->drawImage($draw);Ascender и отрицательный descender задают вертикальный размах относительно базовой линии; добавляем 8px воздуха. Полная программа использует массив и foreach: каждой строке соответствует команда annotate, затем y увеличивается на step. Измерение проводится при том же 24pt, которым рисуется текст.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$image=gmCanvas();$draw=gmPen(24);$metrics=$image->queryFontMetrics($draw,'Чай с мятой');
$step=$metrics['ascender']-$metrics['descender']+8;$y=64;
foreach(['Чай с мятой','100 г · 129 ₽']as $line){$draw->annotate(24,$y,$line);$y+=$step;}
$image->drawImage($draw);gmPng($image,'gm98-text-two-lines.png');
gmReport('gm98-text-two-lines',["gmagick.queryfontmetrics", "gmagickdraw.annotate", "gmagick.drawimage"],["gm98-text-two-lines.png"],['positive_step'=>$step>0,'within_canvas'=>$y<200,'metrics_width'=>$metrics["textWidth"]<=272],$errors??[],['metrics'=>$metrics,'baseline_step'=>$step,'next_baseline'=>$y]);
echo "lines: two baselines=measured no-automatic-wrap png=1\n";
Ожидаемый результат
lines: two baselines=measured no-automatic-wrap png=1
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Получается PNG с двумя читаемыми строками. Упражнение: что будет с произвольно длинной строкой? Решение: она может выйти за край; annotate не является HTML-блоком и не обязан переносить слова. Сначала измеряйте ширину и выбирайте политику переноса, уменьшения или отказа.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Собрать ценник со старой и новой ценой
Соберём ценник: название, старая цена 159 ₽ и новая 129 ₽. Для двух цен создадим отдельные Draw: один хранит зачёркивание, другой — обычное оформление. Каждый объект применим к тому же изображению своим drawImage.

$old = gmPen(22);
$old->setTextDecoration(Gmagick::DECORATION_LINETROUGH);
$old->annotate(24,96,"159 ₽");
$image->drawImage($old);
$new = gmPen(36,"#2f7a68");
$new->setTextDecoration(Gmagick::DECORATION_NO);
$new->annotate(24,150,"129 ₽");
$image->drawImage($new);В Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 объединение LINETROUGH и NO в одной очереди Draw вызвало GmagickException: Non-conforming drawing primitive definition (decorate). Поэтому каждая цена получает собственную очередь с одним значением decoration. Полная программа проверяет разные объекты и getter каждого: LINETROUGH для старой цены, NO для новой. labelImage отдельно добавляет служебный идентификатор; он не рисует название или цену.
<?php
declare(strict_types=1);
require __DIR__.'/gm98-text-fixture.php';
gmRestore();
$image=gmCanvas();$image->labelImage('catalog:tea-sale98');
$title=gmPen(22);$title->annotate(24,48,'Чай с мятой');$image->drawImage($title);
$old=gmPen(22);$old->setTextDecoration(Gmagick::DECORATION_LINETROUGH);$oldDecoration=$old->getTextDecoration();
$old->annotate(24,96,'159 ₽');$image->drawImage($old);
$new=gmPen(36,'#2f7a68');$new->setTextDecoration(Gmagick::DECORATION_NO);$newDecoration=$new->getTextDecoration();
$new->annotate(24,150,'129 ₽');$image->drawImage($new);gmPng($image,'gm98-text-sale-card.png');
gmReport('gm98-text-sale-card',["gmagick.labelimage", "gmagickdraw.settextdecoration", "gmagickdraw.gettextdecoration", "gmagickdraw.annotate", "gmagick.drawimage"],["gm98-text-sale-card.png"],['independent_decorations'=>$old!==$new&&$oldDecoration===Gmagick::DECORATION_LINETROUGH&&$newDecoration===Gmagick::DECORATION_NO,'metadata_written'=>str_contains(file_get_contents(__DIR__."/gm98-text-sale-card.png"),"catalog:tea-sale98")],$errors??[],[]);
echo "sale: old-price=struck new-price=plain label=stored png=1\n";
Ожидаемый результат
sale: old-price=struck new-price=plain label=stored png=1
Распакуйте файлы рядом и выполните php example.php. gm98-text-fixture.php восстановит только используемые входы и проверит их SHA256; шрифт устанавливать не нужно. FONT-LICENSE.txt и font-source.json описывают лицензию и происхождение. Основные вызовы видны в программе, gmCanvas/gmPen/gmPng сокращают создание холста, настройку пера и запись PNG8. metrics.json содержит версии, проверки и фактические измерения. Результаты PNG появляются после запуска; они не подменены изображениями из архива.
Ожидаемый PNG содержит три строки: название, зачёркнутую старую цену и крупную зелёную новую без зачёркивания. Упражнение: как добавить вторую обычную цену, не унаследовав зачёркивание? Решение: создайте отдельный Draw, задайте DECORATION_NO до annotate и примените его своим drawImage. Контраст и читаемость оценивайте в конечном размере карточки.
Связанные шаги: выбор и измерение шрифта, подписи и метаданные, наложение слоя, проверка сохранённого файла.
Из реального вопроса разработчика
PHP Imagick - setTextEncoding() function doesn't work. Автор показывает искажённые символы после setTextEncoding и пытается связать строку с HTTP-кодировкой ответа. Наш оригинальный пример хранит исходный PHP в UTF-8, задаёт UTF-8 в Draw и вкладывает шрифт с кириллицей. Настройка encoding не перекодирует повреждённую строку; старый совет utf8_decode не переносится на кириллицу. В статье показываются действительные PNG с русским текстом и рублём.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Gmagick::annotateimageСразу нарисовать текст на изображении
PECL gmagick >= Unknown · gmagick
Gmagick::annotateimage(GmagickDraw $GmagickDraw, float $x, float $y, float $angle, string $text): GmagickGmagick::annotateimage(GmagickDraw $GmagickDraw, float $x, float $y, float $angle, string $text): GmagickПять обязательных аргументов: GmagickDraw с настройками, float x и y, float angle и string text. X — смещение слева в пикселях, y — смещение базовой линии, angle — угол записи. Метод сразу изменяет текущий растр и возвращает Gmagick; в запуске это тот же объект. На примерах сравниваются 0° и 12°, русский ценник и надпись на отдельном слое. Ошибка обработки по PHP.net — GmagickException. Для текста нужны правильные байты UTF-8 и шрифт с нужными символами; метод не выбирает автоматически размер и перенос слов.
| Параметр | Официальный тип | Назначение |
|---|---|---|
| $GmagickDraw | GmagickDraw; обязательный | Объект настроек рисования. |
| $x | float; обязательный | Горизонтальное положение; для композиции смещение столбца. |
| $y | float; обязательный | Базовая линия текста; для композиции смещение строки. |
| $angle | float; обязательный | Угол рисования текста. |
| $text | string; обязательный | Строка текста; в примерах корректный UTF-8. |
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Нарисовать русский ценник прямо на изображении; Вычислить отступ от правого нижнего края.
Gmagick::labelimageДобавить label как метаданные
PECL gmagick >= Unknown · gmagick
Gmagick::labelimage(string $label): mixedGmagick::labelimage(string $label): mixedОбязательная строка label добавляет метку текущему изображению. Сигнатура PHP.net mixed, раздел результата обещает Gmagick; реальный возврат — тот же объект. Эта операция не рисует текст: пиксельная подпись не меняется, но label действительно сохранён в нашем PNG. Видимая подпись требует annotateImage или Draw::annotate с drawImage. Поддержка метаданных зависит от формата. Официальная ошибка — GmagickException. Метод нельзя считать эквивалентом отдельного псевдоформата label: командной строки.
| Параметр | Официальный тип | Назначение |
|---|---|---|
| $label | string; обязательный | Строковая метка изображения. |
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Отличить label-метаданные от видимой подписи; Собрать ценник со старой и новой ценой.
GmagickDraw::annotateДобавить текстовую команду в Draw
PECL gmagick >= Unknown · gmagick
GmagickDraw::annotate(float $x, float $y, string $text): GmagickDrawGmagickDraw::annotate(float $x, float $y, string $text): GmagickDrawОбязательные float x,y и string text задают левое положение, базовую линию и текст. Возвращается GmagickDraw, фактически тот же объект. Текстовая команда добавляется в Draw; пиксели Gmagick изменятся после $image->drawImage($draw). Метод не принимает отдельный angle, в отличие от annotateImage. Несколько команд позволяют явно разместить строки, но автоматический перенос и подгонка размера в этот контракт не входят.
| Параметр | Официальный тип | Назначение |
|---|---|---|
| $x | float; обязательный | Горизонтальное положение; для композиции смещение столбца. |
| $y | float; обязательный | Базовая линия текста; для композиции смещение строки. |
| $text | string; обязательный | Строка текста; в примерах корректный UTF-8. |
Отдельного раздела ошибок у этой страницы PHP.net нет. Проверенные ошибки setFont и setFontWeight имеют класс Exception; ошибки типов PHP могут быть TypeError. Не приписывайте всем методам Draw один класс исключения без проверки.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Собрать надпись в GmagickDraw и применить её; Расположить две строки по отдельным базовым линиям.
GmagickDraw::gettextdecorationПрочитать оформление аннотации
PECL gmagick >= Unknown · gmagick
GmagickDraw::gettextdecoration(): intGmagickDraw::gettextdecoration(): intАргументов нет, int возвращает одну из DECORATION_ либо 0 при отсутствии оформления. В проверенном runtime NO=0, UNDERLINE=1, LINETROUGH=3; код использует имена констант. В ценнике getter проверяет отдельные Draw: у старой цены LINETROUGH, у новой NO. Он не считывает оформление из уже нарисованного изображения. Для следующей независимой надписи задайте состояние явно.
Параметров нет: вызов записывается с пустыми скобками.
Отдельного раздела ошибок у этой страницы PHP.net нет. Проверенные ошибки setFont и setFontWeight имеют класс Exception; ошибки типов PHP могут быть TypeError. Не приписывайте всем методам Draw один класс исключения без проверки.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Показать обычную, подчёркнутую и зачёркнутую цену; Собрать ценник со старой и новой ценой.
GmagickDraw::gettextencodingПрочитать настройку кодировки
PECL gmagick >= Unknown · gmagick
GmagickDraw::gettextencoding(): mixedGmagickDraw::gettextencoding(): mixedАргументов нет. Mixed здесь означает строку кодировки либо false, если она не задана. Оба состояния подтверждены: новый Draw вернул false, после установки — UTF-8. Getter не проверяет, соответствуют ли байты конкретной строки этой кодировке, и не сообщает полноту покрытия символов шрифтом. Эти условия нужны дополнительно для правильного текста.
Параметров нет: вызов записывается с пустыми скобками.
Отдельного раздела ошибок у этой страницы PHP.net нет. Проверенные ошибки setFont и setFontWeight имеют класс Exception; ошибки типов PHP могут быть TypeError. Не приписывайте всем методам Draw один класс исключения без проверки.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Нарисовать русский ценник прямо на изображении; Собрать надпись в GmagickDraw и применить её.
GmagickDraw::settextdecorationВыбрать линии оформления текста
PECL gmagick >= Unknown · gmagick
GmagickDraw::settextdecoration(int $decoration): GmagickDrawGmagickDraw::settextdecoration(int $decoration): GmagickDrawОбязательный int decoration выбирает DECORATION_NO, DECORATION_UNDERLINE, DECORATION_OVERLINE либо DECORATION_LINETROUGH; последнее имя в Gmagick содержит именно LINETROUGH. Возвращается GmagickDraw. Это оформление последующих текстовых команд. В примерах три самостоятельных варианта и отдельные Draw для старой зачёркнутой и новой обычной цены. Такое разделение обходит наблюдаемую ошибку decorate при объединении разных оформлений в одной очереди Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16. Не меняет текстовые байты и не заменяет описание смысла цены.
| Параметр | Официальный тип | Назначение |
|---|---|---|
| $decoration | int; обязательный | Константа Gmagick::DECORATION_*. |
Отдельного раздела ошибок у этой страницы PHP.net нет. Проверенные ошибки setFont и setFontWeight имеют класс Exception; ошибки типов PHP могут быть TypeError. Не приписывайте всем методам Draw один класс исключения без проверки.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Показать обычную, подчёркнутую и зачёркнутую цену; Собрать ценник со старой и новой ценой.
GmagickDraw::settextencodingУказать кодировку текстовых аннотаций
PECL gmagick >= Unknown · gmagick
GmagickDraw::settextencoding(string $encoding): GmagickDrawGmagickDraw::settextencoding(string $encoding): GmagickDrawОбязательная string encoding задаёт кодировку, возвращается GmagickDraw. PHP.net указывает поддержанное UTF-8 для Unicode; пустая строка выбирает системное значение. Для успешного Unicode нужны глифы в шрифте. Метод не выполняет перекодирование повреждённой строки и не заменяет проверку исходных байтов. Наш PHP сохранён в UTF-8, строки передаются без utf8_decode, вложенный DejaVu реально показывает кириллицу и знак рубля.
| Параметр | Официальный тип | Назначение |
|---|---|---|
| $encoding | string; обязательный | UTF-8; пустая строка выбирает системное значение. |
Отдельного раздела ошибок у этой страницы PHP.net нет. Проверенные ошибки setFont и setFontWeight имеют класс Exception; ошибки типов PHP могут быть TypeError. Не приписывайте всем методам Draw один класс исключения без проверки.
Отметка PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Примеры проверяются в PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16 с вложенными файлами DejaVu.
Два применения: Нарисовать русский ценник прямо на изображении; Собрать надпись в GmagickDraw и применить её.
Источники и обсуждения
- PHP.net Gmagick::annotateimage
- PHP.net Gmagick::labelimage
- PHP.net GmagickDraw::annotate
- PHP.net GmagickDraw::gettextdecoration
- PHP.net GmagickDraw::gettextencoding
- PHP.net GmagickDraw::settextdecoration
- PHP.net GmagickDraw::settextencoding
- Gmagick C implementation
- GmagickDraw C implementation
- DejaVu license
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


