2012-03-15 9 views
5

私はそれらを合わせた画像と中央に複数行のテキストを印刷しようとしていると、複数行のテキストを揃えます。は、センターでは、GDとPHP

すなわち

       これは今のところ、テキスト


文字列で、私は、文字列全体のために左の位置を持っています。それを稼働させるためのショートカット?私はそれは、その大きなttfboxの内側に新しいテキストを中央揃え、その後、改行で爆発、文字列全体にgetttfboxでなければならないかもしれないと思います。それはお尻の痛みです...

EDIT:解決策を考え出した:

foreach ($strings as $index => $string) { 
     $parts = explode ("\n", $string['string']); 
     if (count ($parts) > 1) { 
      $bounds = imagettfbbox (intval($string['fontsize']), 0, $font, $string['string']); 
      $width = $bounds[2] - $bounds[0]; 
      $height = $bounds[3] - $bounds[5]; 
      $line_height = $height/count ($parts); 

      foreach ($parts as $index => $part) { 
       $bounds = imagettfbbox (intval($string['fontsize']), 0, $font, $part); 
       $new_width = $bounds[2] - $bounds[0]; 
       $diff = ($width - $new_width)/2; 
       $new_left = $string['left'] + $diff; 

       $new_string = $string; 
       $new_string['left'] = $new_left; 
       $new_string['top'] = $string['top'] + ($index * $line_height); 
       $new_string['string'] = $part; 
       $new_strings[] = $new_string; 
      } 
     } 
    } 

    if ($new_strings) 
     $strings = $new_strings; 

をこの場合、各$文字列がどのように、どのような印刷するに関するいくつかの情報を持つ配列です。 誰かを助けることを願っています。ここで

+0

あなたの質問にあなたの答えを編集する代わりに、新しい答えを書く(そしてあなたのために働いたソリューションをthatsの場合は、それを受け入れる)しないでください。 – darthmaim

答えて

2

は、私が自動wordwrappingを助けることができない、あなたが言及したimagettfbboxを使用する機能ですが、あなたが示唆したかもしれないとして、事前に文字列を分割します。

function imagettftext_cr(&$im, $size, $angle, $x, $y, $color, $fontfile, $text) 
{ 
    $bbox = imagettfbbox($size, $angle, $fontfile, $text); 
    $dx = ($bbox[2]-$bbox[0])/2.0 - ($bbox[2]-$bbox[4])/2.0; 
    $dy = ($bbox[3]-$bbox[1])/2.0 + ($bbox[7]-$bbox[1])/2.0; 
    $px = $x-$dx; 
    $py = $y-$dy; 
    return imagettftext($im, $size, $angle, $px, $py, $color, $fontfile, $text); 
} 

編集:また... PHPのドキュメンテーションコメントに

をこれを見つけたここでは、画像に入ってテキストをラップする単純な関数です。それは必要なだけ多くの行に をラップしますが、$ angleはゼロでなければなりません。 $ widthパラメータは画像の幅です。

function wrap($fontSize, $angle, $fontFace, $string, $width) 
{ 
    $ret = ""; 
    $arr = explode(' ', $string); 
    foreach ($arr as $word) 
    { 
    $teststring = $ret.' '.$word; 
    $testbox = imagettfbbox($fontSize, $angle, $fontFace, $teststring); 
    if ($testbox[2] > $width){ 
     $ret.=($ret==""?"":"\n").$word; 
    } else { 
     $ret.=($ret==""?"":' ').$word; 
    } 
    } 
    return $ret; 
} 
+0

問題は、それが画像自体に整列中心ていない、である、それはテキストの他の行に対して整列中心です。すなわち、画像は500pxなど広いかもしれない、テキストの左側は100pxにすることができ、テキストの幅が150ピクセルであると2行を有し、テキスト自体で整列中心でなければならない可能性があります。 –

+0

はその後、私はあなたがすでに述べたように、あなたがラインimagettftext_cr()で行をする必要があります推測するつもりです。 http://php.net/manual/en/function.imagettftext。php "sk89q"の投稿を2008年3月14日に検索03:36 – Scuzzy

+0

ええ、私はまだ必要なものではありません。それはクールだ、私は関数を書くことができます、私はちょうど誰かがショートカットを持っていることを望んでいた –

-1

ストリング(STRLEN)の長さを取得し、各文字の平均幅、平均幅によってSTRLEN結果を乗算してから水平位置からそれを引きます。

$text="center this"; 
$h=50; 
$h=(strlen($text)*15)-$h; 

それは私がこの

+0

それは、私がやろうとしていることに対してそれを本当にカットするつもりはありません。しかし、ありがとう。 –

1

を試したことがないので、あなたが優れたgd-textライブラリを使用することができます動作するかどうかを教えてください。 あなたが作曲を使用している場合、この例では、これは次のようになります。

<?php 
require __DIR__.'/../vendor/autoload.php'; 

use GDText\Box; 

$im = imagecreatetruecolor(500, 500); 
$backgroundColor = imagecolorallocate($im, 0, 18, 64); 
imagefill($im, 0, 0, $backgroundColor); 

$box = new Box($im); 
$box->setFontFace(__DIR__.'/Pacifico.ttf'); // http://www.dafont.com/pacifico.font 
$box->setFontSize(80); 
$box->setFontColor([255, 255, 255]); 
$box->setTextShadow([0, 0, 0, 50], 0, -2); 
$box->setLeading(0.7); 
$box->setBox(20, 20, 460, 460); 
$box->setTextAlign('center', 'center'); 
$box->draw("Pacifico"); 

header("Content-type: image/png"); 
imagepng($im); 
4

あなたはstil/gd-textクラスを使用することができます。免責事項:私は著者です。

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

$img = imagecreatefromjpeg('image.jpg'); 

$textbox = new Box($img); 
$textbox->setFontSize(12); 
$textbox->setFontFace('arial.ttf'); 
$textbox->setFontColor(new Color(0, 0, 0)); 
$textbox->setBox(
    50, // distance from left edge 
    50, // distance from top edge 
    200, // textbox width 
    100 // textbox height 
); 

// now we have to align the text horizontally and vertically inside the textbox 
$textbox->setTextAlign('center', 'top'); 
// it accepts multiline text 
$textbox->draw("This is\na string of text"); 

デモンストレーション:

demo

+0

コードをダウンロードしました。それは完璧に動作しますが、多くの人がそれを使用していない理由の1つは、多くの依存関係があり、ダウンロードしているからです!ボックスを配置するシステムは、クライアントと私のプラタフォームのサーバーよりも重いです。あなたが何らかの理由で/ vendor /のコンテンツなしで動作させることができれば、スタンドアローンのメソッドや関数のようにもっとうまくいくでしょう。 –