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

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

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

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

Глава 337 · После расположения надписей

ImagickDraw: интервалы букв, слов и строк в готовых карточках

Сделать читаемые метки, разрядить короткий заголовок и собрать многострочную карточку: реальные PNG, настройки темы и понятные границы уплотнения текста.

Сделать читаемую метку для коробки

На коробке или в карточке выдачи нужен короткий идентификатор AB-42. Дадим символам немного больше воздуха и сохраним готовый PNG. Это полезно для короткой метки; длинный артикул нельзя без проверки раздвигать до бесконечности.

Готовый PNG 320×140: бирюзовый AB-42 с дополнительным межсимвольным интервалом 3, начало (20,60), Open Sans 24 пункта при 72 DPI
Готовый PNG 320×140: бирюзовый AB-42 с дополнительным межсимвольным интервалом 3, начало (20,60), Open Sans 24 пункта при 72 DPI

В каждом архиве находятся example.php и четыре файла подготовки шрифта: font.php, font.ttf.b64, font-license.txt, font-metadata.json. Приложен неизменённый открытый Open Sans Regular 1.10 с кириллицей и Apache License 2.0. Helper восстанавливает font.ttf в той же папке, ничего не скачивает и не устанавливает. Базовый путь создания PNG, пункты и базовая линия объяснены в первой надписи, выбор опоры — в размещении подписей.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 140, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setTextAntialias(true);
$draw->setTextKerning(3);
$draw->setTextInterwordSpacing(0);
$draw->setTextInterlineSpacing(0);
$draw->annotation(20, 60, 'AB-42');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/first-spaced-label.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'first-spaced-label.png', "\n";
$image->clear();

Результат: first-spaced-label.png 320×140. AB-42 начинается возле x=20 на базовой линии y=60. Межсимвольная прибавка 3 установлена до annotation; буквы не растянуты как готовое изображение. Последняя строка — first-spaced-label.png. Распакуйте все файлы в отдельную папку и при установленном PHP с imagick выполните php example.php. PNG появится рядом с example.php: откройте его обычным просмотрщиком при масштабе 100%. Повторный запуск заменит одноимённый учебный файл; font.php восстановит приложенный шрифт без скачивания или установки.

$draw хранит объект команд; -> вызывает его метод. В setTextKerning(3) число 3 — аргумент дополнительного интервала. setTextInterwordSpacing(0) оставляет естественное продвижение пробела, setTextInterlineSpacing(0) — естественный шаг строк. Точка с запятой завершает инструкцию. annotation записывает текст, drawImage рисует его, writeImage сохраняет PNG. В этой главе явные GRAVITY_FORGET и ALIGN_LEFT оставляют x началом строки, y — базовой линией; преобразования не заданы.

Выбрать нужное расстояние: буквы, слова или строки

Три разных уровня: межсимвольная прибавка у AB-42, продвижение пробела у «Склад готов», шаг явно разделённых строк «Склад» и «Готово»
Три разных уровня: межсимвольная прибавка у AB-42, продвижение пробела у «Склад готов», шаг явно разделённых строк «Склад» и «Готово»
Нужно изменитьНастройкаЧто означает в наших примерах
Расстояние между символамиTextKerningДополнительное продвижение; +4 раздвигает AB-42, −1 немного уплотняет.
Расстояние между словамиTextInterwordSpacing0 оставляет natural; ненулевое значение заменяет advance пробела в проверенном renderer.
Расстояние строкTextInterlineSpacingДобавка к естественному шагу строк, разделённых реальным newline.

Все сравнения ниже выполнены при 72 DPI, без трансформаций, с одним Open Sans. Интервалы выражены в единицах простого холста, а размер font — в пунктах. Число spacing не означает точное количество белых пикселей между окрашенными буквами: боковые поля глифов, метрики и сглаживание остаются. При масштабировании/другой плотности переносить наблюдаемые пиксельные величины без проверки нельзя.

Сохранить три заранее выбранные строки в карточке

Получателю нужна карточка с именем, складом и временем выдачи. Мы уже знаем, какие три строки должны в ней быть. Запишем их через два настоящих перевода строки и увеличим естественный шаг на 10.

