![]() |
|
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.