Что такое код imagettfbbox

imagettfbbox

(PHP 4, PHP 5, PHP 7)

imagettfbbox — Получение параметров рамки обрамляющей текст написанный TrueType шрифтом

Описание

Эта функция рассчитывает и возвращает параметры рамки вокруг TrueType текста в пикселах.

Список параметров

Замечание: В GD 1 измеряется в пикселах. В GD 2 измеряется в точках.

Угол в градусах в котором будет измерен text .

Путь к шрифту TrueType, который вы хотите использовать.

В зависимости от того, какая библиотека GD используется в PHP, если fontfile не начинается с символа /, то к имени файла будет добавлено .ttf и библиотека будет пытаться искать это имя файла по определенному библиотекой пути шрифтов.

При использовании библиотеки GD версии ниже 2.0.18, в качестве разделителя путей для разных файлов шрифтов используется пробел, а не точка с запятой. Непреднамеренное использование этой особенности приведет к предупреждению: Warning: Could not find/open font. Единственным корректным решением для этих версий библиотек будет перемещение файлов шрифтов в директорию не содержащую пробелов.

Во многих случаях, когда шрифт находится в том же каталоге, что и скрипт PHP, поможет следующий трюк.

// Установка переменной окружения для GD
putenv ( ‘GDFONTPATH=’ . realpath ( ‘.’ ));

// Имя шрифта для использования (обратите внимание, что расширение .ttf не указывается)
$font = ‘SomeFont’ ;
?>

Обратите внимание, что open_basedir не применяется к fontfile .

Возвращаемые значения

imagettfbbox() возвращает массив из 8 элементов представляющих координаты четырех точек — вершин рамки вокруг текста. В случае ошибки функция вернет FALSE .

ключ содержимое
нижний левый угол, X координата
1 нижний левый угол, Y координата
2 нижний правый угол, X координата
3 нижний правый угол, Y координата
4 верхний правый угол, X координата
5 верхний правый угол, Y координата
6 верхний левый угол, X координата
7 верхний левый угол, Y координата

Точки рассчитаны относительно текста text и независимо от угла angle . То есть «верхний левый» означает верхний левый угол, если смотреть на текст горизонтально.

Примеры

Пример #1 Пример использования imagettfbbox()

// создание изображения 300×150
$im = imagecreatetruecolor ( 300 , 150 );
$black = imagecolorallocate ( $im , 0 , 0 , 0 );
$white = imagecolorallocate ( $im , 255 , 255 , 255 );

// Белый фон
imagefilledrectangle ( $im , 0 , 0 , 299 , 299 , $white );

// Путь к файлу шрифта
$font = ‘./arial.ttf’ ;

// создаем рамку для текста
$bbox = imagettfbbox ( 10 , 45 , $font , ‘Powered by PHP ‘ . phpversion ());

// наши координаты X и Y
$x = $bbox [ 0 ] + ( imagesx ( $im ) / 2 ) — ( $bbox [ 4 ] / 2 ) — 25 ;
$y = $bbox [ 1 ] + ( imagesy ( $im ) / 2 ) — ( $bbox [ 5 ] / 2 ) — 5 ;

// Пишем текст
imagettftext ( $im , 10 , 45 , $x , $y , $black , $font , ‘Powered by PHP ‘ . phpversion ());

// создаем другую рамку для другого текста
$bbox = imagettfbbox ( 10 , 45 , $font , ‘and Zend Engine ‘ . zend_version ());

// задаем координаты так, чтобы текст шел сразу за первой надписью
$x = $bbox [ 0 ] + ( imagesx ( $im ) / 2 ) — ( $bbox [ 4 ] / 2 ) + 10 ;
$y = $bbox [ 1 ] + ( imagesy ( $im ) / 2 ) — ( $bbox [ 5 ] / 2 ) — 5 ;

// Пишем вторую надпись
imagettftext ( $im , 10 , 45 , $x , $y , $black , $font , ‘and Zend Engine ‘ . zend_version ());

// Вывод в броузер
header ( ‘Content-Type: image/png’ );

imagepng ( $im );
imagedestroy ( $im );
?>

Примечания

Замечание: Эта функция доступна только в случае, если PHP был скомплирован с поддержкой freetype ( —with-freetype-dir=DIR )

Смотрите также

  • imagettftext() — Рисование текста на изображении шрифтом TrueType
  • imageftbbox() — Определение границ текста выводимого шрифтом freetype2

imagettfbbox

(PHP 4, PHP 5, PHP 7)

imagettfbbox — Получение параметров рамки обрамляющей текст написанный TrueType шрифтом

Описание

Эта функция рассчитывает и возвращает параметры рамки вокруг TrueType текста в пикселах.

Список параметров

Замечание: В GD 1 измеряется в пикселах. В GD 2 измеряется в точках.

Угол в градусах в котором будет измерен text .

Имя файла TrueType шрифта (может быть URL). В зависимости от версии GD библиотеки функция может попытаться найти файл без ‘/’ в начале путем добавления ‘.ttf’ в конец имени файла. Поиск при этом будет производиться в директории, заданной в конфигурации библиотеки.

Возвращаемые значения

imagettfbbox() возвращает массив из 8 элементов представляющих координаты четырех точек — вершин рамки вокруг текста. В случае ошибки функция вернет FALSE .

ключ содержимое
нижний левый угол, X координата
1 нижний левый угол, Y координата
2 нижний правый угол, X координата
3 нижний правый угол, Y координата
4 верхний правый угол, X координата
5 верхний правый угол, Y координата
6 верхний левый угол, X координата
7 верхний левый угол, Y координата

Точки рассчитаны относительно текста text и независимо от угла angle . То есть «верхний левый» означает верхний левый угол, если смотреть на текст горизонтально.

Примеры

Пример #1 Пример использования imagettfbbox()

// создание изображения 300×150
$im = imagecreatetruecolor ( 300 , 150 );
$black = imagecolorallocate ( $im , 0 , 0 , 0 );
$white = imagecolorallocate ( $im , 255 , 255 , 255 );

