Как получить ширину/высоту текста

Как получить ширину / высоту письменного текста в Imagemagick?

convert -font 'tahoma.ttf' -draw "text 10,10 'the text'" img.png

3 ответов


мы можем использовать функцию queryFontMetrics imagick. см. эту ссылку (http://php.net/manual/en/imagick.queryfontmetrics.php)

проверка срабатывания этой функции вы получите ширину и высоту.


посмотрите на эту страницу: http://www.imagemagick.org/ImageMagick-7.0.0/script/conjure.php (3-й пример)

на колдовать binary позволяет запускать сценарии на основе XML, написанные на языке сценариев Magick (MSL). Они могут использовать команду IMs "query-font-metrics", которая, похоже, недоступна для других двоичных файлов.


это действительно поздно, но, от PHP.net:

использование:

Imagick:: queryFontMetrics-возвращает массив, представляющий метрики шрифта

такой:

   // Set font.
      $font = PATH/TO/YOUR/CUSTOM/FONT
   // Get dimensions.
   // Create a new Imagick object.
      $imTest = new Imagick();

   // Create an ImagickDraw object.
      $drawTest = new ImagickDraw();

   // Set the font.
      $drawTest->setFont($font);

   // Set the local X and Y.
      $localX = 0;
      $localY = 0;

   // Dump the font metrics, autodetect multiline 
      for ($i = 0; $i < strlen($yourText); $i++) {
         if ($yourText[$i] === ' ') {
            $tempX += $imTest->queryFontMetrics($drawTest, $yourText[$i])['textWidth'];
         } else {
            $tempX += $imTest->queryFontMetrics($drawTest, $yourText[$i])['originX'] + $imTest->queryFontMetrics($drawTest, $yourText[$i])['boundingBox']['x2'] + $imTest->queryFontMetrics($drawTest, $yourText[$i])['boundingBox']['x1'];
         }    
      }

где:

characterWidth и characterHeight - Они, похоже, связаны с размером, который вы указали для шрифта, и, похоже, не отличаются от шрифта к шрифту (при том же размере). Как таковыми они не являются особенно полезно (для меня, по крайней мере). Они не надежный индикатор того, сколько места шрифт будет использовать.

ascender - Ascender-это часть шрифта, которая находится выше базовой линии. Это не связано с символом - значение ascender одинаково для каждого символ в шрифте.

descender - The descender является частью шрифта, который находится ниже базовой линии. Он представлен как отрицательная цифра. Добавление абсолютных значений жумар и спусковое дает вам...

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

текстовое - Это значение варьируется от символа к символу и является шириной символа. Это полезно, если boundingBox не предоставляет годный значения (см. boundingBox ниже). При позиционировании символов one по одному-не используйте textWidth, используйте originX (см. ниже).

maxHorizontalAdvance - Боюсь, я не совсем понял цель этого. Это то же самое для каждого символа шрифта. Для шрифта Arial Italic на размер 67, значение 89 которое гораздо шире чем сообщенное выдвижение для M или W того же размера.

ограничивающего прямоугольника - Это возвращает ассоциативный массив, описывающий четыре точки (x1, y1, x2, y2) прямоугольника, содержащие символ. Такие ценности относительно начала координат (т. е. координат того, где вы находитесь рисование символа внутри изображения). Возвращаемый прямоугольник очень точная и полностью закрывает все части печатного символа - но boundingBox работает только с отдельными символами. Она не даст точные цифры для нескольких символов (по моему опыту в любом случае). При рисовании коробки вам нужно добавить значения" x " в происхождение и Вычтите значения " y " из начала координат. Нельзя полагаться на boundingBox для символа пробела. Он возвращает boundingBox (0,0,0,0). textWidth (см. выше) пригодится здесь.

originX и originY - они неточно названы. Значения, возвращаемые в originX и originY, на самом деле являются advanceX и advanceY. Эти значения дают вам позиции следующего символа относительно текущего.

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

// Generate image.
   $cmd = 'convert -size ' . $localX . 'x' . $maxY . ' xc:none -gravity Center -font ' . $font . ' -pointsize ' . $fontSize . ' -annotate +0+0 "' . $yourText . '" ' . FINAL/PATH/TO/YOUR/FILE.png';
   $r = shell_exec($cmd);