imagefttext

(PHP 4 >= 4.0.7, PHP 5)

imagefttextWrite text to the image using fonts using FreeType 2

Description

array imagefttext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text [, array $extrainfo ] )

Parameters

image

An image resource, returned by one of the image creation functions, such as imagecreatetruecolor().

size

The font size to use in points.

angle

The angle in degrees, with 0 degrees being left-to-right reading text. Higher values represent a counter-clockwise rotation. For example, a value of 90 would result in bottom-to-top reading text.

x

The coordinates given by x and y will define the basepoint of the first character (roughly the lower-left corner of the character). This is different from the imagestring(), where x and y define the upper-left corner of the first character. For example, "top left" is 0, 0.

y

The y-ordinate. This sets the position of the fonts baseline, not the very bottom of the character.

color

The index of the desired color for the text, see imagecolorexact().

fontfile

The path to the TrueType font you wish to use.

Depending on which version of the GD library PHP is using, when fontfile does not begin with a leading / then .ttf will be appended to the filename and the library will attempt to search for that filename along a library-defined font path.

When using versions of the GD library lower than 2.0.18, a space character, rather than a semicolon, was used as the 'path separator' for different font files. Unintentional use of this feature will result in the warning message: Warning: Could not find/open font. For these affected versions, the only solution is moving the font to a path which does not contain spaces.

In many cases where a font resides in the same directory as the script using it the following trick will alleviate any include problems.

<?php
// Set the enviroment variable for GD
putenv('GDFONTPATH=' realpath('.'));

// Name the font to be used (note the lack of the .ttf extension)
$font 'SomeFont';
?>

text

Text to be inserted into image.

extrainfo

Possible array indexes for extrainfo
Key Type Meaning
linespacing float Defines drawing linespacing

Return Values

This function returns an array defining the four points of the box, starting in the lower left and moving counter-clockwise:

0 lower left x-coordinate
1 lower left y-coordinate
2 lower right x-coordinate
3 lower right y-coordinate
4 upper right x-coordinate
5 upper right y-coordinate
6 upper left x-coordinate
7 upper left y-coordinate

Examples

Example #1 imagefttext() example

<?php
// Create a 300x100 image
$im imagecreatetruecolor(300100);
$red imagecolorallocate($im0xFF0x000x00);
$black imagecolorallocate($im0x000x000x00);

// Make the background red
imagefilledrectangle($im0029999$red);

// Path to our ttf font file
$font_file './arial.ttf';

// Draw the text 'PHP Manual' using font size 13
imagefttext($im13010555$black$font_file'PHP Manual');

// Output image to the browser
header('Content-Type: image/png');

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

Notes

Note: This function requires GD 2.0.1 or later (2.0.28 or later is recommended).

Note: This function is only available if PHP is compiled with freetype support (--with-freetype-dir=DIR )

Changelog

Version Description
4.3.5 extrainfo was made optional.

Коментарии

If you're interested in turning off FreeType hinting, search for the following line in the gd source (gdft.c):
      err = FT_Load_Glyph (face, glyph_index, FT_LOAD_DEFAULT);
and replace it with
      err = FT_Load_Glyph (face, glyph_index, FT_LOAD_NO_HINTING);

Recompile GD, and vo?la: beauteous antialiasing.
2002-08-08 03:59:27
http://php5.kiev.ua/manual/ru/function.imagefttext.html
Thanks for the script!  I modified it to show several fonts that I was wanting to use.  I am using GD-2.0.7, FreeType-2.1.3(text rotation fix,among others), and PHP-4.2.3 and had to include the array information to get it to work.

Code change follows:
$fontfile="/usr/local/fonts/ttf/bookantbd.ttf";
// Waterfall of point sizes to see what Freetype 2's autohinting looks like:
//
for($i=4;$i<=12;$i++){
  ImageFtText($image,$i,0,10,(280+$i*14),$forecolor,$fontfile, bookantbd . $i . ". " . $string, array("linespacing" => 1.0));
}

John
2002-11-21 14:22:27
http://php5.kiev.ua/manual/ru/function.imagefttext.html
After spending the evening with some work on automatically generated images, I had the idea to switch of anti-aliasing (looking, if some font would look better that way), which turned out not to be quite so easy.