// Белый фон
imagefilledrectangle ( $im , 0 , 0 , 299 , 299 , $white );

// Путь к файлу шрифта
$font = ‘./arial.ttf’ ;

// создаем рамку для текста
$bbox = imagettfbbox ( 10 , 45 , $font , ‘Powered by PHP ‘ . phpversion ());

// наши координаты X и Y
$x = $bbox [ 0 ] + ( imagesx ( $im ) / 2 ) — ( $bbox [ 4 ] / 2 ) — 25 ;
$y = $bbox [ 1 ] + ( imagesy ( $im ) / 2 ) — ( $bbox [ 5 ] / 2 ) — 5 ;

// Пишем текст
imagettftext ( $im , 10 , 45 , $x , $y , $black , $font , ‘Powered by PHP ‘ . phpversion ());

// создаем другую рамку для другого текста
$bbox = imagettfbbox ( 10 , 45 , $font , ‘and Zend Engine ‘ . zend_version ());

// задаем координаты так, чтобы текст шел сразу за первой надписью
$x = $bbox [ 0 ] + ( imagesx ( $im ) / 2 ) — ( $bbox [ 4 ] / 2 ) + 10 ;
$y = $bbox [ 1 ] + ( imagesy ( $im ) / 2 ) — ( $bbox [ 5 ] / 2 ) — 5 ;

// Пишем вторую надпись
imagettftext ( $im , 10 , 45 , $x , $y , $black , $font , ‘and Zend Engine ‘ . zend_version ());

// Вывод в броузер
header ( ‘Content-Type: image/png’ );

imagepng ( $im );
imagedestroy ( $im );
?>

Примечания

Для работы функции необходимо наличие библиотек GD и » FreeType.

Смотрите также

  • imagettftext() — Рисование текста на изображении шрифтом TrueType

Как работает «imagettfbbox ()» в PHP?

Не могли бы вы объяснить, что именно означает значение возврата imagettfbbox() ? В руководстве указано:

imagettfbbox() возвращает массив с 8 элементами, представляющими четыре точки, которые делают ограничивающий прямоугольник текста успешным, а FALSE — ошибка. [. Таблица пунктов здесь. ] Точки относятся к тексту независимо от угла, поэтому «верхний left» означает, что в верхнем левом углу отображается текст по горизонтали.

Но я нашел это не очень ясным. Например, возвращаемое значение:

Как получить точное положение с imagettfbbox?

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

Что я получаю от этого

Расчетная ширина и высота кажется правильным; однако, X / Y позиции ($ offset_x и $ offset_y) не являются.

Как я могу установить $ offset_x и $ offset_y динамически, поэтому текст подходит именно в изображении для различных шрифтов, размеров и стилей?

Вот библиотека на GitHub , чтобы помочь вам подходят текст точно

Используйте массив измерения, как это:

Для того, чтобы ответить на мой собственный вопрос. Это долгое время PHP ошибка. См https://bugs.php.net/bug.php? >

Для того, чтобы получить свою вещи работы, я использовал идею из комментария на адрес php.net http://php.net/manual/de/function.imagettfbbox.php#97357

Идея заключается в том, чтобы нарисовать текст на гораздо больший холст и itterate над каждым пикселем, чтобы найти точные позиции с каждой стороны (сверху, справа, снизу, слева). Это довольно медленно, особенно на больших изображений, но это работает для меня.

Если у кого есть еще одна идея, которая быстрее и более изящным мне очень интересно читать.

Что такое код imagettfbbox

(PHP 3>= 3.0.1, PHP 4 , PHP 5)

imagettfbbox — Give the bounding box of a text using TrueType fonts

Description array imagettfbbox ( float size, float angle, string fontfile, string text )

This function calculates and returns the bounding box in pixels for a TrueType text.

The string to be measured.

The font size in pixels.

The name of the TrueType font file (can be a URL). Depending on which version of the GD library that PHP is using, it may attempt to search for files that do not begin with a leading ‘/’ by appending ‘.ttf’ to the filename and searching along a library-defined font path.

Angle in degrees in which text will be measured.

This function requires both the GD library and the FreeType library.

Here is a function that wordwraps text you want to print, allows to specify where the text should be printed, what the maximum width should be, and returns the height used.

function printWordWrapped (& $image , $top , $left , $maxWidth , $font , $color , $text , $textSize ) <
$words = explode ( ‘ ‘ , strip_tags ( $text )); // split the text into an array of single words
$line = » ;
while ( count ( $words ) > 0 ) <
$dimensions = imagettfbbox ( $textSize , 0 , $font , $line . ‘ ‘ . $words [ 0 ]);
$lineWidth = $dimensions [ 2 ] — $dimensions [ 0 ]; // get the length of this line, if the word is to be included
if ( $lineWidth > $maxWidth ) < // if this makes the text wider that anticipated
$lines [] = $line ; // add the line to the others
$line = » ; // empty it (the word will be added outside the loop)
>
$line .= ‘ ‘ . $words [ 0 ]; // add the word to the current sentence
$words = array_slice ( $words , 1 ); // remove the word from the array
>
if ( $line != » ) < $lines [] = $line ; >// add the last line to the others, if it isn’t empty
$lineHeight = $dimensions [ 1 ] — $dimensions [ 7 ]; // the height of a single line
$height = count ( $lines ) * $lineHeight ; // the height of all the lines total
// do the actual printing
$i = 0 ;
foreach ( $lines as $line ) <
imagettftext ( $image , $textSize , 0 , $left , $top + $lineHeight * $i , $color , $font , $line );
$i ++;
>
return $height ;
>

Here is a function that lets you write a string with your own «font tracking» level (the amount of pixels separating each character). It uses imagettfbbox to determine the w >
function ImageTTFTextWithTracking ( $im , $size , $angle , $t , $x , $y , $color , $font , $text ) <
$numchar = strlen ( $text );
for( $i = 0 ; $i $numchar ; $i ++) <
# Assign character
$char [ $i ] = substr ( $text , $i , 1 );

