中心使用GD和PHP对齐多行文本

时间:2012-03-15 21:35:34

标签: php gd

我正在尝试在图像上打印多行文本并居中对齐它们。

这是一串文字

现在,我只有整个字符串的左侧位置。什么快捷方式让它工作?我认为它可能必须是整个字符串上的getttfbox,然后线上的爆炸中断,然后将新文本集中在更大的ttfbox中。这对屁股来说很痛苦......

编辑:想出一个解决方案:

    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;

在这种情况下,每个$ string都是一个数组,其中包含有关打印方式和内容的一些信息。 希望有所帮助。

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这是一个将使用你提到的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;
}

答案 2 :(得分: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);

答案 3 :(得分:0)

This is my code which works:

function textWithImage($text){  
                $imagePath="/images/fb-share-bg.jpg";
                $im = imagecreatefromjpeg($imagePath);
                $txtColor = imageColorAllocate($im, 255, 255, 255);  
                $font="/fonts/OpenSans-Bold.ttf";
                $description=$text;
                $in =  wordwrap($description,50,"|",true);
                $st = explode("|",$in);
                //$inStrArr=str_split($description,60);
                $inStrArr=$st;
                $addOnYVal=0;
                foreach($inStrArr as $key=>$value){
                    if($key!=0){
                        $addOnYVal+=40;
                    }
                    list($x, $y) = pc_ImageTTFCenter($im, $value, $font, 20,$addOnYVal);
                    ImageTTFText($im,20,0, $x, $y, $txtColor, $font, $value);
                }

               $newImagename="/uploads/".$img;
               imagejpeg($im, $newImagename,100);

} // Enf of textWithImage function



function pc_ImageTTFCenter($image, $text, $font, $size, $addOnYVal) {
    // find the size of the image
    $xi = ImageSX($image);
    $yi = ImageSY($image);

    // find the size of the text
    $box = ImageTTFBBox($size, $angle, $font, $text);

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

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

    return array($x, $y);
}

// Calling function
$text = "This is to center alignn the text on image";

textWithImage($text);

//  Output: Image will be saved in the upload folder

答案 4 :(得分:-1)

获取字符串的长度(strlen),以及每个字母的平均宽度,将strlen结果乘以平均宽度,然后从水平位置中减去该值。

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

告诉我它是否有效,因为我从未尝试过这个