Actually you have to use the negative of the desired color to switch of antialising. I include the corresponding line from my code (line split up):

// USE NEGATIVE OF DESIRED COLOR TO SWITCH OF ANTI-ALIASING
ImageFTText ($neuesBild,$fontsize,$fontangle,$TextPosX,$TextPosY,
-$custom_fg,$fonttype,$text,array());
2003-09-17 17:07:04
http://php5.kiev.ua/manual/ru/function.imagefttext.html
I wrote a bit of code to gather all the .ttf files in the directory with this script, and randomize them to write text on a header image for my site. The only catch is the font files have to be named 1.ttf, 2.ttf etc etc.

<?php

srand
((double)microtime()*1234567); // Start the random gizmo
$image imagecreatefromjpeg(rand(1,exec('ls *.jpg | wc -l')) . ".jpg"); // Get a background
$font rand(1,exec('ls *.ttf | wc -l')) . ".ttf"// Get a font
$textcolor imagecolorallocate($image,0,0,0); // Set text color

$text1 "shenko.homedns.org"// Here is our text

imagettftext($image5002050$textcolor$font$text1); // Write the text with a font

header("Content-type: image/jpeg"); // Its a JPEG
imagejpeg($image,'',90); // Zap it to the browser
imagedestroy($image); // Memory Freeupage

?>
2004-01-24 16:05:39
http://php5.kiev.ua/manual/ru/function.imagefttext.html
I found myself in need of an align right function and found one on the imagepstext manual page. I can't imagine I'm the only person who's needed to use this, so here's a slightly modified version that works with imagefttext:

<?
 
function align_right($string$fontfile$imgwidth$fontsize){
   
$spacing 0;
   
$line = array("linespacing" => $spacing);
    list(
$lx,$ly,$rx,$ry) = imageftbbox($fontsize,0,$fontfile,$string,$line);
   
$textwidth $rx $lx;
   
$imw = ($imgwidth-10-$textwidth);
    return 
$imw;
  }
?>
2004-12-07 22:27:07
http://php5.kiev.ua/manual/ru/function.imagefttext.html
When compiling PHP with FreeType 2 support, you'll probably have some problems if - for example - you use debian and didn't compile freetype2 yourself...
If configure fails after saying "If configure fails, try --with-xpm-dir..." you most likely have FreeType1 installed, but not freetype2 ...

Do this as root :
apt-get install libfreetype6-dev

It took me some time to find out that apt-get install freetype2 is actually installing freetype1 ...
2005-01-27 04:20:49
http://php5.kiev.ua/manual/ru/function.imagefttext.html
This function is very simular to imageffttext(), you may find the information provided on its manual page helpful:

http://php.net/imagettftext
2005-05-29 06:11:40
http://php5.kiev.ua/manual/ru/function.imagefttext.html
For negative image you must add one line after the $grayColor computation:

$grayColor =  ~ $grayColor & 0x7FFFFFF;
2005-06-23 05:25:07
http://php5.kiev.ua/manual/ru/function.imagefttext.html
If you want to get the best result in monochrome font rendering, change render_mode to FT_LOAD_RENDER. It's the last parameter of FT_Load_Glyph() function (in gdft.c).
2005-11-23 11:16:25
http://php5.kiev.ua/manual/ru/function.imagefttext.html
Автор:
I am using php 5.1.2 on a winxp machine. I was  getting into the TrueType fonts and wanted to see which ones would look best incorporated into web images. So I created the following script that prints out samples of all the TrueType fonts found in my C:\Windows\Fonts directory. The script takes only one request parameter - 'fsize'. It stands for font-size and lets you see each font in any size you wish -- I limited it to values between 5 and 48. Hope this helps someone other than me :)