# Write character
imagettftext ( $im , $size , $angle , ( $x + $w + ( $i * $t )), $y , $color , $font , $char [ $i ]);

# Get width of character
$width = imagettfbbox ( $size , $angle , $font , $char [ $i ]);
$w = $w + $width [ 2 ];
>
>
?>

Be aware that it currently does not work for angles other than the 0 default (I have no need for that).

Here a little code snippet to align the text to horizontally center:

= imagecreatefromgif ( «test.gif» );
$text = «TEST» ;
$font = «arial.ttf» ;

//choose textcolor (black)
$col = ImageColorAllocate ( $insert , 0 , 0 , 0 );

//check width of the text
$bbox = imagettfbbox ( 12 , 0 , $font , $text );
$xcorr = 0 — $bbox [ 6 ];
$mase = $bbox [ 2 ]+ $xcorr ;

//check width of the image
$width = imagesx ( $insert );

//calculate x coordinates for text
$new =( $width — $mase )/ 2 ;

//write text
imagettftext ( $insert , 12 , 0 , $new , 50 , $col , $font , $text );

//output picture
imagegif ( $insert , «» , 100 );

Here is a function which moves the center of text’s bounding
box to a given pivot point (px,py) and rotates text about
that point.
= 500 ;
$height = 400 ;
$fontpath = ‘c:/windows/fonts/arial.ttf’ ;
$text = ‘Finally, I have a roated text box’ ;
$fontsize = 20 ;
$angle = 30.0 ;
// create an image and fill the background with lightgray
$image = imagecreatetruecolor ( $width , $height );
imagefill ( $image , 0 , 0 , 0xDDDDDD );
// bounding box
$bbox = imagettfbbox ( $fontsize , 0 , $fontpath , $text );
// baseline point for drawing non-rotated text.
$x0 = $bbox [ 6 ];
$y0 =- $bbox [ 7 ];
// fixes bounding box w.r.t. image coordinate.
$bbox [ 5 ]=- $bbox [ 5 ]+ $bbox [ 1 ];
$bbox [ 7 ]=- $bbox [ 7 ]+ $bbox [ 3 ];
$bbox [ 1 ]= 0 ;
$bbox [ 3 ]= 0 ;
// get the size of image.
$sx = imagesx ( $image );
$sy = imagesy ( $image );
// center of bounding box (xc,yc);
$xc =( $bbox [ 0 ]+ $bbox [ 2 ])/ 2.0 ;
$yc =( $bbox [ 1 ]+ $bbox [ 7 ])/ 2.0 ;
// rotation angle in radian
$rad = $angle * pi ()/ 180.0 ;
$sa = sin ( $rad );
$ca = cos ( $rad );
$x1 = $x0 — $xc ;
$y1 = $y0 — $yc ;
//pivot point(here, we take the center of image)
$px = $sx / 2.0 ;
$py = $sy / 2.0 ;
// new baseline point for rotated text.
$x2 = intval ( $x1 * $ca + $y1 * $sa + $px + 0.5 );
$y2 = intval (- $x1 * $sa + $y1 * $ca + $py + 0.5 );

imagettftext ( $image , $fontsize , $angle , $x2 , $y2 , 0xFF , $fontpath , $text );
// draw rotated bounding box;
rotbbox ( $bbox , $angle , $px , $py );
for( $i = 0 ; $i 4 ; $i ++) <
$x0 = $bbox [ 2 * $i + 0 ];
$y0 = $bbox [ 2 * $i + 1 ];
$j = $i + 1 ;
if( $j == 4 ) $j = 0 ;
$x1 = $bbox [ 2 * $j + 0 ];
$y1 = $bbox [ 2 * $j + 1 ];
imageline ( $image , $x0 , $y0 , $x1 , $y1 , 0xFF0000 );
>
// Show the image
imagepng ( $image );

function rotbbox (& $bbox , $angle , $px , $py ) <
$xc =( $bbox [ 0 ]+ $bbox [ 2 ])/ 2.0 ;
$yc =( $bbox [ 1 ]+ $bbox [ 7 ])/ 2.0 ;
$rad = $angle * pi ()/ 180.0 ;
$sa = sin ( $rad );
$ca = cos ( $rad );
for ( $i = 0 ; $i 4 ; $i ++) <
$x = $bbox [ $i * 2 + 0 ]- $xc ;
$y = $bbox [ $i * 2 + 1 ]- $yc ;
$bbox [ $i * 2 + 0 ]= intval ( $ca * $x + $sa * $y + $px + 0.5 );
$bbox [ $i * 2 + 1 ]= intval (- $sa * $x + $ca * $y + $py + 0.5 );
>
>
?>

I took Magicaltux’s word wrap procedure and modified it in two ways. I changed the order of processing so that the string plotting function is called only once for each word instead of for every character. And I wrote the results to a string scalar instead of a string array, with embedded breaks
at line ends. It should run pretty fast. Mine breaks only on spaces, but hyphens could easily be added.

