无法将文本换行到图像中


Unable to wrap text in an image

我创建了一个PHP脚本,在HTML输入框中输入文本,然后它将生成一个带有背景图像和特定位置的文本的图像。我发现这段代码可以将文本包装为HTML,但我如何让它在30个字符后在图像上创建一行

HTML换行的代码是:

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

图像代码为:

<?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 ;
}
?>

这很简单,请尝试以下代码:

<?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);

当然,您将更改图像的初始坐标、宽度和高度,但在本例中,您可以看到它的工作原理:)

这个问题的答案在imagettftext手册页面的第二条注释中。具体来说,imagettftext不识别换行符并对其进行处理。相反,您必须使用换行符将字符串拆分为多行,并将每行单独放置。