I apologize in advance if any of my code is not the prettiest-written php code even seen -- I have only been coding in php for the past week (I'm a perl-guy usually).

<?php
   
list($x$y$maxwidth) = array(000);

   
$fsize = (int)$_REQUEST['fsize'];
    if (
$fsize or $fsize 48$fsize 8;

   
header("Content-type: image/jpeg");

   
// don't know how wide or tall the font samples will be.
    // create a huge image for now, we'll copy it smaller
    // later when we know how large the image needs to be.
   
$im imagecreate(100020000) or die('could not create!');
   
$clr_white imagecolorallocate($im255255255);
   
$clr_black imagecolorallocate($im000);

   
$font_path "C:/Windows/Fonts/";
   
$dh opendir($font_path);
    while ((
$file readdir($dh)) !== FALSE) {
       
// we're only dealing with TTY fonts here.
       
if (substr(strtolower($file), -4) != '.ttf') continue;

       
$str "Sample text for '$file'";
       
$bbox imagettfbbox(
           
$fsize0"{$font_path}{$file}"$str
       
);
       
$ww $bbox[4] - $bbox[6];
       
$hh $bbox[1] - $bbox[7];

       
imagettftext(
           
$im$fsize0$x$y,
           
$clr_black"{$font_path}{$file}"$str
       
);

       
$y += $hh 20;
        if (
$ww $maxwidth$maxwidth $ww;
    }

   
closedir($dh);

   
// ok, now we can chop off the extra space from the
    // 1000 x 20000 image.
   
$im2 imagecreate($maxwidth 20$y);
   
imagecopyresized(
       
$im2$im0000$maxwidth 20,
       
$y$maxwidth 20$y
   
);
   
imagejpeg($im2);
   
imagedestroy($im);
   
imagedestroy($im2);
?>
2006-02-20 04:19:18
http://php5.kiev.ua/manual/ru/function.imagefttext.html
Since this function is not documented, I felt it was best that I shed some light on the extrainfo parameter.

You can see the full documentation at the GD reference manual:
http://www.boutell.com/gd/manual2.0.33.html#gdImageStringFTEx

Basically it accepts an array containing the following options as keys and an associated value:
(int) flags [more info in the GD reference manual]
(double/float) linespacing
(int) charmap
(int) hdpi
(int) vdpi
(string) xshow
(string) fontpath

My C/C++ is not very good but this is the best I can explain. Read the documentation for more information. :-)

A very simple example of usage would be:

<?php

imagefttext
$img_pointer1201010, [-insertsomecolour-], '/path/to/font.ttf'"THIS IS A TEST\nTHIS IS LINE 2\nTHIS IS LINE3", array('lineheight'=>2.0) );

?>
2006-11-09 03:53:05
http://php5.kiev.ua/manual/ru/function.imagefttext.html
I had trouble working out how to accurately represent fonts in point sizes when constructing charts that had a user-customisable output DPI (basically, the user could specify the size of the chart in mm - or any other physical measure - and the DPI to create arbitrarily-sized charts to work properly in real printed documents).

GD1 was OK as it used pixels for font rendering, but GD2 uses points, which only makes any sense if you know the DPI that it assumes when rendering text on the image surface. I have not been able to find this anywhere in this documentation but have examined the GD2 source code and it appears to assume a DPI of 96 internally. However, this can easily be customised in the GD2 source so it cannot be assumed that all PHP interpreters out there have a GD2 compiled using 96dpi internally.

If it does, and you are using it to construct images whose target DPI is not 96, you can calculate the point size to supply to imageftbox() and imagefttext() like this:

<?php
/* 100mm x 100mm image */
$imageWidth 100;
$imageHeight 100;

/* 300 dpi image, therefore image is 1181 x 1181 pixels */
$imageDPI 300;

/* unless we do this, text will be about 3 times too small */
$realFontSize = ($fontPt $targetDPI) / 96;
?>
2007-03-29 16:58:18
http://php5.kiev.ua/manual/ru/function.imagefttext.html
realpath(".")
realpath(getenv("SCRIPT_FILENAME"));

could be different.  This helped when setting GDFONTPATH.
2007-11-24 12:26:10
http://php5.kiev.ua/manual/ru/function.imagefttext.html
For a design project I am required to have spacing between characters; since imagefttext does not support this feature I have created a function which does support this. 

The arguments are identical to imagefttext, accept that (array)$extrainfo now accepts the 'character_spacing' spacing parameter. The return values are as expected, and include the image boundaries of the entire string including the character spacing.

The downside is that $angle rotates each letter instead of rotating the entire word (could be seen as a feature on its own).

I hope this is of some use to someone.
- KeepSake

<?php
// Required header (assuming we use png images)
header("Content-type: image/png");

// Create a basic image with a dark background.
$image imagecreatetruecolor(30020);
imagefill($image00imagecolorallocate($image212121));

// Function call, arguments are the same as imagefttext, expect that (array)$extrainfo takes a new paramenter called character_spacing.
$imageBox imagefttext2($image90215imagecolorallocate($image255255255), 'tahomabold.ttf''The quick brown fox...', array('character_spacing' => 5));

// Output the file, and clear the resources
imagepng($image);
imagedestroy($image);

function 
imagefttext2($imageResource$font_size$text_angle$start_x$start_y$color$font_file$text$extra_info = array()) {
    if(
$extra_info['character_spacing'] == NULL || !is_numeric($extra_info['character_spacing'])) {
       
$extra_info['character_spacing'] = 0;
    }
   
$lastX $start_x $extra_info['character_spacing'];
    foreach(
str_split($text) as $v) {
       
$coordinates imagefttext($imageResource$font_size$text_angle$lastX $extra_info['character_spacing'], $start_y$color$font_file$v$extra_info);
       
$lastX max($coordinates[2], $coordinates[4]);
    }
   
// Return the newly generated image box coordinates:
   
return array($start_x$start_y$coordinates[2], $coordinates[3], $coordinates[4], $coordinates[5], $start_x$coordinates[7]);
}

?>
2009-09-17 12:05:22
http://php5.kiev.ua/manual/ru/function.imagefttext.html
I'm not sure if this is a PHP issue or an GD issue, but after upgrading to PHP 5.3.2, text written at an angle has become top-justified (so "N" and "n" have the same top, but the bottom of the "N" is lower than the bottom of the "n".  I've written a kludgy work-around, which writes the text to a non-rotated temporary image, then copies the temporary image, rotated onto the main image.  The kludginess is to get around the fact that I can't seem to extract the font info, particularly the distance between the baseline and the very bottom (I've hard-coded it as 30% of the font size)
I hope the bug can be fixed (if it is indeed a bug) or that others can improve this code:

