2013-01-25 16 views
11

Desidero allineare il testo generato sull'immagine al centro dell'immagine. per il momento, non so se è possibile allinearlo. sotto è il codice.Allineamento del testo dinamico generato immagine php al centro

$im = @imagecreatefromjpeg('poloroid.jpg'); 

// Create some colors 
$white = imagecolorallocate($im, 255, 255, 255); 
$grey = imagecolorallocate($im, 128, 128, 128); 
$black = imagecolorallocate($im, 0, 0, 0); 
//imagefilledrectangle($im, 0, 0, 399, 29, $white); 

// The text to draw 
//$text = 'John...'; 
$fbid = $_POST["id"]; 
$text = $_POST["want"]; 
$fb_email =$_POST["email"]; 
$fb_name=$_POST["name"]; 

$uploads_dir = 'uploaded_files/'; 
// Replace path by your own font path 
$font = 'verdana.ttf'; 

//image file name 
//$name ="$fbid.png"; 
$name = $uploads_dir.$fbid.".png"; //this saves the image inside uploaded_files folder 

// Add some shadow to the text 
imagettftext($im, 20, 0, 25, 126, $grey, $font, $text); 

// Add the text 
imagettftext($im, 20, 0, 25, 125, $black, $font, $text); 

// Using imagepng() results in clearer text compared with imagejpeg() 
//imagepng($im); 
imagepng($im,$name,9); 
imagedestroy($im); 

grazie per l'aiuto ragazzi.

risposta

1

Ho aggiornato il codice di un po ':

function ImageTTFCenter($image, $text, $font, $size, $angle = 45) 
{ 
    $xi = imagesx($image); 
    $yi = imagesy($image); 

    $box = imagettfbbox($size, $angle, $font, $text); 

    $xr = abs(max($box[2], $box[4])); 
    $yr = abs(max($box[5], $box[7])); 

    $x = intval(($xi - $xr)/2); 
    $y = intval(($yi + $yr)/2); 

    return array($x, $y); 
} 

$im = @imagecreatefromjpeg('poloroid.jpg'); 

// Create some colors 
$white = imagecolorallocate($im, 255, 255, 255); 
$grey = imagecolorallocate($im, 128, 128, 128); 
$black = imagecolorallocate($im, 0, 0, 0); 
//imagefilledrectangle($im, 0, 0, 399, 29, $white); 

// The text to draw 
//$text = 'John...'; 
$fbid = $_POST["id"]; 
$text = $_POST["want"]; 
$fb_email =$_POST["email"]; 
$fb_name=$_POST["name"]; 

$uploads_dir = 'uploaded_files/'; 
// Replace path by your own font path 
$font = 'verdana.ttf'; 

//image file name 
//$name ="$fbid.png"; 
$name = $uploads_dir.$fbid.".png"; //this saves the image inside uploaded_files folder 

list($x, $y) = ImageTTFCenter($im, $text, $font, 20) 
// Add some shadow to the4 text 
imagettftext($im, 20, 0, $x, $y+1, $grey, $font, $text); 

// Add the text 
imagettftext($im, 20, 0, $x, $y, $black, $font, $text); 

// Using imagepng() results in clearer text compared with imagejpeg() 
//imagepng($im); 
imagepng($im,$name,9); 
imagedestroy($im); 

La funzione ImageTTFCenter troveranno il centro coordinate di voi un'immagine che vi dirà imagettftext

+0

allinea la partenza del testo in mezzo, ma non centrare il testo. capisci cosa intendo? –

17
$im = @imagecreatefromjpeg('poloroid.jpg'); 

// Create some colors 
$white = imagecolorallocate($im, 255, 255, 255); 
$grey = imagecolorallocate($im, 128, 128, 128); 
$black = imagecolorallocate($im, 0, 0, 0); 
//imagefilledrectangle($im, 0, 0, 399, 29, $white); 

// The text to draw 
//$text = 'John...'; 
$fbid = $_POST["id"]; 
$text = $_POST["want"]; 
$fb_email =$_POST["email"]; 
$fb_name=$_POST["name"]; 

