2013-01-25 14 views
11

私は、イメージ上に生成されたテキストをイメージの中央に揃えたいと思っています。私はそれを整列することが可能かどうかは分かりません。以下はコードです。PHPで生成されたイメージの動的テキストを中央に整列する

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

助けてくれてありがとう。

答えて

1

私は少しあなたのコードを更新しました:

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

ImageTTFCenter機能は、中心があなたのことをあなたはあなたがstil/gd-textクラスを使用することができますimagettftext

+0

それが途中でテキストの開始を揃えるが、テキストを中心としません。私は何を意味するのですか? –

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

私はこのコードを使用しました。画像の幅が異なるために同じ位置にはならない。正しい? –

+0

私は理解できませんでした、より具体的にしてください。 – Fr0z3n

+5

テキスト境界ボックスの高さを計算する行は、次のようになります。$ text_height = $ text_box [7] - $ text_box [1]; - 上記のコードでは、間違って0として計算されています。悲しいことに、1文字を編集することはできません... – John

15

を教えてくれます、画像を調整するでしょう。免責事項:私は著者です。

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

デモンストレーション:

demo

+0

Excellentを使用しています – ropic

+0

これを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']); 
} 
関連する問題