![]() |
|
Snippets |
|
This one is a port of the Imagetext plugin for Smarty. So as I won't include the credit in this snippet please check them in the Smarty plugin itself here.
In order to make it work, this is what you need : - A 'fonts' folder in your projects' data directory, in which you copy the .ttf files you need - The following helper :
function imagetext($text,$styleName=null,$params=array()) { if(!$styleName){ $styleName='default'; } if (empty($text)) { return; } // Which style is in use $style=sfConfig::get('app_imagetext_styles'); $style=$style[$styleName]; // Param values overwrite style values foreach ($params as $key=>$value) $style[$key] = $value; // Error handling if (empty($style['font'])) { throw new sfViewException("imagetext: missing 'font' parameter"); return; } if (empty($style['size'])) { throw new sfViewException("imagetext: missing 'size' parameter"); return; } if (empty($style['bgcolor'])) { $style['bgcolor'] = 'FFFFFF'; } if (empty($style['fgcolor'])) { $style['fgcolor'] = '000000'; } ### Preferences $cacheDir=sfConfig::get('sf_web_dir').DIRECTORY_SEPARATOR.'images'.DIRECTORY_SEPARATOR.'imagetext'.DIRECTORY_SEPARATOR; $cacheUrl='imagetext/'; $fontDir=sfConfig::get('sf_data_dir').DIRECTORY_SEPARATOR.'fonts'.DIRECTORY_SEPARATOR; $text = preg_replace("=<br( /)?>=i", "\n", $text); // Which font is in use $font = $fontDir.$style['font']; // Hash of text and all parameters for the cache function $hash = md5(implode('',$style).$text); // The url of the created image $imgFile = $cacheDir.$styleName.'_'.$hash.'.'.$style['format']; $imgUrl = $cacheUrl.$styleName.'_'.$hash.'.'.$style['format']; ### Use cached image if available if (file_exists($imgFile) && @$style['dev'] != true && @$style['dynamic'] != true) if (@$style['urlonly'] == 'true') return $imgUrl; else return @$style['prehtml'].image_tag($imgUrl,array('style'=>'border: 0 px solid #00ff00','alt'=>preg_replace("=\r\n|\r|\n|\t=", ' ', htmlspecialchars($text)))).@$style['posthtml']; ### otherwise create it // Function to get a color handler of hex values if (!function_exists('fromhex')) { function fromhex($image,$string) { sscanf($string, "%2x%2x%2x", $red, $green, $blue); return ImageColorAllocate($image,$red,$green,$blue); } } ### create a four times larger image to improve kerning // The multiplier. The bigger the better the kerning and the typeface, but the slower the creation $multi = 4; // If "pixelfont" don“t use multiplier if ($style['pixelfont'] == 1) $multi = 1; // Calculate measures of image $bbox = imagettfbbox ($style['size']*$multi, 0, $font, $text); $xcorr = 0-$bbox[6]; // northwest X $ycorr = 0-$bbox[7]; // northwest Y $box['left'] = $bbox[6]+$xcorr+$style['x']*$multi; $box['height'] = abs($bbox[5])+abs($bbox[1]); $box['width'] = abs($bbox[2])+abs($bbox[0])+$style['x']*$multi; $box['top'] = abs($bbox[5]); // Create the big image $im = imagecreate ($box['width'], $box['height']); $bgcolor = fromhex($im,$style['bgcolor']); $fgcolor = fromhex($im,$style['fgcolor']); if ($style['pixelfont'] == 1) $fgcolor = -$fgcolor; imagettftext ($im, $style['size']*$multi, 0, $box['left'], $box['top'], $fgcolor, $font, $text); // Sample down the big image $width = $style['width']+$style['addx']; $height = $style['height']+$style['addy']; // Overwrite when height oder width is given if (empty($style['width'])) $width = $box['width']/$multi+$style['addx']+$style['x']; if (empty($style['height'])) $height = $box['height']/$multi+$style['addy']+$style['y']; $ds = imagecreatetruecolor ($width, $height); $bgcolor2 = fromhex($ds,$style['bgcolor']); imageFill($ds,0,0,$bgcolor2); imagecopyresampled($ds,$im,0,$style['y'],0,0,$box['width']/$multi, $box['height']/$multi,$box['width'], $box['height']); imagetruecolortopalette($ds,0,256); imagepalettecopy($ds,$im); ImageColorTransparent($ds,$bgcolor); // write whereto? if ($style['format'] == 'gif') ImageGIF ($ds,$imgFile); else ImagePNG ($ds,$imgFile); ImageDestroy ($im); ImageDestroy ($ds); // and display if ($style['dev']) $border = 1; else $border = 0; if ($style['urlonly'] == 'true') return $imgUrl; else return $style['prehtml'].image_tag($imgUrl,array('style'=>'border: '.$border.'px solid #00ff00','alt'=>preg_replace("=\r\n|\r|\n|\t=", ' ', htmlspecialchars($text)))).$style['posthtml']; }
As you can see in this code styles can (at least 'default' MUST be) be configured in app.yml. This is an example style config :
imagetext:
styles:
default:
font: hockey.ttf
size: 18
format: png
So now you can use the helper in your templates :
<?php use_helper('imageText') ?> <? echo imagetext('This is my title') ?> <p>Some blah blah</p> <? echo imagetext('This is another headline style','anotherstyle') ?>
This helper uses GD so depending on which version you have installed, you might or might not handle PNG or GIF.
Comments on this snippet
If you got some error message, refer my solution: first: change app.yml setting like this. imagetext: styles: default: font: bhei01bu.ttf size: 18 format: png pixelfont = 0 bgcolor = F3F3F3 fgcolor = 990000 x = 0 y = 0
second: creat a 'imagetext' folder in your project /web/images/ directory
for more setting infomation, please visit http://www.cerdmann.com/imagetext/