$uploads_dir = 'uploaded_files/'; 
// Replace path by your own font path 
$font = 'verdana.ttf'; 
$font_size = 20; 
$angle = 45; 

//image file name 
//$name ="$fbid.png"; 
$name = $uploads_dir.$fbid.".png"; //this saves the image inside uploaded_files folder 

// Get image Width and Height 
$image_width = imagesx($im); 
$image_height = imagesy($im); 

// Get Bounding Box Size 
$text_box = imagettfbbox($font_size,$angle,$font,$text); 

// Get your Text Width and Height 
$text_width = $text_box[2]-$text_box[0]; 
$text_height = $text_box[7]-$text_box[1]; 

// Calculate coordinates of the text 
$x = ($image_width/2) - ($text_width/2); 
$y = ($image_height/2) - ($text_height/2); 

// Add some shadow to the text 
imagettftext($im, $font_size, 0, $x, $y+1, $grey, $font, $text); 

// Add the text 
imagettftext($im, $font_size, 0, $x, $y, $black, $font, $text); 

// Using imagepng() results in clearer text compared with imagejpeg() 
//imagepng($im); 
imagepng($im,$name,9); 
imagedestroy($im); 
+0

ho usato questo codice. ma poi le immagini non hanno la stessa posizione a causa della differenza di larghezza. corretta? –

+0

Non ho capito, per favore sii più specifico. – Fr0z3n

+5

La riga che calcola l'altezza del riquadro di delimitazione del testo deve essere: $ text_height = $ text_box [7] - $ text_box [1]; - il codice sopra lo calcola erroneamente come 0. Purtroppo non sono autorizzato a modificare singoli caratteri ... – John

15

È possibile utilizzare stil/gd-text classe. Disclaimer: I am the author.

<?php 
use GDText\Box; 
use GDText\Color; 

$im = @imagecreatefromjpeg('poloroid.jpg'); 

$textbox = new Box($im); 
$textbox->setFontSize(20); 
$textbox->setFontFace('verdana.ttf'); 
$textbox->setFontColor(new Color(0, 0, 0)); // black 
$textbox->setTextShadow(
    new Color(0, 0, 0, 80), // black color, but 60% transparent 
    0, 
    -1 // shadow shifted 1px to top 
); 
$textbox->setBox(
    0, // distance from left edge 
    0, // distance from top edge 
    imagesx($im), // textbox width, equal to image width 
    imagesy($im) // textbox height, equal to image height 
); 

// now we have to align the text horizontally and vertically inside the textbox 
// the texbox covers whole image, so text will be centered relatively to it 
$textbox->setTextAlign('center', 'center'); 
// it accepts multiline text 
$textbox->draw($text); 

$uploads_dir = 'uploaded_files/'; 
//image file name 
//$name ="$fbid.png"; 
$name = $uploads_dir.$fbid.".png"; //this saves the image inside uploaded_files folder 
imagepng($im, $name, 9); 
imagedestroy($im); 

Dimostrazione:

demo

+0

Eccellente utilizzo – ropic

+0

come posso aggiungere questo in codeigniter? – bxorcloud

-2
foreach ($user as $key=>$value){  
    $bb = imagettfbbox($value['font-size'],0,$fontname,$value['name']);  
    $WW = abs($bb[2]-$bb[0]);  
    $XX = ($value['XPos']+$WW);  
    $HH = abs($bb[5]-$bb[3]);  
    $HH +=1; 
    $HHH += $HH; 
    imagettftext($im, $value['font-size'], 0, $value['XPos'], $value['YPos'], $color[$value['color']], $fontname, $value['name']); 
    $HHH += 1; 
    $WIDE = abs($bb[2]-$bb[0]); 
    $endpoint=$value['XPos']+$WIDE; 
    $bb2 = imagettfbbox($value['font-size'],0,$fontname,$value['name']); 
    $WW2 = abs($bb2[2]-$bb2[0]);  
    $x2pos= $endpoint-$WW2;  
    imagettftext($im, $value['font-size'], 0, $x2pos, $value['YPos'], $color[$value['color']], $fontname, $value['name']); 
}