问题描述
|
我创建了一个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无法识别换行并对其进行处理。取而代之的是,您必须使用自动换行将字符串分割成几行,然后分别放置每一行。