开发者

Unable to wrap text in an image

开发者 https://www.devze.com 2023-03-08 21:25 出处:网络
I\'ve created a PHP script, where you enter text in HTML input boxes, and then it will generate an image with a background image and the text in specific locations. I found this code that can wrap tex

I've created a PHP script, where you enter text in HTML input boxes, and then it will generate an image with a background image and the text in specific locations. I found this code that can wrap text as HTML, but h开发者_JAVA百科ow do I make it so say after 30 characters it creates a new line on the image?

The code for the HTML line break is:

$dir = html_entity_decode($_POST['sig']).' ' ;  
$sig = wordwrap($dir , 30, "<br />", true);

The image code is:

<?php   

// clean up the input
if(empty($_GET['date']))    fatal_error('Error: No text specified.') ;


$date = Date("F d, Y, h:i A", $now);
$name = html_entity_decode($_GET['pname']).' ' ;
$email = html_entity_decode($_GET['dob']).' ' ;


if(empty($date))

    fatal_error('Error: Text not properly formatted.') ;


// customizable variables
$font_file      = 'Muli-Regular.ttf';
$font_size      = 10 ; // font size in pts
$font_color     = '#000' ;
$image_file     = 'background.png';

// x and y for the bottom right of the text
// so it expands like right aligned text
$x_finalpos     = 340;
$y_finalpos     = 250;

$xpos = 180; 
$ypos = 278;

$xpos1 = 225; 
$ypos1 = 305;


$mime_type          = 'image/png' ;
$extension          = '.png' ;
$s_end_buffer_size  = 4096 ;

// check for GD support
if(!function_exists('ImageCreate'))
    fatal_error('Error: Server does not support PHP image generation') ;

// check font availability;
if(!is_readable($font_file)) {
    fatal_error('Error: The server is missing the specified font.') ;
}

// create and measure the text
$font_rgb = hex_to_rgb($font_color) ;
$box = @ImageTTFBBox($font_size,0,$font_file,$date) ;
$box1 = @ImageTTFBBox($font_size,0,$font_file,$pname) ;
$box2 = @ImageTTFBBox($font_size,0,$font_file,$dob) ;

$date_width = abs($box[2]-$box[0]);
$date_height = abs($box[5]-$box[3]);

$name_width = abs($box1[2]-$box1[0]);
$name_height = abs($box1[5]-$box1[3]);  

$email_width = abs($box2[2]-$box2[0]);
$email_height = abs($box2[5]-$box2[3]);


$medOther_width = abs($box10[2]-$box10[0]);
$medOther_height = abs($box10[5]-$box10[3]);

$image =  imagecreatefrompng($image_file);

if(!$image || !$box)
{
    fatal_error('Error: The server could not create this image.') ;
}

// allocate colors and measure final text position
$font_color = ImageColorAllocate($image,$font_rgb['red'],$font_rgb['green'],$font_rgb['blue']) ;

$image_width = imagesx($image);

$put_date_x = $image_width - ($image_width - $x_finalpos);
$put_date_y = $y_finalpos;

$put_name_x = $image_width - ($image_width - $xpos);
$put_name_y = $ypos;

$put_email_x = $image_width - ($image_width - $xpos1);
$put_email_y = $ypos1;


// Write the text
imagettftext($image, $font_size, 0, $put_date_x,  $put_date_y, $font_color, $font_file, $date);
imagettftext($image, $font_size, 0, $put_name_x,  $put_name_y, $font_color, $font_file, $name);
imagettftext($image, $font_size, 0, $put_email_x,  $put_email_y, $font_color, $font_file, $email);


header('Content-type: ' . $mime_type) ;
ImagePNG($image) ;

ImageDestroy($image) ;
exit ;


/*
    attempt to create an image containing the error message given. 
    if this works, the image is sent to the browser. if not, an error
    is logged, and passed back to the browser as a 500 code instead.
*/
function fatal_error($message)
{
    // send an image
    if(function_exists('ImageCreate'))
    {
        $width = ImageFontWidth(5) * strlen($message) + 10 ;
        $height = ImageFontHeight(5) + 10 ;
        if($image = ImageCreate($width,$height))
        {
            $background = ImageColorAllocate($image,255,255,255) ;
            $text_color = ImageColorAllocate($image,0,0,0) ;
            ImageString($image,5,5,5,$message,$text_color) ;    
            header('Content-type: image/png') ;
            ImagePNG($image) ;
            ImageDestroy($image) ;
            exit ;
        }
    }

    // send 500 code
    header("HTTP/1.0 500 Internal Server Error") ;
    print($message) ;
    exit ;
}


/* 
    decode an HTML hex-code into an array of R,G, and B values.
    accepts these formats: (case insensitive) #ffffff, ffffff, #fff, fff 
*/    
function hex_to_rgb($hex) {
    // remove '#'
    if(substr($hex,0,1) == '#')
        $hex = substr($hex,1) ;

    // expand short form ('fff') color to long form ('ffffff')
    if(strlen($hex) == 3) {
        $hex = substr($hex,0,1) . substr($hex,0,1) .
               substr($hex,1,1) . substr($hex,1,1) .
               substr($hex,2,1) . substr($hex,2,1) ;
    }

    if(strlen($hex) != 6)
        fatal_error('Error: Invalid color "'.$hex.'"') ;

    // convert from hexidecimal number systems
    $rgb['red'] = hexdec(substr($hex,0,2)) ;
    $rgb['green'] = hexdec(substr($hex,2,2)) ;
    $rgb['blue'] = hexdec(substr($hex,4,2)) ;

    return $rgb ;
}
?>


It's pretty simple, try this code:

<?php
header('Content-type: image/png');
$dir = html_entity_decode($_POST['sig']).' ';
$text_length = 30;
$sig = wordwrap($dir, $text_length, "<br />", true);
$fontsize = 12;
$fontfile = './arial.ttf';

$img = imagecreatetruecolor(500, 500); //there will be opened background image
$c = imagecolorallocate($img, 255, 255, 255);

//Just wrap text by newlines
$text = str_replace('<br />', "\n", $sig);
imagettftext($img, $fontsize, 0, 0, $fontsize+2, $c, $fontfile, $text); // "+2" - height of space-line

imagepng($img);
imagedestroy($img);

Of course, you will change initial coordinates and width and height of image, but in this example you can see, how it works :)


The answer to this is on the second comment of the manual page of imagettftext. Specifically, imagettftext doesn't recognize newlines and process them. Instead, you have to use wordwrap to split your string into lines, and place each line individually.

0

精彩评论

暂无评论...
验证码 换一张
取 消