<?php
   
// Function that draws rotated text by creating a temporary image and rotating it, since rotated text appears to be busted
   
function imageTextRotated($image$size$angle$x$y$inColor$fontfile$text$info=array()) {
//        Force some demo text that contains risers and descenders:
//        $text = "Nlfbacejygq!";

       
$bbox imageftbbox($size0$fontfile$text$info);
       
$dropdown $size*0.3;
       
$xsize abs($bbox[2] - $bbox[0]);
       
$ysize abs($bbox[5] - $bbox[3]);
       
$tmpImage imagecreatetruecolor($xsize*1.25$ysize*1.25);        // need the extra space to accommodate risers and descenders
       
$transparent imagecolorallocate($tmpImage255255154);
        if (!
$transparent) {
           
error_log("Color allocate failed");
        }
       
imagecolortransparent($tmpImage$transparent);
        if (!
imagefill($tmpImage0$ysize$transparent)) {
           
error_log("Fill failed");
        }
       
$rgb imagecolorsforindex($image$inColor);
       
$color imagecolorexact($tmpImage$rgb['red'], $rgb['green'], $rgb['blue']);
        if (
$color == -1) {
           
$color imagecolorallocate($tmpImage$rgb['red'], $rgb['green'], $rgb['blue']); 
            if (!
$color) {
               
error_log("Color allocate 2 failed");
            }
        }

       
$newbbox imagefttext($tmpImage$size00$ysize*1.0$color$fontfile$text$info);
       
$tmpImage imagerotate($tmpImage$angle$transparent);
       
$newWidth imagesx($tmpImage);
       
$newHt imagesy($tmpImage);
       
imagecopymerge($image$tmpImage$x-$newWidth+$dropdown$y-$newHt00$newWidth$newHt100);
       
//        Highlight the desired starting point (baseline) with a green dot:
//        $green = imagecolorallocate($image, 0, 251, 0);
//        imagefilledellipse($image, $x, $y, 10, 10, $green);
       
imagedestroy($tmpImage);
?>

-Dave
2010-06-07 15:47:32
http://php5.kiev.ua/manual/ru/function.imagefttext.html

    Поддержать сайт на родительском проекте КГБ