Free, tested & ready to use examples!

Gd / FreeType text label generator

This is an example of using Gd / FreeType to generate image text labels with TTF font. Provided script could be used as "text rasterization service" to generate arbitrarily text-images for a web site. MD5-based authorization is used to avoid image generation by unauthorized users.
  • PHP 5 or higher
  • PHP 4.1 or higher
  • Gd 2.x, FreeType support in PHP
  • Our "text rasterization service" does the following:

    • Receives text generation parameters(text and font-size) and md5 sign of secret key + parameters.
    • Checks(by md5 sign) if rasterized text image exists in cache directory. If so, sends it to web browser and quits.
    • Checks md5 authorization: computes md5 of secret key + parameters. If computed md5-sign equals to provided md5-sign, then request is valid. Otherwise — somebody else is trying to use our "text rasterization service".
    • Generates text image with imagettftext. Image size exactly matches text size (using imagettfbbox)
    • Sends generated image to browser

    So, it is possible to automatically generate a lot of image text labels for a whole web site. Caching technique will decrease server load: images would be generated only once.

    source code: php

    // Checking for gd and Freetype support 
    if (!function_exists('gd_info'))
    'No <a href="">gd</a> support in PHP.');

    $gd gd_info();
    if (
    $gd["FreeType Support"] == false)
    'No FreeType support in gd</a>');

    // If you're sure about gd & freetype support
    // -- comment out this block 

    // directory for caching generated images 
    // should be writable 
    $cache_dir '/homa/anyexample/cache'// DO NOT FORGET TO CHANGE

    // testing cache dir 
    // remove these lines if you're sure 
    // that your cache dir is really writable to PHP scripts
    $tf $cache_dir.'/'.md5(rand()).".test";
    $f = @fopen($tf"w");
    if (
    $f == false)
    "Fatal error! {$cache_dir} is not writable. Set 'chmod 777 {$cache_dir}' 
               or something like this"
    // testing cache dir END 

    // full path to preferred TTF font 
    // you could change this to be HTTP parameter 
    $font '/home/anyexample/FuturaBook.ttf'// DO NOT FORGET TO CHANGE

    // md5 secret 
    $md5_secret_key 'changeme'// DO NOT FORGET TO CHANGE

    // md5 sign of parameters
    $auth_sign = isset($_GET['a'])?$_GET['a']:'';

    // checking for cached file:
    $cache_file $cache_dir.'/'.$auth_sign.'.png';

    if (
    // if cached file exists
      // output it and quit
    header("Content-type: image/png");

    // no cached file exists 

    // input parameters: text and size 
    $text = isset($_GET['text'])?$_GET['text']:'default';

    $font_size = isset($_GET['size'])?intval($_GET['size']):30;
    if (
    $font_size == 0$font_size 30;

    // basic sign checking: 
    $computed_sign md5($md5_secret_key.$text.$font_size);
    // computing md5 sum of concatenation 
    // of secret key and parameters

    // hmac-based alrorithm would fit this case more 
    // but for real-world purpose md5 of concatenation
    // is enought 

    if ($computed_sign != $auth_sign)
    'Auth failed'); // auth error, provided sign is invalid 

    // getting bounding box 
    $bbox imagettfbbox($font_size0$font$text);
    // imagettfbbox returns very strange results 
    // so transforming them to plain width and height 

    $size_w abs($bbox[2] - $bbox[0]);
    // width: right corner X - left corner X

    $size_h abs($bbox[7] - $bbox[1]);
    // height: top Y - bottom Y

    // This is a lower-left corner 
    // but imagettfbbox() sets (0,0) point
    // inside bounding box
    // so we shifting lower-left corner
    $x = -abs($bbox[0]); 
    $y $size_h abs($bbox[1]);

    $im imagecreatetruecolor($size_w$size_h);
    // creating image

    $back imagecolorallocate($im255255255); // background color
    $fore imagecolorallocate($im000); // foreground color

    imagefilledrectangle($im00$size_w 1$size_h 1$back);
    // filling with background color

    // rendering text

    imagepng($im$cache_file); // outputing PNG image to file cache 

    imagedestroy($im); // destroy image 

    // sending data from cache file 
    header("Content-type: image/png");

    To generate image 'Hello World', 90 pixels size you should call this script as (assuming you've saved it as font.php):

    	<img src="./font.php?text=Hello+World&size=90&a=4c9a240e98490275d845c96fdb8e5a19">

    Note parameter 'a=4c9a240e98490275d845c96fdb8e5a19'. '4c9a240e98490275d845c96fdb8e5a19' is a result of md5('changemeHello World90'): concatenation of secret key, text and font size.

    You could use some helper function to set script arguments, like 'image_params':

    source code: php

    // returns parameters and md5 sign for 
    // text generating service
    function img_params($text$size
    $p '?text='.urlencode($text).'&size='.$size.'&a=';

    <html><head><title>Font test</title></head>

    <img src="./font.php<?php echo img_params('Hello World'90);?>">
    <img src="./font.php<?php echo img_params('Enjoy the font generating service script from'30); ?>">
    <a href="">
    <img src="./font.php<?php echo img_params('AnyExample'100); ?>">


    See generated page.


  • 'If-Modified-Since' and HTTP 304-based browser-caching is not used. You could implement it as in this example.
  • tested 
  • FreeBSD 6.2 :: PHP 5.2.1
  • RHEL 5.0 :: PHP 4.4.5

    © AnyExample 2010-2013
    License | Privacy | Contact