无法将文字换成图片

问题描述

| 我创建了一个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,$font_file,$date) ;
$Box1 = @ImageTTFBBox($font_size,$pname) ;
$Box2 = @ImageTTFBBox($font_size,$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,$put_date_x,$put_date_y,$font_color,$date);
imagettftext($image,$put_name_x,$put_name_y,$name);
imagettftext($image,$put_email_x,$put_email_y,$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) ;
            $text_color = ImageColorAllocate($image,0) ;
            ImageString($image,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,1) == \'#\')
        $hex = substr($hex,1) ;

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

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

    // convert from hexidecimal number systems
    $rgb[\'red\'] = hexdec(substr($hex,2)) ;
    $rgb[\'green\'] = hexdec(substr($hex,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);

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

imagepng($img);
imagedestroy($img);
当然,您将更改图像的初始坐标以及宽度和高度,但是在此示例中,您可以看到其工作原理:)     ,        答案在imagettftext手册页的第二条注释中。具体来说,imagettftext无法识别换行并对其进行处理。取而代之的是,您必须使用自动换行将字符串分割成几行,然后分别放置每一行。