I’m new to PHP so I apologize for my idiosyncratic formatting conventions.
function myWordWrap ( $txt , $font , $size , $width )
<
/*
word-wrapper. gets bounding box sizes for each word in a string, then
strings words together up to desired width. calls strpos and
imagettfbbox only once per word — so very fast.
this version reconcatenates the words with a
character where
the line break should be.
*/
$txt .= » » ; // guaranteed to find end of line
$spaces =array();
$wids =array();
$i = 0 ;
while( true )
<
$j = strpos ( substr ( $txt , $i ), » » );
if(!( $j === false ))
<
$spaces []= $j + $i ;
$bbox = imagettfbbox ( $size , 0 , $font , substr ( $txt , $i , $j + 1 ));
$left =( $bbox [ 0 ]> $bbox [ 6 ])? $bbox [ 6 ]: $bbox [ 0 ];
$right =( $bbox [ 2 ]> $bbox [ 4 ])? $bbox [ 2 ]: $bbox [ 4 ];
$wids []= $right — $left ;
$i = $j + $i + 1 ;
>
else break;
>
$lastspace =- 1 ;
$cum = 0 ;
$t2 = «» ;
for( $i = 0 ; $i count ( $spaces ); $i ++)
<
if((( $cum > 0 )&&( $cum + $wids [ $i ])> $width )) // time for a line break
<
$t2 .= «
» ;
$cum = 0 ;
$i —;
>
else
<
// we’ll always get at least one word (even if too wide) thanks to
// ($cum>0) test above
$t2 .= substr ( $txt , $lastspace + 1 , $spaces [ $i ]- $lastspace );
$cum += $wids [ $i ];
$lastspace = $spaces [ $i ];
>
>
return $t2 ;
>
?>

the oliver dot martin at onemail dot fixbbox function is just lacking a small thing:
the coordonates for top and left have to be the opposite, because the imagettftext x and y coordonates are calculated from the top left of the image and set the bottom left of the first character.