Карточка 400×220: «Получатель: Анна», «Склад № 2», «Выдача после 12:00» с interline 10, font 20, первой базовой линией y=60
Карточка 400×220: «Получатель: Анна», «Склад № 2», «Выдача после 12:00» с interline 10, font 20, первой базовой линией y=60
Сохранить карточку получения с явными строкамиПример для указанного окружения
<?php
declare(strict_types=1);

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(400, 220, 'white');
$image->setImageFormat('png');
$background = new ImagickDraw();
$background->setStrokeColor('none');
$background->setFillColor('#bdebe2');
$background->rectangle(20, 20, 380, 200);
$image->drawImage($background);
$background->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(20);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setTextAntialias(true);
$draw->setTextKerning(0);
$draw->setTextInterwordSpacing(0);
$draw->setTextInterlineSpacing(10);
$draw->annotation(35, 60, "Получатель: Анна
Склад № 2
Выдача после 12:00");
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/first-pickup-card.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'first-pickup-card.png', "\n";
$image->clear();

Результат: first-pickup-card.png 400×220. Мятная панель и три осознанно выбранные строки на белом холсте. Межстрочная добавка 10 создаёт больший шаг, а не новые строки и не автоматическое вписывание по ширине. Последняя строка — first-pickup-card.png. Распакуйте все файлы в отдельную папку и при установленном PHP с imagick выполните php example.php. PNG появится рядом с example.php: откройте его обычным просмотрщиком при масштабе 100%. Повторный запуск заменит одноимённый учебный файл; font.php восстановит приложенный шрифт без скачивания или установки.

Разрядка короткого «ДОСТАВКА» и обычное пояснение «Сегодня, 12:00»: разные настройки задаются перед соответствующими командами
Разрядка короткого «ДОСТАВКА» и обычное пояснение «Сегодня, 12:00»: разные настройки задаются перед соответствующими командами

В PHP "Склад\nГотово" с двойными кавычками создаёт реальный перевод строки. В одинарных кавычках 'Склад\nГотово' обратная косая и n остаются буквальными символами. В многострочном литерале кода выше переводы видны непосредственно. Interline действует на такой многострочный текст; две отдельные annotation с собственными y не начинают автоматически двигаться друг за другом.

Автоматический перенос длинной фамилии — другая задача. Метод spacing не знает ширину карточки и не выбирает места разрыва. Для переменной строки нужны измерение текста через Imagick::queryFontMetrics и политика переноса/сокращения. Настройка Draw также не меняет отдельно созданный caption pseudo-image задним числом.

Уплотнять осторожно и оставлять место для букв

Небольшие отрицательные значения сравниваются с обычным набором на реальных PNG: kerning −1, interline −4. Уплотнение не отменяет границ холста и выносных элементов
Небольшие отрицательные значения сравниваются с обычным набором на реальных PNG: kerning −1, interline −4. Уплотнение не отменяет границ холста и выносных элементов

Отрицательные настройки не обязательно вызывают ошибку: проверенная сборка хранит float и возвращает true. Но это не делает каждое значение полезным. Буквы могут наложиться, строки — пересечься, текст — выйти за верх/низ. Не лечите обрезанный descender большим отрицательным interline. Сначала проверьте базовую линию, поля, достаточную высоту и тот же файл шрифта; затем оцените читаемость.

Для внешнего параметра используйте конечное число и свой ограниченный диапазон, например −0.5…3 для конкретной короткой метки. Это правило приложения, а не гарантированный предел Imagick. Более сложные письменности, font shaping, лигатуры и разные пробельные символы не сводятся к одному ASCII-пробелу и пяти буквам AB-42.

Использовать настройку для решения, а не выдавать её за метрики

Getter возвращают сохранённые float: их можно перенести, ограничить или восстановить. Они не возвращают ширину фразы, фактический просвет, baseline step или готовый PNG
Getter возвращают сохранённые float: их можно перенести, ограничить или восстановить. Они не возвращают ширину фразы, фактический просвет, baseline step или готовый PNG

В примерах getter действительно участвуют в работе: kerning переносится в новую метку и ограничивается в маленьком компоненте, word spacing возвращается после технической строки, interline — после компактной сводки. Ноль не означает отсутствие текста. Прочитанные 10 не обещают line-height=10, прочитанные 18 не означают 18 новых пикселей сверх обычного пробела. Для размеров нужна отдельная операция измерения.

Собрать карточку заказа с разным ритмом текста

Получатель видит номер заказа, две строки статуса и нижнюю строку с количеством/ценой. Короткий заголовок немного разряжен, основной блок получает явные промежутки слов и строк, а нижние подписи — обычный набор. Каждый новый Draw получает явные настройки до своей annotation, поэтому нижняя строка не наследует разрядку заголовка.

PNG 480×280: мятная карточка, разряженный «ЗАКАЗ № 42», двухстрочный статус, количество слева и цена у правого поля
PNG 480×280: мятная карточка, разряженный «ЗАКАЗ № 42», двухстрочный статус, количество слева и цена у правого поля
Сохранить карточку с согласованными интерваламиПример для указанного окружения
<?php
declare(strict_types=1);

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(480, 280, 'white');
$image->setImageFormat('png');
$background = new ImagickDraw();
$background->setStrokeColor('none');
$background->setFillColor('#bdebe2');
$background->rectangle(20, 20, 460, 260);
$image->drawImage($background);
$background->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(26);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setTextAntialias(true);
$draw->setTextKerning(2);
$draw->setTextInterwordSpacing(0);
$draw->setTextInterlineSpacing(0);
$draw->annotation(40, 65, 'ЗАКАЗ № 42');
$image->drawImage($draw);
$draw->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(20);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setTextAntialias(true);
$draw->setTextKerning(0);
$draw->setTextInterwordSpacing(12);
$draw->setTextInterlineSpacing(10);
$draw->annotation(40, 120, "Комплект готов
Выдача на складе");
$image->drawImage($draw);
$draw->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(16);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setTextAntialias(true);
$draw->setTextKerning(0);
$draw->setTextInterwordSpacing(0);
$draw->setTextInterlineSpacing(0);
$draw->annotation(40, 225, '12 мест');
$image->drawImage($draw);
$draw->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(20);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_RIGHT);
$draw->setTextAntialias(true);
$draw->setTextKerning(0);
$draw->setTextInterwordSpacing(0);
$draw->setTextInterlineSpacing(0);
$draw->annotation(440, 225, '1 250 руб.');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/spacing-order-report.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'spacing-order-report.png', "\n";
$image->clear();

Результат: spacing-order-report.png 480×280. Мятная панель (20,20)—(460,260). Заголовок 26 пунктов, kerning 2, начало (40,65). Статус 20 пунктов: «Комплект готов» и «Выдача на складе», word 12, interline 10, первая baseline 120. Внизу на baseline 225 — «12 мест» слева и «1 250 руб.» справа, оба с нулевыми spacing. Правый край цены задаёт ALIGN_RIGHT/x=440, а не пробелы. Последняя строка — spacing-order-report.png. Распакуйте все файлы в отдельную папку и при установленном PHP с imagick выполните php example.php. PNG появится рядом с example.php: откройте его обычным просмотрщиком при масштабе 100%. Повторный запуск заменит одноимённый учебный файл; font.php восстановит приложенный шрифт без скачивания или установки.

Упражнение: смените складскую строку на «Доставка завтра», сохранив заголовок и нижний ряд. Решение: изменить только вторую строку текста в основном annotation, оставив настоящий newline. Затем увеличьте фамилию получателя в предыдущем примере: измерьте новую строку и выберите перенос, не пытаясь бесконечно сжимать буквы отрицательным kerning.

Перейти от интервалов к макету переменного текста

  • Kerning меняет дополнительное межсимвольное продвижение, interword — продвижение пробела, interline — добавку к естественному шагу явно заданных строк.
  • Getters возвращают float настройки; читаемость и границы текста они не измеряют.
  • Положительные и отрицательные значения нужно оценивать на своём шрифте, плотности и размере холста; весь набор условий примеров зафиксирован.
  • Настройка интервалов не включает автоперенос, не выбирает размер и не заменяет отдельные опоры колонок.

Дальше: измерение текста через Imagick::queryFontMetrics, выравнивание и привязки, система координат и преобразования, область рисования. Clip способен обрезать лишнее, но не делает обрезанные слова понятными.

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

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

ImagickDraw::getTextKerningНовый ярлык должен использовать интервал темы либо ограничить его для небольшого компонента. Нужна текущая настройка, а не догадка по виду PNG.

PECL imagick 2 >= 2.3.0, PECL imagick 3 >= 3.1.0 · imagick

ImagickDraw::getTextKerning(): float

Новый ярлык должен использовать интервал темы либо ограничить его для небольшого компонента. Нужна текущая настройка, а не догадка по виду PNG.

Getter читает сохранённое значение kerning конкретного Draw как float. В этих примерах это дополнительный межсимвольный интервал; он не равен полной ширине строки и не возвращает таблицу типографских пар AV/To. Полученное значение можно применить новому Draw или включить в проверку допустимого оформления.

Прочитать разрядку и применить её осмысленно: результат или поясняющая модель
Прочитать разрядку и применить её осмысленно: результат или поясняющая модель

Синтаксис, параметры и результат

ImagickDraw::getTextKerning(): float

Аргументов нет: пустые скобки читают настройку этого Draw.

float — текущая настройка. В первом примере после setTextKerning(3) echo печатает 3, а get_debug_type — float. Ноль и отрицательное значение допустимы как прочитанные настройки, а не признаки отсутствия строки или ошибки. В краткой официальной странице return prose пуст; тип и поведение дополнены сигнатурой, исходником binding и реальной проверкой.

Официальная доступность: PECL imagick 2 >= 2.3.0, PECL imagick 3 >= 3.1.0. Deprecated, removed и changelog этой записи пусты. Полный исходный контракт, включая пустые поля и отметку неполной документации, сохранён. Межстрочная пара документирована с Imagick 3.1.0; сборка также должна предоставлять соответствующие методы. Примеры рассчитаны на PHP 8.2+ с imagick; выполнены в PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46.

Официальные страницы отдельно не перечисляют ошибки/диапазон. Не считайте true проверкой допустимости бесконечности, любой отрицательной величины или читаемости. Внешнее число проверяют на конечность и ограничивают по правилам компонента. Отсутствие метода на старой сборке, пропавший font, ошибка drawImage и отказ записи PNG — отдельные причины; нулевая настройка и отрицательный float getter сами по себе не означают отказ.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 140, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$theme->setTextKerning(3);
$kerning = $theme->getTextKerning();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setTextAntialias(true);
$draw->setTextKerning(0);
$draw->setTextInterwordSpacing(0);
$draw->setTextInterlineSpacing(0);
$draw->setTextKerning($kerning);
$draw->annotation(20, 60, 'AB-42');
echo 'kerning=', $kerning, '; type=', get_debug_type($kerning), "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/copied-letter-spacing.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'copied-letter-spacing.png', "\n";
$image->clear();

Результат: copied-letter-spacing.png 320×140. Идентификатор AB-42 набран с дополнительным межсимвольным интервалом 3 в нашей системе координат. Float из темы явно применён новому Draw. Это перенос настройки, а не готовой картинки или измеренной ширины. Перед именем файла консоль: kerning=3; type=float. Последняя строка — copied-letter-spacing.png. Распакуйте все файлы в отдельную папку и при установленном PHP с imagick выполните php example.php. PNG появится рядом с example.php: откройте его обычным просмотрщиком при масштабе 100%. Повторный запуск заменит одноимённый учебный файл; font.php восстановит приложенный шрифт без скачивания или установки.

Практическая задача: Ограничить слишком разреженную тему для маленькой метки

Внешняя тема дала интервал 9, из-за которого короткая метка может стать слишком широкой. Прочитаем настройку и применим осознанный диапазон −0.5…3 для этого компонента. Это политика известной метки, не автоматическое вписывание любого текста.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 140, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$theme->setTextKerning(9);
$provided = $theme->getTextKerning();
$effective = min(3.0, max(-0.5, $provided));
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setTextAntialias(true);
$draw->setTextKerning(0);
$draw->setTextInterwordSpacing(0);
$draw->setTextInterlineSpacing(0);
$draw->setTextKerning($effective);
$draw->annotation(20, 60, 'AB-42');
echo 'effective-kerning=', $effective, "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/bounded-letter-spacing.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'bounded-letter-spacing.png', "\n";
$image->clear();

Результат: bounded-letter-spacing.png 320×140. Короткий AB-42 с интервалом 3 вместо полученных 9. Значение действительно участвует в выборе оформления. Для длинного артикула одного ограничения недостаточно — нужно измерение и решение о переносе или сокращении. Перед именем файла консоль: effective-kerning=3. Последняя строка — bounded-letter-spacing.png. Распакуйте все файлы в отдельную папку и при установленном PHP с imagick выполните php example.php. PNG появится рядом с example.php: откройте его обычным просмотрщиком при масштабе 100%. Повторный запуск заменит одноимённый учебный файл; font.php восстановит приложенный шрифт без скачивания или установки.

Ошибки, альтернативы и стоимость

GetTextKerning не сообщает, поместится ли артикул, сколько в нём букв и каковы фактические границы глифов. Для новой строки с другим font/point size/плотностью нужен новый расчёт метрик. Не считайте интервал 3 безопасным для любого текста; диапазон во втором примере — решение конкретного макета.

Чтение float настройки не растеризует весь текст. Расчёт/рисование глифов и объём PNG зависят от строки, font, площади холста и renderer. Ограничивайте внешнюю длину и размер изображения; не подбирайте интервал бесконечными повторными рендерами. Для адаптивного многострочного макета сначала измерьте строку с теми же настройками. Если нужен обычный текст на веб-странице, HTML/CSS часто удобнее, чем заранее нарисованный PNG.

В расширенных примерах foreach обходит сравниваемые варианты, min/max ограничивают число, сохранённая переменная $previous возвращает прежнюю настройку. Это не меняет уже записанные команды. См. условия и циклы, переменные и состояние очереди Draw.

Соседние инструменты: ImagickDraw::setTextKerning · ImagickDraw::getTextInterwordSpacing · ImagickDraw::setTextInterwordSpacing · ImagickDraw::getTextInterlineSpacing · ImagickDraw::setTextInterlineSpacing. Для общей правой колонки сумм используйте опоры и выравнивание, а не число пробелов.

ImagickDraw::setTextKerningИдентификатор или короткий заголовок нужно немного разрядить, сохранив сами формы букв. Сравним обычный, разреженный и немного уплотнённый вариант до применения в объявлении.

PECL imagick 2 >= 2.3.0, PECL imagick 3 · imagick

ImagickDraw::setTextKerning(float $kerning): bool

Идентификатор или короткий заголовок нужно немного разрядить, сохранив сами формы букв. Сравним обычный, разреженный и немного уплотнённый вариант до применения в объявлении.

Метод задаёт дополнительное межсимвольное продвижение при наборе. В нашем простом контексте 72 DPI, без CTM и с координатами холста, значение выражено в пиксельных единицах, а не в пунктах размера шрифта или процентах. Положительное значение раздвигает, небольшое отрицательное сближает символы. Название kerning здесь не означает, что вы задаёте отдельные коррекции каждой пары букв: встроенная обработка font-пар и алгоритм renderer — отдельный уровень.

Изменить расстояние между символами короткой метки: результат или поясняющая модель
Изменить расстояние между символами короткой метки: результат или поясняющая модель

Синтаксис, параметры и результат

ImagickDraw::setTextKerning(float $kerning): bool
ПараметрЧто передать и зачем
$kerningfloat, обязательное конечное значение: 0 — без добавочной разрядки, 4 — дополнительное продвижение в сравнении, −1 — небольшое уплотнение. Для собственного компонента ограничивайте диапазон. Это не ширина надписи и не число пробелов; в примерах значение задаётся до annotation.

bool: true при успехе. Текущий PHP wrapper принимает double, вызывает void DrawSetTextKerning и возвращает true; это не валидация читаемости/вписывания любой строки. Изображение появляется после drawImage, а не возвращается setter.

Официальная доступность: PECL imagick 2 >= 2.3.0, PECL imagick 3. Deprecated, removed и changelog этой записи пусты. Полный исходный контракт, включая пустые поля и отметку неполной документации, сохранён. Межстрочная пара документирована с Imagick 3.1.0; сборка также должна предоставлять соответствующие методы. Примеры рассчитаны на PHP 8.2+ с imagick; выполнены в PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46.

Официальные страницы отдельно не перечисляют ошибки/диапазон. Не считайте true проверкой допустимости бесконечности, любой отрицательной величины или читаемости. Внешнее число проверяют на конечность и ограничивают по правилам компонента. Отсутствие метода на старой сборке, пропавший font, ошибка drawImage и отказ записи PNG — отдельные причины; нулевая настройка и отрицательный float getter сами по себе не означают отказ.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(640, 220, 'white');
$image->setImageFormat('png');
foreach ([0, 4, -1] as $index => $spacing) {
    $draw = new ImagickDraw();
    $draw->setResolution(72, 72);
    $draw->setFont($font);
    $draw->setFontSize(24);
    $draw->setStrokeColor('none');
    $draw->setFillColor('#146c74');
    $draw->setGravity(Imagick::GRAVITY_FORGET);
    $draw->setTextAlignment(Imagick::ALIGN_LEFT);
    $draw->setTextAntialias(true);
    $draw->setTextKerning(0);
    $draw->setTextInterwordSpacing(0);
    $draw->setTextInterlineSpacing(0);
    $draw->setTextKerning($spacing);
    $draw->annotation(20 + $index * 210, 60, 'AB-42');
    $image->drawImage($draw);
    $draw->clear();
}
$path = __DIR__ . '/letter-spacing-comparison.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'letter-spacing-comparison.png', "\n";
$image->clear();

Результат: letter-spacing-comparison.png 640×220. Три одинаковых AB-42 на одной базовой линии y=60, начала x=20,230,440: kerning 0, 4 и −1. Средняя надпись шире, правая немного плотнее. В реальной проверке этого шрифта ширины окрашенной области были 65, 81 и 61 пиксель; это наблюдение данного рисунка, не универсальные метрики любого текста. Последняя строка — letter-spacing-comparison.png. Распакуйте все файлы в отдельную папку и при установленном PHP с imagick выполните php example.php. PNG появится рядом с example.php: откройте его обычным просмотрщиком при масштабе 100%. Повторный запуск заменит одноимённый учебный файл; font.php восстановит приложенный шрифт без скачивания или установки.

Практическая задача: Разрядить заголовок и вернуть обычный набор пояснения

В объявлении о доставке нужен заметный короткий заголовок, а время и условия должны читаться обычным текстом. Зададим разрядку перед заголовком и сбросим её к нулю перед пояснением; увеличение интервала не растягивает сами формы букв.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(400, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setTextAntialias(true);
$draw->setTextKerning(2);
$draw->setTextInterwordSpacing(0);
$draw->setTextInterlineSpacing(0);
$draw->annotation(20, 60, 'ДОСТАВКА');
$draw->setTextKerning(0);
$draw->setFontSize(18);
$draw->annotation(20, 120, 'Сегодня, 12:00');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/delivery-letter-spacing.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'delivery-letter-spacing.png', "\n";
$image->clear();

Результат: delivery-letter-spacing.png 400×180. Верхний заголовок «ДОСТАВКА», 24 пункта и kerning 2, нижнее пояснение «Сегодня, 12:00», 18 пунктов и kerning 0. Изменение настройки перед второй annotation не перенабирает уже записанный заголовок. Последняя строка — delivery-letter-spacing.png. Распакуйте все файлы в отдельную папку и при установленном PHP с imagick выполните php example.php. PNG появится рядом с example.php: откройте его обычным просмотрщиком при масштабе 100%. Повторный запуск заменит одноимённый учебный файл; font.php восстановит приложенный шрифт без скачивания или установки.

Ошибки, альтернативы и стоимость

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

Чтение float настройки не растеризует весь текст. Расчёт/рисование глифов и объём PNG зависят от строки, font, площади холста и renderer. Ограничивайте внешнюю длину и размер изображения; не подбирайте интервал бесконечными повторными рендерами. Для адаптивного многострочного макета сначала измерьте строку с теми же настройками. Если нужен обычный текст на веб-странице, HTML/CSS часто удобнее, чем заранее нарисованный PNG.

В расширенных примерах foreach обходит сравниваемые варианты, min/max ограничивают число, сохранённая переменная $previous возвращает прежнюю настройку. Это не меняет уже записанные команды. См. условия и циклы, переменные и состояние очереди Draw.

Соседние инструменты: ImagickDraw::getTextKerning · ImagickDraw::getTextInterwordSpacing · ImagickDraw::setTextInterwordSpacing · ImagickDraw::getTextInterlineSpacing · ImagickDraw::setTextInterlineSpacing. Для общей правой колонки сумм используйте опоры и выравнивание, а не число пробелов.

ImagickDraw::getTextInterwordSpacingКомпоненту нужно сохранить стиль темы или временно изменить промежуток для технической строки и затем вернуть исходное значение.

PECL imagick 2 >= 2.3.0, PECL imagick 3 >= 3.1.0 · imagick

ImagickDraw::getTextInterwordSpacing(): float

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

Getter возвращает float настройки interword. Он не извлекает пробелы из текста и не измеряет белую полосу на картинке. В проверенной связке нулевое значение использует обычное продвижение пробельного глифа, ненулевое подставляет указанное продвижение пробела. Поэтому чтение 18 не означает «прибавить 18 к уже существующему пробелу».

Прочитать промежуток слов для повторного применения или возврата: результат или поясняющая модель
Прочитать промежуток слов для повторного применения или возврата: результат или поясняющая модель

Синтаксис, параметры и результат

ImagickDraw::getTextInterwordSpacing(): float

Аргументов нет: пустые скобки читают настройку этого Draw.

float — текущее значение. После явного setTextInterwordSpacing(18) первый пример получает 18.0, echo печатает 18. Ноль — нормальное естественное поведение; отрицательное значение может быть сохранено, но не обещает пригодного оформления. Пустой раздел Return Values официального snapshot сохранён; здесь смысл дополнен первичным кодом и native-проверкой.

Официальная доступность: PECL imagick 2 >= 2.3.0, PECL imagick 3 >= 3.1.0. Deprecated, removed и changelog этой записи пусты. Полный исходный контракт, включая пустые поля и отметку неполной документации, сохранён. Межстрочная пара документирована с Imagick 3.1.0; сборка также должна предоставлять соответствующие методы. Примеры рассчитаны на PHP 8.2+ с imagick; выполнены в PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46.

Официальные страницы отдельно не перечисляют ошибки/диапазон. Не считайте true проверкой допустимости бесконечности, любой отрицательной величины или читаемости. Внешнее число проверяют на конечность и ограничивают по правилам компонента. Отсутствие метода на старой сборке, пропавший font, ошибка drawImage и отказ записи PNG — отдельные причины; нулевая настройка и отрицательный float getter сами по себе не означают отказ.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 140, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$theme->setTextInterwordSpacing(18);
$spacing = $theme->getTextInterwordSpacing();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setTextAntialias(true);
$draw->setTextKerning(0);
$draw->setTextInterwordSpacing(0);
$draw->setTextInterlineSpacing(0);
$draw->setTextInterwordSpacing($spacing);
$draw->annotation(20, 60, 'Склад готов');
echo 'word-spacing=', $spacing, '; type=', get_debug_type($spacing), "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/copied-word-spacing.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'copied-word-spacing.png', "\n";
$image->clear();

Результат: copied-word-spacing.png 320×140. Между словами «Склад готов» установлен ненулевой advance пробела 18. Getter сообщает сохранённый float, который использует новый Draw; он не возвращает число белых пикселей между последней и первой буквами. Перед именем файла консоль: word-spacing=18; type=float. Последняя строка — copied-word-spacing.png. Распакуйте все файлы в отдельную папку и при установленном PHP с imagick выполните php example.php. PNG появится рядом с example.php: откройте его обычным просмотрщиком при масштабе 100%. Повторный запуск заменит одноимённый учебный файл; font.php восстановит приложенный шрифт без скачивания или установки.

Практическая задача: Временно уплотнить код и восстановить оформление статуса

Компонент получил увеличенные промежутки темы. Для технического обозначения BOX 42 вернём natural spacing, затем по считанному float восстановим стиль перед обычным статусом. Сохранённое значение избавляет от жёстко записанного числа при возврате.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(360, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setTextAntialias(true);
$draw->setTextKerning(0);
$draw->setTextInterwordSpacing(18);
$draw->setTextInterlineSpacing(0);
$previous = $draw->getTextInterwordSpacing();
$draw->setTextInterwordSpacing(0);
$draw->annotation(20, 60, 'BOX 42');
$draw->setTextInterwordSpacing($previous);
$draw->annotation(20, 120, 'Склад готов');
echo 'restored-word-spacing=', $previous, "\n";
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/restored-word-spacing.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'restored-word-spacing.png', "\n";
$image->clear();

Результат: restored-word-spacing.png 360×180. Верхнее BOX 42 использует обычный пробел, нижнее «Склад готов» — восстановленный advance 18. Getter нужен для возврата оформления, а не для подсчёта пробелов в строке или чтения старого изображения. Перед именем файла консоль: restored-word-spacing=18. Последняя строка — restored-word-spacing.png. Распакуйте все файлы в отдельную папку и при установленном PHP с imagick выполните php example.php. PNG появится рядом с example.php: откройте его обычным просмотрщиком при масштабе 100%. Повторный запуск заменит одноимённый учебный файл; font.php восстановит приложенный шрифт без скачивания или установки.

Ошибки, альтернативы и стоимость

Один и тот же сохранённый float может выглядеть иначе при другом font, масштабе, строке или CTM. Getter не сообщает общую длину и не выравнивает табличные столбцы. Для восстановления передайте прочитанное значение setter; уже записанная строка останется со своей прежней настройкой.

Чтение float настройки не растеризует весь текст. Расчёт/рисование глифов и объём PNG зависят от строки, font, площади холста и renderer. Ограничивайте внешнюю длину и размер изображения; не подбирайте интервал бесконечными повторными рендерами. Для адаптивного многострочного макета сначала измерьте строку с теми же настройками. Если нужен обычный текст на веб-странице, HTML/CSS часто удобнее, чем заранее нарисованный PNG.

В расширенных примерах foreach обходит сравниваемые варианты, min/max ограничивают число, сохранённая переменная $previous возвращает прежнюю настройку. Это не меняет уже записанные команды. См. условия и циклы, переменные и состояние очереди Draw.

Соседние инструменты: ImagickDraw::getTextKerning · ImagickDraw::setTextKerning · ImagickDraw::setTextInterwordSpacing · ImagickDraw::getTextInterlineSpacing · ImagickDraw::setTextInterlineSpacing. Для общей правой колонки сумм используйте опоры и выравнивание, а не число пробелов.

ImagickDraw::setTextInterwordSpacingКраткую сводку из нескольких слов или чисел нужно сделать визуально более раздельной, не меняя расстояние между буквами каждого слова.

PECL imagick 2 >= 2.3.0, PECL imagick 3 · imagick

ImagickDraw::setTextInterwordSpacing(float $spacing): bool

Краткую сводку из нескольких слов или чисел нужно сделать визуально более раздельной, не меняя расстояние между буквами каждого слова.

В проверенном FreeType-пути ненулевое interword spacing заменяет продвижение пробела при переходе к следующему непробельному символу. Это не универсальная прибавка N к обычному пробелу. Ноль оставляет естественное продвижение шрифта. В модели «Склад готов» natural advance равен 6, настройка 18 увеличивает общую ширину на 12; соседние боковые поля букв тоже влияют на видимый просвет. Другие виды пробельных символов/шэйпинг не объявлены тождественными обычному пробелу U+0020.

Отделить слова, сохранив плотность букв внутри них: результат или поясняющая модель
Отделить слова, сохранив плотность букв внутри них: результат или поясняющая модель

Синтаксис, параметры и результат

ImagickDraw::setTextInterwordSpacing(float $spacing): bool
ПараметрЧто передать и зачем
$spacingfloat, обязательное конечное продвижение пробела в единицах нашего холста: 0 для natural, 18 для широкого, 3 для более узкого варианта. Это не количество ASCII-пробелов, не CSS word-spacing в процентах и не абсолютный белый зазор между краями глифов. Отрицательные значения могут дать сближение или наложение слов; в полезных сценариях они не нужны.

bool: true при успехе; текущий wrapper передаёт double в void native setter. Успешная запись настройки не проверяет отсутствие наложения слов или достаточность размеров PNG. Официальное true сохранено, подробности пустых параметров дополнены.

Официальная доступность: PECL imagick 2 >= 2.3.0, PECL imagick 3. Deprecated, removed и changelog этой записи пусты. Полный исходный контракт, включая пустые поля и отметку неполной документации, сохранён. Межстрочная пара документирована с Imagick 3.1.0; сборка также должна предоставлять соответствующие методы. Примеры рассчитаны на PHP 8.2+ с imagick; выполнены в PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46.

Официальные страницы отдельно не перечисляют ошибки/диапазон. Не считайте true проверкой допустимости бесконечности, любой отрицательной величины или читаемости. Внешнее число проверяют на конечность и ограничивают по правилам компонента. Отсутствие метода на старой сборке, пропавший font, ошибка drawImage и отказ записи PNG — отдельные причины; нулевая настройка и отрицательный float getter сами по себе не означают отказ.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(640, 220, 'white');
$image->setImageFormat('png');
foreach ([0, 18, 3] as $index => $spacing) {
    $draw = new ImagickDraw();
    $draw->setResolution(72, 72);
    $draw->setFont($font);
    $draw->setFontSize(24);
    $draw->setStrokeColor('none');
    $draw->setFillColor('#146c74');
    $draw->setGravity(Imagick::GRAVITY_FORGET);
    $draw->setTextAlignment(Imagick::ALIGN_LEFT);
    $draw->setTextAntialias(true);
    $draw->setTextKerning(0);
    $draw->setTextInterwordSpacing(0);
    $draw->setTextInterlineSpacing(0);
    $draw->setTextInterwordSpacing($spacing);
    $draw->annotation(20 + $index * 210, 60, 'Склад готов');
    $image->drawImage($draw);
    $draw->clear();
}
$path = __DIR__ . '/word-spacing-comparison.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'word-spacing-comparison.png', "\n";
$image->clear();

Результат: word-spacing-comparison.png 640×220. Три «Склад готов»: natural spacing при 0, явный advance пробела 18 и 3. В проверенной связке natural advance был 6, поэтому вариант 18 шире natural на 12, а не на 18 пикселей. Ненулевое значение здесь заменяет advance пробела; реальный белый просвет также зависит от боковых полей соседних букв. Последняя строка — word-spacing-comparison.png. Распакуйте все файлы в отдельную папку и при установленном PHP с imagick выполните php example.php. PNG появится рядом с example.php: откройте его обычным просмотрщиком при масштабе 100%. Повторный запуск заменит одноимённый учебный файл; font.php восстановит приложенный шрифт без скачивания или установки.

Практическая задача: Отделить группы в краткой сводке склада

В короткой сводке «12 мест 3 коробки» хочется увеличить интервалы между словами и числами, сохранив плотность букв внутри каждой группы. Это другой инструмент, чем kerning. Для пояснения ниже восстановим natural spacing.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(400, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(20);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setTextAntialias(true);
$draw->setTextKerning(0);
$draw->setTextInterwordSpacing(20);
$draw->setTextInterlineSpacing(0);
$draw->annotation(20, 60, '12 мест 3 коробки');
$draw->setTextInterwordSpacing(0);
$draw->setFontSize(16);
$draw->annotation(20, 115, 'Выдать на складе');
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/warehouse-word-groups.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'warehouse-word-groups.png', "\n";
$image->clear();

Результат: warehouse-word-groups.png 400×180. Сводка в 20 пунктов имеет расширенные промежутки между группами, пояснение в 16 пунктов — обычные. Буквы внутри «коробки» не раздвигаются этим setter. Для настоящих табличных колонок нужны отдельные опоры, а не попытка подобрать пробелы. Последняя строка — warehouse-word-groups.png. Распакуйте все файлы в отдельную папку и при установленном PHP с imagick выполните php example.php. PNG появится рядом с example.php: откройте его обычным просмотрщиком при масштабе 100%. Повторный запуск заменит одноимённый учебный файл; font.php восстановит приложенный шрифт без скачивания или установки.

Ошибки, альтернативы и стоимость

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

Чтение float настройки не растеризует весь текст. Расчёт/рисование глифов и объём PNG зависят от строки, font, площади холста и renderer. Ограничивайте внешнюю длину и размер изображения; не подбирайте интервал бесконечными повторными рендерами. Для адаптивного многострочного макета сначала измерьте строку с теми же настройками. Если нужен обычный текст на веб-странице, HTML/CSS часто удобнее, чем заранее нарисованный PNG.

В расширенных примерах foreach обходит сравниваемые варианты, min/max ограничивают число, сохранённая переменная $previous возвращает прежнюю настройку. Это не меняет уже записанные команды. См. условия и циклы, переменные и состояние очереди Draw.

Соседние инструменты: ImagickDraw::getTextKerning · ImagickDraw::setTextKerning · ImagickDraw::getTextInterwordSpacing · ImagickDraw::getTextInterlineSpacing · ImagickDraw::setTextInterlineSpacing. Для общей правой колонки сумм используйте опоры и выравнивание, а не число пробелов.

ImagickDraw::getTextInterlineSpacingМногострочная карточка должна сохранить стиль темы, а временный компактный блок не должен менять оформление следующего компонента.

PECL imagick 3 >= 3.1.0 · imagick

ImagickDraw::getTextInterlineSpacing(): float

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

Getter возвращает float сохранённой добавки к естественному шагу строк. Это не полная line-height, не число строк и не расстояние от верхнего до нижнего окрашенного пикселя буквы. Для возврата оформления храните это значение до временного изменения и применяйте перед следующим annotation.

Прочитать прибавку к шагу строк и восстановить оформление блока: результат или поясняющая модель
Прочитать прибавку к шагу строк и восстановить оформление блока: результат или поясняющая модель

Синтаксис, параметры и результат

ImagickDraw::getTextInterlineSpacing(): float

Аргументов нет: пустые скобки читают настройку этого Draw.

float. После setTextInterlineSpacing(10) первый пример получает 10.0 и печатает type=float. Ноль сохраняет обычный шаг; отрицательное значение сближает строки и само по себе не является ошибкой. Официальный return prose пуст; тип/поведение подтверждены wrapper и проверенной программой.

Официальная доступность: PECL imagick 3 >= 3.1.0. Deprecated, removed и changelog этой записи пусты. Полный исходный контракт, включая пустые поля и отметку неполной документации, сохранён. Межстрочная пара документирована с Imagick 3.1.0; сборка также должна предоставлять соответствующие методы. Примеры рассчитаны на PHP 8.2+ с imagick; выполнены в PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46.

Официальные страницы отдельно не перечисляют ошибки/диапазон. Не считайте true проверкой допустимости бесконечности, любой отрицательной величины или читаемости. Внешнее число проверяют на конечность и ограничивают по правилам компонента. Отсутствие метода на старой сборке, пропавший font, ошибка drawImage и отказ записи PNG — отдельные причины; нулевая настройка и отрицательный float getter сами по себе не означают отказ.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$theme = new ImagickDraw();
$theme->setTextInterlineSpacing(10);
$spacing = $theme->getTextInterlineSpacing();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setTextAntialias(true);
$draw->setTextKerning(0);
$draw->setTextInterwordSpacing(0);
$draw->setTextInterlineSpacing(0);
$draw->setTextInterlineSpacing($spacing);
$draw->annotation(20, 60, "Склад
Готово");
echo 'line-spacing=', $spacing, '; type=', get_debug_type($spacing), "\n";
$theme->clear();
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/copied-line-spacing.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'copied-line-spacing.png', "\n";
$image->clear();

Результат: copied-line-spacing.png 320×180. Две строки «Склад» и «Готово» с увеличенным шагом. Считанные 10 добавлены к естественному шагу строк этого шрифта; это не абсолютная высота каждой строки 10 пикселей. Перенос явно находится в строковом литерале. Перед именем файла консоль: line-spacing=10; type=float. Последняя строка — copied-line-spacing.png. Распакуйте все файлы в отдельную папку и при установленном PHP с imagick выполните php example.php. PNG появится рядом с example.php: откройте его обычным просмотрщиком при масштабе 100%. Повторный запуск заменит одноимённый учебный файл; font.php восстановит приложенный шрифт без скачивания или установки.

Практическая задача: Сделать компактную сводку и восстановить просторную инструкцию

Один компонент пишет два блока: короткие количества компактно, инструкцию с прежним увеличенным межстрочным шагом. Сохраним текущую настройку, изменим её для первого annotation и вернём перед вторым.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(640, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(24);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setTextAntialias(true);
$draw->setTextKerning(0);
$draw->setTextInterwordSpacing(0);
$draw->setTextInterlineSpacing(12);
$previous = $draw->getTextInterlineSpacing();
$draw->setTextInterlineSpacing(0);
$draw->annotation(20, 60, "12 мест
3 коробки");
$draw->setTextInterlineSpacing($previous);
$draw->annotation(330, 60, "Получение
На складе");
echo 'restored-line-spacing=', $previous, "\n";
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/restored-line-spacing.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'restored-line-spacing.png', "\n";
$image->clear();

Результат: restored-line-spacing.png 640×200. Слева две строки количеств с естественным шагом, справа две строки инструкции с восстановленной прибавкой 12. Обе первые базовые линии y=60; второй блок имеет более низкую следующую строку. Сам getter ничего не переставляет: считанный float применяется setter до команды текста. Перед именем файла консоль: restored-line-spacing=12. Последняя строка — restored-line-spacing.png. Распакуйте все файлы в отдельную папку и при установленном PHP с imagick выполните php example.php. PNG появится рядом с example.php: откройте его обычным просмотрщиком при масштабе 100%. Повторный запуск заменит одноимённый учебный файл; font.php восстановит приложенный шрифт без скачивания или установки.

Ошибки, альтернативы и стоимость

GetTextInterlineSpacing не измеряет уже созданный PNG и не возвращает вычисленное расстояние между базовыми линиями. Естественная часть шага зависит от шрифта и размера. Перенос на новый Draw требует также font, плотности и остальных настроек; одного float для полного повторения макета недостаточно.

Чтение float настройки не растеризует весь текст. Расчёт/рисование глифов и объём PNG зависят от строки, font, площади холста и renderer. Ограничивайте внешнюю длину и размер изображения; не подбирайте интервал бесконечными повторными рендерами. Для адаптивного многострочного макета сначала измерьте строку с теми же настройками. Если нужен обычный текст на веб-странице, HTML/CSS часто удобнее, чем заранее нарисованный PNG.

В расширенных примерах foreach обходит сравниваемые варианты, min/max ограничивают число, сохранённая переменная $previous возвращает прежнюю настройку. Это не меняет уже записанные команды. См. условия и циклы, переменные и состояние очереди Draw.

Соседние инструменты: ImagickDraw::getTextKerning · ImagickDraw::setTextKerning · ImagickDraw::getTextInterwordSpacing · ImagickDraw::setTextInterwordSpacing · ImagickDraw::setTextInterlineSpacing. Для общей правой колонки сумм используйте опоры и выравнивание, а не число пробелов.

ImagickDraw::setTextInterlineSpacingИмя, место и время выдачи должны выглядеть тремя читаемыми строками, а не тесным комком текста. Изменим шаг строк, оставив их содержание и размер шрифта прежними.

PECL imagick 3 >= 3.1.0 · imagick

ImagickDraw::setTextInterlineSpacing(float $spacing): bool

Имя, место и время выдачи должны выглядеть тремя читаемыми строками, а не тесным комком текста. Изменим шаг строк, оставив их содержание и размер шрифта прежними.

Значение прибавляется к естественному шагу многострочного текста. При 0 остаётся обычный шаг шрифта; +12 опускает следующую строку ещё на 12, −4 приближает её на 4 в нашей простой системе координат. Это не абсолютная высота строки 12. Эффект относится к переводам строки внутри одного annotation; два независимых annotation с вручную заданными y не начинают автоматически зависеть от этого параметра.

Изменить шаг явно заданных строк: результат или поясняющая модель
Изменить шаг явно заданных строк: результат или поясняющая модель

Синтаксис, параметры и результат

ImagickDraw::setTextInterlineSpacing(float $spacing): bool
ПараметрЧто передать и зачем
$spacingfloat, обязательная конечная добавка к шагу строк. Примеры используют 0, 12, −4 и 10 на фиксированном холсте при 72 DPI, без преобразований. Это не число строк, не размер font в пунктах и не отступ первой строки от верхнего края. Для отрицательных значений заранее проверьте отсутствие наложения.

bool: true при успехе. В wrapper setter вызывает void DrawSetTextInterlineSpacing и возвращает true. Пригодность шага, достаточность высоты холста и перенос произвольного текста этим bool не проверяются.

Официальная доступность: PECL imagick 3 >= 3.1.0. Deprecated, removed и changelog этой записи пусты. Полный исходный контракт, включая пустые поля и отметку неполной документации, сохранён. Межстрочная пара документирована с Imagick 3.1.0; сборка также должна предоставлять соответствующие методы. Примеры рассчитаны на PHP 8.2+ с imagick; выполнены в PHP 8.5.11, Imagick 3.8.1, ImageMagick 7.1.1-46.

Официальные страницы отдельно не перечисляют ошибки/диапазон. Не считайте true проверкой допустимости бесконечности, любой отрицательной величины или читаемости. Внешнее число проверяют на конечность и ограничивают по правилам компонента. Отсутствие метода на старой сборке, пропавший font, ошибка drawImage и отказ записи PNG — отдельные причины; нулевая настройка и отрицательный float getter сами по себе не означают отказ.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(640, 220, 'white');
$image->setImageFormat('png');
foreach ([0, 12, -4] as $index => $spacing) {
    $draw = new ImagickDraw();
    $draw->setResolution(72, 72);
    $draw->setFont($font);
    $draw->setFontSize(24);
    $draw->setStrokeColor('none');
    $draw->setFillColor('#146c74');
    $draw->setGravity(Imagick::GRAVITY_FORGET);
    $draw->setTextAlignment(Imagick::ALIGN_LEFT);
    $draw->setTextAntialias(true);
    $draw->setTextKerning(0);
    $draw->setTextInterwordSpacing(0);
    $draw->setTextInterlineSpacing(0);
    $draw->setTextInterlineSpacing($spacing);
    $draw->annotation(20 + $index * 210, 60, "Склад\nГотово");
    $image->drawImage($draw);
    $draw->clear();
}
$path = __DIR__ . '/line-spacing-comparison.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'line-spacing-comparison.png', "\n";
$image->clear();

Результат: line-spacing-comparison.png 640×220. Три двухстрочных блока с одинаковой первой базовой линией y=60: interline 0, 12 и −4. Во втором блоке вторая строка ниже обычной на 12, в третьем выше обычной на 4. Первые строки остаются на месте. Это прибавка к естественному шагу, а не полная line-height и не расстояние между белыми краями букв. Последняя строка — line-spacing-comparison.png. Распакуйте все файлы в отдельную папку и при установленном PHP с imagick выполните php example.php. PNG появится рядом с example.php: откройте его обычным просмотрщиком при масштабе 100%. Повторный запуск заменит одноимённый учебный файл; font.php восстановит приложенный шрифт без скачивания или установки.

Практическая задача: Сохранить читаемую карточку получения с тремя строками

Имя получателя, склад и время выдачи — три осознанно выбранные строки. Добавим между ними воздух, не смешивая интервал строк с величиной шрифта и не ожидая автоматического переноса по ширине карточки.

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

$font = require __DIR__ . '/font.php';
$image = new Imagick();
$image->newImage(400, 220, 'white');
$image->setImageFormat('png');
$background = new ImagickDraw();
$background->setStrokeColor('none');
$background->setFillColor('#bdebe2');
$background->rectangle(20, 20, 380, 200);
$image->drawImage($background);
$background->clear();
$draw = new ImagickDraw();
$draw->setResolution(72, 72);
$draw->setFont($font);
$draw->setFontSize(20);
$draw->setStrokeColor('none');
$draw->setFillColor('#146c74');
$draw->setGravity(Imagick::GRAVITY_FORGET);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setTextAntialias(true);
$draw->setTextKerning(0);
$draw->setTextInterwordSpacing(0);
$draw->setTextInterlineSpacing(10);
$draw->annotation(35, 60, "Получатель: Анна
Склад № 2
Выдача после 12:00");
$image->drawImage($draw);
$draw->clear();
$path = __DIR__ . '/pickup-multiline-card.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pickup-multiline-card.png', "\n";
$image->clear();

Результат: pickup-multiline-card.png 400×220. Мятная карточка (20,20)—(380,200), три строки «Получатель: Анна», «Склад № 2», «Выдача после 12:00», 20 пунктов, начало (35,60), interline 10. В тексте два явных перевода строки. Шрифт и холст те же; длинная внешняя фамилия потребовала бы дополнительного измерения. Последняя строка — pickup-multiline-card.png. Распакуйте все файлы в отдельную папку и при установленном PHP с imagick выполните php example.php. PNG появится рядом с example.php: откройте его обычным просмотрщиком при масштабе 100%. Повторный запуск заменит одноимённый учебный файл; font.php восстановит приложенный шрифт без скачивания или установки.

Ошибки, альтернативы и стоимость

Метод не добавляет переводы строки и не переносит длинную фразу по ширине. В PHP двойные кавычки с \n создают настоящий перевод, одинарные сохраняют буквальные обратную косую и n. Отрицательная добавка не исправляет неправильную базовую линию или обрезанные выносные элементы. Если нужны собственные точные y для каждой строки, задавайте отдельные annotation осознанно; для автопереноса потребуется измерение.

Чтение float настройки не растеризует весь текст. Расчёт/рисование глифов и объём PNG зависят от строки, font, площади холста и renderer. Ограничивайте внешнюю длину и размер изображения; не подбирайте интервал бесконечными повторными рендерами. Для адаптивного многострочного макета сначала измерьте строку с теми же настройками. Если нужен обычный текст на веб-странице, HTML/CSS часто удобнее, чем заранее нарисованный PNG.

В расширенных примерах foreach обходит сравниваемые варианты, min/max ограничивают число, сохранённая переменная $previous возвращает прежнюю настройку. Это не меняет уже записанные команды. См. условия и циклы, переменные и состояние очереди Draw.

Соседние инструменты: ImagickDraw::getTextKerning · ImagickDraw::setTextKerning · ImagickDraw::getTextInterwordSpacing · ImagickDraw::setTextInterwordSpacing · ImagickDraw::getTextInterlineSpacing. Для общей правой колонки сумм используйте опоры и выравнивание, а не число пробелов.

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

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

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

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

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