|
imagestring
Draw a string horizontally
(PHP 4, PHP 5)
Example 1023. imagestring() example<?php The above example will output something similar to: Related Examples ( Source code ) » imagestring Examples ( Source code ) » Drawing a Circle Examples ( Source code ) » Paint string value with different colors and position Examples ( Source code ) » Draw string and fill rectangle Examples ( Source code ) » Drawing a Square and a string Examples ( Source code ) » Set Font size Examples ( Source code ) » Drawing Lines Examples ( Source code ) » Drawing a Triangler Examples ( Source code ) » Creates an image from an image stream Code Examples / Notes » imagestringdeejay_world
Width ImageString, the strings you draw are not automatically wrapped width the edge of the image. You may use this function to automatically wrap them: function ImageStringWrap($image, $font, $x, $y, $text, $color, $maxwidth) { $fontwidth = ImageFontWidth($font); $fontheight = ImageFontHeight($font); if ($maxwidth != NULL) { $maxcharsperline = floor($maxwidth / $fontwidth); $text = wordwrap($text, $maxcharsperline, "\n", 1); } $lines = explode("\n", $text); while (list($numl, $line) = each($lines)) { ImageString($image, $font, $x, $y, $line, $color); $y += $fontheight; } } So, in particular, if you want to wrap a text with the edge of the Image, you may do: ImageStringWrap($img, $font, 0, $y, $text, $color, ImageSX($img) ); aholmes84
When setting the font, any integer less than 1 defaults to 1, and any integer greater than 5 defaults to 5.
bpgordon
This code produces a png image of the text within the query. It autofits to the length of the string. Usage: http://yoursite.com/text.php?abcdefg+hijk Use + to produce a space in the image. The + can be excaped with a carat (^). Most other symbols work fine in the query string, like the ?. <?php header ("Content-type: image/png"); $string = $_ENV["QUERY_STRING"]; $md5 = md5($string); //just so we don't convert valid text into a + $string = str_replace("^+", $md5, $string); //replaces ^+ with long, unnatural string $string = str_replace("+", " ", $string); //replaces + with space $string = str_replace($md5, "+", $string); //replaces the long, unnatural string with + $width = imagefontwidth($font) * strlen($string); $height = imagefontheight($font); $image = @imagecreate($width+2, $height+2); $black = imagecolorallocate($image, 0, 0, 0); //background $white = imagecolorallocate($image, 255, 255, 255); imagestring($image, 2, 1, 1, $string, $white); imagepng($image); imagedestroy($image); ?> aly
There is an error in "tjpoe at cableaz dot com" 's function ImageStringWrap. Instead of else $string = $text; there should be else $string = array($text); for function to work for strings with only one word. Otherwise it works like a charm, thanks. m dot onderwater
There is a small error in the function for horizontal and vertical centering by "jurgen dot vanoosterwijck at pandora dot be" the line $cy = (imagesy($img)/2) - (imagefontwidth($font)/2); should be $cy = (imagesy($img)/2) - (imagefontheight($font)/2); piotr dot sulecki
The built-in fonts used to be in latin-2 (iso8859-2) encoding. For some time, they are in latin-1 (iso8859-1) encoding. There is no way to change the encoding at all. If you need to use any other encoding, you have to use TrueType fonts.
shadikka
My version of the centered string, it decreases the font number (since I've noticed smaller numbers are smaller fonts) until 1 if the string won't fit. Then it will give up. <?php function imagestringcentered ($img,$font,$cy,$text,$color) { while (strlen($text) * imagefontwidth($font) > imagesx($img)) { if ($font > 1) { $font--; } else { break; } } imagestring($img,$font,imagesx($img) / 2 - strlen($text) * imagefontwidth($font) / 2,$cy,$text,$color); } ?> bob dot brown
If you find that you are getting two characters on the end of your imageString that look like a Y and an upside down L then they're probably representations of CR/LF. Try trim()ing the string before outputting it. (I was sooo sure this was a bug <g>)
webmaster
If you are looking to center the text, use the following function; I'm not promising perfection... function imagecenteredstring ( &$img, $font, $xMin, $xMax, $y, $str, $col ) { $textWidth = imagefontwidth( $font ) * strlen( $str ); $xLoc = ( $xMax - $xMin - $textWidth ) / 2 + $xMin + $font; imagestring( $img, $font, $xLoc, $y, $str, $col ); } julien /
If you are looking for a way to generate a "CAPTCHA" image for a form verification (to verify it is not a robot), have a look at this : http://blog.theoconcept.com/static/distortion/ It gives an animated image with the parameter string, with distortion, here is an example : http://blog.theoconcept.com/static/distortion/distortion.php (*) You'll need GD + Freetype support (**) You'll need ImageMagick on the machine iibm
I've made a little modification of the (quite usefull) imagestringcutted function (when align=center, it doesn't work well for me if x1!=0) so juste replace the last line with : <?php [...] else imagestring($img,$font,$x1+($x2-$x1)/ 2 - strlen($text) * $fontwidth / 2,$y,$text,$color); } ?> tjpoe
i modified the centering functions and created this which centers each word on it's own line. You can adjust the spacing with the $valign var. currently no implimentation if text is too large for image. strings are tokenized by space, but can obviously be changed. function ImageStringWrap($image, $font, $text, $color) { $fontwidth = ImageFontWidth($font); $fontheight = ImageFontHeight($font); $words= str_word_count($text); if ($words > 1){ $string=array(strtok($text,' ')); for ($i = 1 ; $i <= $words ; $i++){ $string=array_merge($string,array($i=>strtok(' '))); } } else $string=$text; $vspace=4; $y=((imagesy($image)-($fontheight*$words)-($words*$vspace))/2); foreach($string as $st){ $x=((imagesx($image)-($fontwidth * strlen($st)))/2); ImageString($image,$font,$x,$y,$st,$color); $y+=($fontheight+$vspace); } } hope this is helpful gannon
I like this better than "tjpoe at cableaz dot com"'s function for wrapping text to fit width (auto-adjusts height as needed) since it doesn't only do 1 word per line. function make_wrapped_txt($txt, $color=000000, $space=4, $font=4, $w=300) { if (strlen($color) != 6) $color = 000000; $int = hexdec($color); $h = imagefontheight($font); $fw = imagefontwidth($font); $txt = explode("\n", wordwrap($txt, ($w / $fw), "\n")); $lines = count($txt); $im = imagecreate($w, (($h * $lines) + ($lines * $space))); $bg = imagecolorallocate($im, 255, 255, 255); $color = imagecolorallocate($im, 0xFF & ($int >> 0x10), 0xFF & ($int >> 0x8), 0xFF & $int); $y = 0; foreach ($txt as $text) { $x = (($w - ($fw * strlen($text))) / 2); imagestring($im, $font, $x, $y, $text, $color); $y += ($h + $space); } header('Content-type: image/jpeg'); die(imagejpeg($im)); } god
Here's a simple function for creating an aligned string which is cutted to match the space between $x1 and $x2 <?php function imagestringcutted($img,$font,$y,$x1,$x2,$text,$color,$align="center") { $fontwidth = imagefontwidth($font); $fullwidth = strlen($text) * $fontwidth; $maxwidth = $x2-$x1; $targetwidth = $fullwidth-(4*$fontwidth); if($fullwidth > $maxwidth) { for($i = 0; $i < strlen($text) AND ((strlen($text)-($i-4))*$fontwidth) > $targetwidth ;$i++) { } $text = substr($text,0,(strlen($text)-$i)-4)."..."; } if($align == "left") imagestring($img,$font,$x1,$y,$text,$color); elseif($align == "right") imagestring($img,$font,$x2 - ((strlen($text) * $fontwidth)),$y,$text,$color); else imagestring($img,$font,($x2-$x1)/ 2 - strlen($text) * $fontwidth / 2,$y,$text,$color); } ?> Usage: <?php imagestringcutted($img,$font,$y,$x1,$x2,$text,$color,$align); ?> Will create a string $text, which is cutted if it's too long to match between $x1 and $2, on $img with font $font and color $color at height $y and with align to $align. Hope it will help some people. Sorry for my bad English. rush
hello, I noticed that if you put a rand(3,5) it will put random sizes of font to each character put on the image. this is very useful when programming captchas for anti-spam form verification.
brooks dot boyd
Drawing a string as an image is a handy way to disguise an eMail address so spam sniffers can't get it as easily. The only catch to creating a dynamic image with your eMail in it is the eMail to be displayed must be passed via the query string to enable static HTML to use it. So, the eMail must be encrypted slightly in order to not defeat the purpose of not typing your eMail address outright. I wrote the following script to do so: Save the following as email.php <?php if ($_GET['addr'] != "") { $msg = $_GET['addr']; $msg = preg_replace("/\[dot]/",".",$msg); $msg = preg_replace("/\[at]/","@",$msg); $final = ""; for ($i=0; $i<=strlen($msg); $i++) { $final .= substr($msg, strlen($msg)-$i, 1); } $msg = $final; $char_width = 8; $char_height = 17; $padding = 3; $width = $padding*2+strlen($msg)*$char_width; $height = +$padding*2+$char_height; $im = imagecreatetruecolor($width,$height); imagealphablending($im, FALSE); imagesavealpha($im, TRUE); $bg = imagecolorallocatealpha($im, 255, 255, 0, 100); $text = imagecolorallocatealpha($im, 0, 0, 0, 0); imagefilledrectangle ($im, 0, 0, $width, $height, $bg); # Make transparent imagestring($im, 4, $padding, $padding, $msg, $text); } else { $im = imagecreatetruecolor(1,1); imagealphablending($im, FALSE); imagesavealpha($im, TRUE); $bg = imagecolorallocatealpha($im, 255, 0, 0, 125); imagefilledrectangle ($im, 0, 0, 1, 1, $bg); # Make transparent } header('Content-type: image/jpg'); imagepng($im); imagedestroy($im); ?> If the script is called without an eMail address, it outputs a 2x2 transparent image. To call the script to generate the eMail "user@home.com", the HTML tag would be: <img src="email.php?addr=moc[dot]emoh[at]resu"> To 'encrypt' the eMail address to pass to the script, write the address backwards and replace "." with "[dot]" and "@" with "[at]". It's not the most ironclad protection, but it thwarts most casual eMail sniffers. jurgen dot vanoosterwijck
Based on the previous example, here's how to center a string both horizontally and vertically... <?php function imagestringcentered ($img,$font,$text,$color) { while (strlen($text) * imagefontwidth($font) > imagesx($img)) { if ($font > 1) { $font--; } else { break; } } $cy = (imagesy($img)/2) - (imagefontwidth($font)/2); imagestring($img,$font,imagesx($img) / 2 - strlen($text) * imagefontwidth($font) / 2,$cy,$text,$color); } ?> php dot net
A simple example: To make one line of text fit in the image. <?php header ("Content-type: image/png"); $string = "spam@mvoncken.nl"; $font = 4; $width = ImageFontWidth($font) * strlen($string); $height = ImageFontHeight($font); $im = @imagecreate ($width,$height); $background_color = imagecolorallocate ($im, 255, 255, 255); //white background $text_color = imagecolorallocate ($im, 0, 0,0);//black text imagestring ($im, $font, 0, 0, $string, $text_color); imagepng ($im); ?> I use something like this for spamprotection of my visitors (pass userid as an url-parameter for this php) cesargus
//simple hello world <? header ("Content-type: image/png"); $img_handle = ImageCreate (200, 20) or die ("Cannot Create image"); $back_color = ImageColorAllocate ($img_handle, 0, 10, 10); $txt_color = ImageColorAllocate ($img_handle, 235, 235, 51); ImageString ($img_handle, 10, 25, 5, "Hello world!", $txt_color); ImagePng ($img_handle); ?> jlamer
// Example of use... // This is a simple function to output text to an image // which is centered (as much as I want to do by eye) // and wrapped // Just remember that all the sizes are guessed // doesn't cut on the space (only on number of characters) // or change color of text, but this isn't for that... function imageCenterString( $imgw, $imgh, $image_text = '', $text_size=5 ) { $im = imagecreate( $imgw, $imgh ); // white background and blue text $bg = imagecolorallocate($im, 255, 255, 255); $textcolor = imagecolorallocate($im, 0, 0, 0); $t_h = $t_w = $t_x = $t_y = 0; $base_w =9; $base_h = 16; $m = 0.88; switch ( $text_size ) { case 1: $t_w = $base_w*pow(($m*.98),4); $t_h = $base_h*pow(($m*.98),4); break; case 2: $t_w = $base_w*pow($m,3); $t_h = $base_h*pow($m,3); break; case 3: $t_w = $base_w*pow($m,2); $t_h = $base_h*pow($m,2); break; case 4: $t_w = $base_w*$m; $t_h = $base_h*$m; break; case 5: $t_w = $base_w; $t_h = $base_h; break; default: if ( $text_size >= 5 ) // set to 5 { $t_w = $base_w; $t_h = $base_h; } if ( $text_size < 5 ) // set to 1 { $t_w = $base_w*pow(($m*.98),4); $t_h = $base_h*pow(($m*.98),4); } break; } $text_array = array(); $max = floor($imgw/$t_w); for( $i=0; strlen($image_text) > 0; $i += $max) { array_push($text_array, substr($image_text,0,$max)); if ( strlen($image_text) >= $max ) { $image_text = substr($image_text,$max); } else { $image_text = ''; } } $t_y = ($imgh/2) - ($t_h*count($text_array)/2); foreach ( $text_array as $text ) { $t_x = ($imgw/2)-($t_w*strlen($text)/2); imagestring($im, $text_size, $t_x, $t_y, $text, $textcolor); $t_y += $t_h; } // output the image header("Content-type: image/gpeg"); imagejpeg($im); } |
Change Languagegd_info getimagesize image_type_to_extension image_type_to_mime_type image2wbmp imagealphablending imageantialias imagearc imagechar imagecharup imagecolorallocate imagecolorallocatealpha imagecolorat imagecolorclosest imagecolorclosestalpha imagecolorclosesthwb imagecolordeallocate imagecolorexact imagecolorexactalpha imagecolormatch imagecolorresolve imagecolorresolvealpha imagecolorset imagecolorsforindex imagecolorstotal imagecolortransparent imageconvolution imagecopy imagecopymerge imagecopymergegray imagecopyresampled imagecopyresized imagecreate imagecreatefromgd2 imagecreatefromgd2part imagecreatefromgd imagecreatefromgif imagecreatefromjpeg imagecreatefrompng imagecreatefromstring imagecreatefromwbmp imagecreatefromxbm imagecreatefromxpm imagecreatetruecolor imagedashedline imagedestroy imageellipse imagefill imagefilledarc imagefilledellipse imagefilledpolygon imagefilledrectangle imagefilltoborder imagefilter imagefontheight imagefontwidth imageftbbox imagefttext imagegammacorrect imagegd2 imagegd imagegif imagegrabscreen imagegrabwindow imageinterlace imageistruecolor imagejpeg imagelayereffect imageline imageloadfont imagepalettecopy imagepng imagepolygon imagepsbbox imagepsencodefont imagepsextendfont imagepsfreefont imagepsloadfont imagepsslantfont imagepstext imagerectangle imagerotate imagesavealpha imagesetbrush imagesetpixel imagesetstyle imagesetthickness imagesettile imagestring imagestringup imagesx imagesy imagetruecolortopalette imagettfbbox imagettftext imagetypes imagewbmp imagexbm iptcembed iptcparse jpeg2wbmp png2wbmp |