The correct function is:
function fixbbox($bbox)
<
$tmp_bbox[«left»] = min($bbox[0],$bbox[2],$bbox[4],$bbox[6]);
$tmp_bbox[«top»] = min($bbox[1],$bbox[3],$bbox[5],$bbox[7]);
$tmp_bbox[«w > min($bbox[0],$bbox[2],$bbox[4],$bbox[6]) + 1;
$tmp_bbox[«height»] = max($bbox[1],$bbox[3],$bbox[5],$bbox[7]) — min($bbox[1],$bbox[3],$bbox[5],$bbox[7]);

$tmp_bbox[«left»] = 0 — $tmp_bbox[«left»];
$tmp_bbox[«top»] = 0 — $tmp_bbox[«top»];
return $tmp_bbox;
>

And it works for any rotated text.

As «oliver dot martin at onemail dot at» noted above, imagettfbbox() does not work correctly in php 4.3.4. To remedy this, I’ve written a short function that uses trig to calculate the bounding box from rotating a non-rotated piece of text.

Hopefully, this comment will be obsolete soon, but for now, .

function imagettfbbox_t($size, $angle, $fontfile, $text)
<
// compute size with a zero angle
$coords = imagettfbbox($size, 0, $fontfile, $text);

// convert angle to radians
$a = $angle * M_PI / 180;

// compute some usefull values
$ca = cos($a);
$sa = sin($a);
$ret = array();

// perform transformations
for($i = 0; $i

Finally managed to make a fixed version of imagettfbbox().
All angles returns correct values.
Except that imagettftext() returns different trackings (space between each character) when rotating.

// Set some test variables
$font = «d://www//tahoma.ttf» ;
$text = «Finally, I can center rotated text!» ;
$size = 20 ;
$angle = 20 ;

// Create an image and fill the background with lightgray
$image = imagecreatetruecolor ( 500 , 400 );
imagefill ( $image , 0 , 0 , hexdec ( «dddddd» ));

// Make a cross to make it easier to analyze
imageline ( $image , 0 , 0 , imagesx ( $image ), imagesy ( $image ), hexdec ( «000000» ));
imageline ( $image , imagesx ( $image ), 0 , 0 , imagesy ( $image ), hexdec ( «000000» ));

// Run a fixed version of imagettfbbox()
$bbox = imagettfbbox_fixed ( $size , $angle , $font , $text );

// Make some text and center the text on the image.
// imagettftext() pivot is on lower left
imagettftext ( $image , $size , $angle , imagesx ( $image ) / 2 — $bbox [ ‘width’ ] / 2 , imagesy ( $image ) / 2 + $bbox [ ‘height’ ] / 2 , hexdec ( «0000ff» ), $font , $text );

// Show the image
imagepng ( $image );

function imagettfbbox_fixed ( $size , $angle , $font , $text )
<
// Get the boundingbox from imagettfbbox(), which is correct when angle is 0
$bbox = imagettfbbox ( $size , 0 , $font , $text );

// Rotate the boundingbox
$angle = pi () * 2 — $angle * pi () * 2 / 360 ;
for ( $i = 0 ; $i 4 ; $i ++)
<
$x = $bbox [ $i * 2 ];
$y = $bbox [ $i * 2 + 1 ];
$bbox [ $i * 2 ] = cos ( $angle ) * $x — sin ( $angle ) * $y ;
$bbox [ $i * 2 + 1 ] = sin ( $angle ) * $x + cos ( $angle ) * $y ;
>

// Variables which tells the correct width and height
$bbox [ ‘width’ ] = $bbox [ 0 ] + $bbox [ 4 ];
$bbox [ ‘height’ ] = $bbox [ 1 ] — $bbox [ 5 ];

doesn’t work when the text is rotated, as it assumes that the upper left corner of the text is also the upper left corner of the bounding box. Same goes for the lower right corner. Here is my corrected version of it:

function fixbbox ( $bbox )
<
$tmp_bbox [ «left» ] = min ( $bbox [ 0 ], $bbox [ 2 ], $bbox [ 4 ], $bbox [ 6 ]);
$tmp_bbox [ «top» ] = min ( $bbox [ 1 ], $bbox [ 3 ], $bbox [ 5 ], $bbox [ 7 ]);
$tmp_bbox [ «width» ] = max ( $bbox [ 0 ], $bbox [ 2 ], $bbox [ 4 ], $bbox [ 6 ]) — min ( $bbox [ 0 ], $bbox [ 2 ], $bbox [ 4 ], $bbox [ 6 ]);
$tmp_bbox [ «height» ] = max ( $bbox [ 1 ], $bbox [ 3 ], $bbox [ 5 ], $bbox [ 7 ]) — min ( $bbox [ 1 ], $bbox [ 3 ], $bbox [ 5 ], $bbox [ 7 ]);

return $tmp_bbox ;
>
?>

However, be aware that this might not be very useful, as gd-2.0.8 introduces a bug which renders the results of imagettfbbox() useless when the text is rotated. This is still not fixed in the the php-4.3.4 bundled version (2.0.15 compatible).

One use of this function is to do some WordWrap =p

I wrote a little function to make a basic wordwrap : it returns an array with each line in a row.

You just have to display each row on a different line (calling many times imagettftext) to get a good result.
The character ^ is assumed as a linebreak.

function im_wordwrap ( $txt , $font , $size , $width ) <
$sep =array( ‘ ‘ , ‘-‘ ); // separators
$res =array();
$buf = » ;
// main function loop
for( $i = 0 ; $i strlen ( $txt ); $i ++) <
$l = $txt < $i >;
if ( $l == ‘^’ ) <
$res []= $buf ;
$buf = » ;
continue;
>
$t = $buf . $l ;
$bbox = imagettfbbox ( $size , 0 , $font , $t );
$left =( $bbox [ 0 ]> $bbox [ 6 ])? $bbox [ 6 ]: $bbox [ 0 ]; // determine most far points
$right =( $bbox [ 2 ]> $bbox [ 4 ])? $bbox [ 2 ]: $bbox [ 4 ]; // idem
$w = $right — $left ; // get total width
if ( $w > $width ) <
if ( $buf == » ) return false ; // FATAL: 1 letter is smallest than the pixel width — avoid infinite loop
// we can assume that everything present in $buf currently is inside our limits
// find a separator in string
$fp = false ;
foreach( $sep as $s ) <
$p = strrpos ( $buf , $s );
if (( $p !== false ) and ( $p > $fp )) $fp = $p ;
>
if ( $fp === false ) <
// let’s break here !
$res []= $buf ;
$buf = » ;
$i —; // dececrase $i to retry this letter
continue;
>
// $fp+1 -> we put the separator char at the end of the prev. line =p
$res []= substr ( $buf , 0 , $fp + 1 );
$buf = substr ( $buf , $fp + 1 );
$i —;
continue;
>
$buf .= $l ;
>
if ( $buf != » ) $res []= $buf ;
return $res ;
>
?>

The array this function returns is very strange, at least, i think so. So i created this function that ‘fixes’ the bounding box array into some human-understandable format

function fixbbox ( $bbox )
<
$xcorr = 0 — $bbox [ 6 ]; //northwest X
$ycorr = 0 — $bbox [ 7 ]; //northwest Y
$tmp_bbox [ ‘left’ ]= $bbox [ 6 ]+ $xcorr ;
$tmp_bbox [ ‘top’ ]= $bbox [ 7 ]+ $ycorr ;
$tmp_bbox [ ‘width’ ]= $bbox [ 2 ]+ $xcorr ;
$tmp_bbox [ ‘height’ ]= $bbox [ 3 ]+ $ycorr ;

imagettfbbox

Рекомендованные сообщения

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Войти

Уже зарегистрированы? Войдите здесь.

Статистика пользователей

Сейчас на странице 0 пользователей

Нет пользователей, просматривающих эту страницу.

Спрашивают сейчас

Автор: Наталья12
Создана Понедельник в 18:35

Автор: HIO
Создана 20 часов назад

Автор: npofopr
Создана 18 октября

Пишут сейчас

в
$(«.city_name»).click(function() <
у вас происходит
$(«.active .city_list__info .toggle—open»).on(«click», function(e)
т.е. при втором нажатии на элементы вешается еще раз click и их становится 2
если нажать 3 раза, то будет 3 карты

вариант вытащить
$(«.active .city_list__info .toggle—open»).on(«click», function(e)
из
$(«.city_name»).click(function() <

Как получить точную позицию с imagettfbbox? — php

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

Из этого я получаю

Расчетная ширина и высота кажутся правильными; однако позиции X/Y ($ offset_x и $ offset_y) — нет.

Как я могу установить $ offset_x и $ offset_y динамически, чтобы текст точно соответствовал изображению для разных шрифтов, размеров и стилей?

    1 2
  • 14 сен 2020 2020-09-14 13:50:41
  • kirschkern

2 ответа

Здесь библиотека на github, чтобы помочь вам точно подогнать текст

Используйте массив мер так:

  • 14 сен 2020 2020-09-14 13:50:42
  • UnLoCo

Чтобы ответить на мой вопрос. Это длинная ошибка PHP. См. Https://bugs.php.net/bug.php? >

Чтобы заставить мои вещи работать, я использовал идею из комментария на php.net http://php.net/manual/de/function.imagettfbbox.php#97357

Идея состоит в том, чтобы нарисовать текст на гораздо большем холсте и повторить по каждому пикселю, чтобы найти точные позиции с каждой стороны (сверху, вправо, снизу, слева). Это довольно медленно, особенно на больших изображениях, но это работает для меня.

Если у кого-то есть другая идея, которая быстрее или элегантнее, мне очень интересно ее прочитать.

Что такое код imagettfbbox

(PHP 3>= 3.0.1, PHP 4 )

imagettfbbox — Give the bounding box of a text using TrueType fonts

Description array imagettfbbox ( int size, int angle, string fontfile, string text)

This function calculates and returns the bounding box in pixels for a TrueType text.

The string to be measured.

The font size in pixels.

The name of the TrueType font file. (Can also be an URL.) Depending on which version of the GD library that PHP is using, it may attempt to search for files that do not begin with a leading ‘/’ by appending ‘.ttf’ to the filename and searching along a library-defined font path.

Angle in degrees in which text will be measured.

lower left corner, X position
1 lower left corner, Y position
2 lower right corner, X position
3 lower right corner, Y position
4 upper right corner, X position
5 upper right corner, Y position
6 upper left corner, X position
7 upper left corner, Y position

This function requires both the GD library and the FreeType library.

I got my script so far but i been trying to add positioning text so i can put it anywhere on the business card.

( E_ALL );
$fields = array(array( ‘Company Name: ‘ , ‘company’ , 20 , array( 0 , 0 , 0 )), array( ‘Company Message: ‘ , ‘message’ , 17 , array( 64 , 128 , 208 )), array( ‘Full Name: ‘ , ‘name’ , 20 , array( 255 , 255 , 255 )), array( ‘Job Title: ‘ , ‘title’ , 16 , array( 255 , 255 , 255 )), array( ‘Address Line 1: ‘ , ‘line1’ , 17 , array( 255 , 255 , 255 )), array( ‘Address Line 2: ‘ , ‘line2’ , 17 , array( 255 , 255 , 255 )), array( ‘Address Line 3: ‘ , ‘line3’ , 17 , array( 255 , 255 , 255 )), array( ‘Phone / Other: ‘ , ‘phone’ , 17 , array( 255 , 255 , 255 )), array( ‘Fax / Other: ‘ , ‘fax’ , 17 , array( 255 , 255 , 255 )), array( ‘E-mail / Other: ‘ , ’email’ , 17 , array( 255 , 255 , 255 )), array( ‘Web / Other: ‘ , ‘web’ , 17 , array( 255 , 255 , 255 )));
function input ( $text , $name )
<
echo $text , ‘ , $name , ‘» value=»‘ ;
if(isset( $_SESSION [ $name ]))
echo $_SESSION [ $name ];
echo ‘» />’ , «\n» ;
>
function drawstring ( $string , $diff , & $y , $font , $size , $color , $align = ‘right’ )
<
global $image ;
if( is_int ( $font ))
<
$x = $diff ;
for( $i = 1 ; $i strlen ( $string ); ++ $i )
<
imagechar ( $image , $font , $x , $y , $string < $i >, $color );
$x += imagefontwidth ( $font );
>
$y += imagefontheight ( $font );
>
else
<
$arr = imagettfbbox ( $size , 0 , $font , $string ); //left //////////////////////////////////
$width = $arr [ 2 ] — $arr [ 0 ];
switch( $align )
<
case ‘right’ :
$x = imagesx ( $image ) — $width — $diff ;
break;
case ‘center’ :
$x = imagesx ( $image ) / 2 — ( $width / 2 );
break;
case ‘left’ :
default:
$x = $diff ;
break;
>
imagettftext ( $image , $size , 0 , $x , $y + ( $arr [ 1 ] — $arr [ 7 ]), $color , $font , $string );
$y += $arr [ 1 ] — $arr [ 7 ] + 1 ;
>
>
session_start ();
if(isset( $_GET [ ‘image’ ]))
<
$colors = array();
$image = imagecreatetruecolor ( 510 , 295 );
$white = imagecolorallocate ( $image , 255 , 255 , 255 );
$im = imagecreatefrompng ( ‘backgrounds/’ . $_SESSION [ ‘img’ ] . ‘.png’ );
imagecopy ( $image , $im , 0 , 0 , 0 , 0 , 510 , 295 );
$y = 90 ; //Top

Here is (another) approach for displaying a text in any angle
inscribed in its own bounding box:

= dirname ( $_SERVER [ ‘DOCUMENT_ROOT’ ].
$_SERVER [ ‘SCRIPT_NAME’ ]). «/arial.ttf» ;
$ang = ( $_GET [ ‘angle’ ]? $_GET [ ‘angle’ ]: 0 ) % 360 ;
$txt = ‘This is a test’ ;

$dim = imagettfbbox ( 10 , $ang , $font , $txt );
$min_x = min ( $dim [ 0 ], $dim [ 2 ], $dim [ 4 ], $dim [ 6 ]);
$max_x = max ( $dim [ 0 ], $dim [ 2 ], $dim [ 4 ], $dim [ 6 ]);
$width = $max_x — $min_x + 1 ;
$min_y = min ( $dim [ 1 ], $dim [ 3 ], $dim [ 5 ], $dim [ 7 ]);
$max_y = max ( $dim [ 1 ], $dim [ 3 ], $dim [ 5 ], $dim [ 7 ]);
$height = $max_y — $min_y + 1 ;

$img = imagecreate ( $width + 1 , $height + 1 );
$bgcolor = imagecolorallocate ( $img , 0 , 0 , 0 );
$txtcolor = imagecolorallocate ( $img , 255 , 255 , 255 );
imagettftext ( $img , 10 , $ang , — $min_x + $dim [ 0 ],
— $min_y + $dim [ 1 ], $txtcolor , $font , $txt );

header ( «Content-type: image/png» );
header ( «Content-disposition: inline; filename=text.png» );
imagepng ( $img );
imagedestroy ( $img );
?>

If you call this script puttext.php, then would be nice to test
any angle using the following script:

for( $j = 0 ; $j 8 ; $j ++) <
for( $i = 0 ; $i 45 ; $i += 5 ) <
echo ‘ .( $j * 45 + $i ). ‘»>’ ;
>
echo ‘
‘ ;
>
?>

You’ll notice in some angles the box isn’t big enough to fit the
whole text. May be using floats for calculations would help, or
evaluating in different ways the the angle steps 0-89,
90-179, 180-269 and 270-359. This problem occurs when
displaying lower-baseline chars (y,g,j,p,q).

This handy function will split a string into an array of strings that fit a given line width for imagettftext, splitting at spaces. The parameters are the text string itself, the font size, the font file and the desired max width in pixels.

function text_to_lines($text, $size, $font, $width)
<
$ex = explode(» «, $text);
$ex_c = count($ex);
$p = 0;

I noticed that PHP’s True Type functions do not allow you to create text blocks with multiple lines that automatically adjust for alignment. I wrote a function that will allow you to generate images with multiple lines, control the alignment, and handle rotation. I hope it helps someone.

There was too much code to paste on this message post so you can grab it off of my webserver. I also created an example page so that you can see the code in action.

It took me a while to figure out what was going on with the bounding box. The hardest part is basically getting the width and height for your entire string rendered in a given font:

$w > 0 && $bbox[2] > 0) || ($bbox[0] 0 && $bbox[5] > 0) || ($bbox[1]

90?angle bug fix.

$box = ImageTTFBBox($font_size, $angle, $font, $text);
if($angle==90) <
$temp=$box;
$box[0]=$temp[6];
$box[1]=$temp[7];
$box[2]=$temp[0];
$box[3]=$temp[1];
$box[4]=$temp[2];
$box[5]=$temp[3];
$box[6]=$temp[4];
$box[7]=$temp[5];
unset($temp);
>

If you want to get more accurate value for lower and upper right corner, X position, edit gdft.c from gd.
1. find «pen.x += delta.x;»
2. add «penf.x += delta.x;» to next line
3. compile.

I centered text on image $im like so:

$box = imagettfbbox ( 12, 0, $font, $string);

$tw=$box[2]-$box[0]; //image width

$th=$box[5]-$box[3]; //image height

// x position
$px = (imagesx($im) -$tw)/2;

//y position
$py = (imagesy($im) -$th)/2;

ImageTTFText ($im, 12, 0, $px, $py, $fontcolor,$font,$string);

not a solution for ‘g’ and ‘y’ etc but okay.

I have the alignment code done:
$align can be ‘center’, ‘left’, or ‘right’.
$valign can be ‘center’, ‘top’, or ‘bottom’.

It sets $x and $y which can be used in ImageTTFText() to place the text with the alignment specified.

$box = ImageTTFBBox($font_size, 0, $font, $text);

if ($align == ‘left’)
<
$x = min($box[0], $box[6]);
>
elseif ($align == ‘center’)
<
$x_left = min($box[0], $box[6]);
$x_right = max($box[2], $box[4]);
$x_w > $x = ceil(($width — $x_width) / 2);
>
elseif ($align == ‘right’)
<
$x_left = min($box[0], $box[6]);
$x_right = max($box[2], $box[4]);
$x_w > $x = ceil($width — $x_right);
>

if ($valign == ‘top’)
<
$y_top = max($box[5], $box[7]);
$y_bottom = min($box[3], $box[1]);
$y_height = $y_bottom — $y_top;
$y = 0 + $y_height;
>
elseif ($valign == ‘center’)
<
$y_top = max($box[5], $box[7]);
$y_bottom = min($box[3], $box[1]);
$y_height = $y_top — $y_bottom;
$y = floor(($height — $y_height) / 2);
>
elseif ($valign == ‘bottom’)
<
$y = $height;
>

I don’t understand why all the commenters above seem to be having so much trouble with this truetype bounding box thing. Here’s my solution. The color code was borrowed from others, and things get a little more complicated if you want to overlay on another image, but here’s probably everything you’ll need for just getting a proper label (with baselines, angles, and other whatnot) from a bit of text, assuming I copied and pasted right:

// local setting
$fontbase = «whatever/fonts/» ;
// image.php
// by Kenneth Arnold

// written because none of the other examples on the PHP manual page work absolutely
// right all the time. Based on some of those examples that didn’t work.

//vars
$fontfile = «$fontbase/timesnr.ttf» ; // you may want to have this user-definable.

if (! $angle ) $angle = 0 ;
$size = ImageTTFBBox ( $fontsize , $angle , $fontfile , $text );
$dx = max ( $size [ 2 ], $size [ 4 ]) — min ( $size [ 0 ], $size [ 6 ]); // extreme x values
$dy = max ( $size [ 1 ], $size [ 3 ]) — min ( $size [ 5 ], $size [ 7 ]); // extreme y values

$im = imagecreate ( $dx , $dy );
$bkgc = ImageColorAllocate ( $im , 255 , 255 , 255 );
$txtc = ImageColorAllocate ( $im , 197 , 196 , 230 );
ImageTTFText ( $im , $fontsize , $angle , 0 , — min ( $size [ 5 ], $size [ 7 ]), $txtc , $fontfile , $text );
Header ( «Content-type: image/png» );
ImagePng ( $im );
ImageDestroy ( $im );
?>

Call that with «/whateveryoucalledit.php?text=sometext&fontsize=somefontsize&angle=10» (angle optional).

You can extend that, using dx and dy, to center that text in a larger image. Note that this doesn’t try to fix the antialiasing and colors «issue»; see the comments for ImageTTFText for some solutions to that.

I welcome questions and comments at the email above, appropriately sanitized.

Just an inexperienced PHP hacker trying to help,
Ken

This example will draw a label of the size of the text.
Works only with 0 as the angle.

// Draws a graphic label with centered text
// by manu AT cappelleri.net
// Call it as

Header ( «Content-type: image/png» );

//vars
$fontfile = «fonts/labelg.ttf» ;
$fontsize = 23 ;
$im_h = 23 ;

$size = ImageTTFBbox ( $fontsize , 0 , $fontfile , stripslashes ( $label ));

$im_x = $size [ 2 ];
$im = imagecreate ( $im_x + 10 , $im_h );
$bkgc = ImageColorAllocate ( $im , 255 , 255 , 255 );
$txtc = ImageColorAllocate ( $im , 197 , 196 , 230 );
ImageTTFText ( $im , $fontsize , 0 , 5 , 20 , $txtc , $fontfile , stripslashes ( $label ));
ImagePng ( $im );
ImageDestroy ( $im );

[The Definitive TTF Text Centering Code]

None of the above worked for me, so I wrote my own.

Tested on single and multiple lined text, at font sizes ranging from 10pts to 44pts. Verified in Adobe Photoshop.

$text_bbox = ImageTTFBBox($fontsize, 0, $fontpath, $text_message);
$text_pos_x = ($image_width — ($text_bbox[2] — $text_bbox[0])) / 2;
$text_pos_y = ($image_height — ($text_bbox[1] — $text_bbox[7])) / 2;
$text_pos_y -= $text_bbox[7];

center horizontally and vertically

# variables
$pic = «header_kln_blanco_top.gif» ;
$fontfile = «Arial.ttf» ;
$fontsize = «12» ;
$fontcolor = «#000000» ;
$textangle = «0» ;
$text = (isset( $text ) ? rawurldecode ( $text ) : «OhReally» ); # should be set in query_string

# create pic and fontcolor
$pic = imagecreatefromgif ( $pic );
$fontcolor = str_replace ( «#» , «» , $fontcolor );
$fontcolor = imagecolorallocate ( $pic , hexdec ( substr ( $fontcolor , 0 , 2 )), hexdec ( substr ( $fontcolor , 2 , 2 )), hexdec ( substr ( $fontcolor , 4 , 2 )));

# calculate start position
$picwidth = imagesx ( $pic );
$picheight = imagesy ( $pic );
list( $pos_blx , $pos_bly , $pos_brx , $pos_bry , $pos_trx , $pos_try , $pos_tlx , $pos_tly ) = imagettfbbox ( $fontsize , $textangle , $fontfile , $text );
$textwidth = $pos_brx — $pos_blx ;
$textheight = $pos_bly — $pos_tly ;
$start_x = ( $picwidth — $textwidth ) / 2 ;
$start_y = (( $picheight — $textheight ) / 2 ) + $textheight ;

# write text and output image
imagettftext ( $pic , $fontsize , $textangle , $start_x , $start_y , $fontcolor , $fontfile , $text );
header ( «content-type: image/gif» );
imagegif ( $pic );
imagedestroy ( $pic );
?>

and you call it like this:
echo urlencode ( $mytext ); ?> «>

imagettfbbox

imagettfbbox — Give the bounding box of a text using TrueType fonts

Описание

This function calculates and returns the bounding box in pixels for a TrueType text.

Список параметров

The font size. Depending on your version of GD, this should be specified as the pixel size (GD1) or point size (GD2).

Angle in degrees in which text will be measured.

The name of the TrueType font file (can be a URL). Depending on which version of the GD library that PHP is using, it may attempt to search for files that do not begin with a leading ‘/’ by appending ‘.ttf’ to the filename and searching along a library-defined font path.

The string to be measured.

Возвращаемые значения

imagettfbbox() returns an array with 8 elements representing four points making the bounding box of the text on success and FALSE on error.

key contents
lower left corner, X position
1 lower left corner, Y position
2 lower right corner, X position
3 lower right corner, Y position
4 upper right corner, X position
5 upper right corner, Y position
6 upper left corner, X position
7 upper left corner, Y position

The points are relative to the text regardless of the angle, so «upper left» means in the top left-hand corner seeing the text horizontally.

Примеры

Пример #1 imagettfbbox() example

// Create a 300×150 image
$im = imagecreatetruecolor ( 300 , 150 );
$black = imagecolorallocate ( $im , 0 , 0 , 0 );
$white = imagecolorallocate ( $im , 255 , 255 , 255 );

// Set the background to be white
imagefilledrectangle ( $im , 0 , 0 , 299 , 299 , $white );

// Path to our font file
$font = ‘./arial.ttf’ ;

// First we create our bounding box for the first text
$bbox = imagettfbbox ( 10 , 45 , $font , ‘Powered by PHP ‘ . phpversion ());

// This is our cordinates for X and Y
$x = $bbox [ 0 ] + ( imagesx ( $im ) / 2 ) — ( $bbox [ 4 ] / 2 ) — 25 ;
$y = $bbox [ 1 ] + ( imagesy ( $im ) / 2 ) — ( $bbox [ 5 ] / 2 ) — 5 ;

// Write it
imagettftext ( $im , 10 , 45 , $x , $y , $black , $font , ‘Powered by PHP ‘ . phpversion ());

// Create the next bounding box for the second text
$bbox = imagettfbbox ( 10 , 45 , $font , ‘and Zend Engine ‘ . zend_version ());

// Set the cordinates so its next to the first text
$x = $bbox [ 0 ] + ( imagesx ( $im ) / 2 ) — ( $bbox [ 4 ] / 2 ) + 10 ;
$y = $bbox [ 1 ] + ( imagesy ( $im ) / 2 ) — ( $bbox [ 5 ] / 2 ) — 5 ;

// Write it
imagettftext ( $im , 10 , 45 , $x , $y , $black , $font , ‘and Zend Engine ‘ . zend_version ());

// Output to browser
header ( ‘Content-type: image/png’ );

imagepng ( $im );
imagedestroy ( $im );
?>

Примечания

This function requires both the GD library and the » FreeType library.

Смотрите также

  • imagettftext() — Write text to the image using TrueType fonts

Как получить точную позицию с imagettfbbox? — php

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

Из этого я получаю

Расчетная ширина и высота кажутся правильными; однако позиции X/Y ($ offset_x и $ offset_y) — нет.

Как я могу установить $ offset_x и $ offset_y динамически, чтобы текст точно соответствовал изображению для разных шрифтов, размеров и стилей?

    2 2
  • 14 сен 2020 2020-09-14 13:50:41
  • kirschkern

2 ответа

Здесь библиотека на github, чтобы помочь вам точно подогнать текст

Используйте массив мер так:

  • 14 сен 2020 2020-09-14 13:50:42
  • UnLoCo

Чтобы ответить на мой вопрос. Это длинная ошибка PHP. См. Https://bugs.php.net/bug.php? >

Чтобы заставить мои вещи работать, я использовал идею из комментария на php.net http://php.net/manual/de/function.imagettfbbox.php#97357

Идея состоит в том, чтобы нарисовать текст на гораздо большем холсте и повторить по каждому пикселю, чтобы найти точные позиции с каждой стороны (сверху, вправо, снизу, слева). Это довольно медленно, особенно на больших изображениях, но это работает для меня.

Если у кого-то есть другая идея, которая быстрее или элегантнее, мне очень интересно ее прочитать.

Илон Маск рекомендует:  Что такое код imap_setflag_full
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL