我正在尝试在图像上打印多行文本并居中对齐它们。
即
这是一串文字
现在,我只有整个字符串的左侧位置。什么快捷方式让它工作?我认为它可能必须是整个字符串上的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都是一个数组,其中包含有关打印方式和内容的一些信息。 希望有所帮助。
答案 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");
演示:
答案 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;
告诉我它是否有效,因为我从未尝试过这个