2011-05-29 63 views
4

我已經創建了一個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 ; 
} 
?> 
+0

你可以包含你的代碼來渲染圖像嗎? – 2011-05-29 13:37:03

回答

3

這很簡單,試試這個代碼:

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

當然,你會改變初始座標和寬度圖像的高度,但在這個例子中,你可以看到,它是如何工作:)

+0

它工作的很棒 - 謝謝! – Dwayne 2011-05-29 15:25:23

0

這個問題的答案是對manual page of imagettftext的第二個評論。具體來說,imagettftext不會識別換行符並對其進行處理。相反,你必須使用wordwrap將你的字符串分成幾行,然後分別放置每一行。

+0

你錯了,它的確如此。 – 2011-05-29 14:12:28