评论: Sohel Taslim (03-Aug-2007 06:19)
感谢您提供的函数,我修改了一点。在新版本中,行之间具有相等的间距(您示例中的 g 会在行之间创建更大的间距)- 由参数 '$Leading' 设置。
我使用了 for 循环以获得更好的性能,并稍微精简了其余部分 :)
/**
* @name : makeImageF
*
* 使用选定字体从文本创建图像的函数。在图像中对齐文本(0-左,1-右,2-居中)。
*
* @param String $text : 要转换为图像的字符串。
* @param String $font : 文本的字体名称。将字体文件保存在同一个文件夹中。
* @param int $Justify : 在图像中对齐文本(0-左,1-右,2-居中)。
* @param int $Leading : 行间距。
* @param int $W : 图像的宽度。
* @param int $H : 图像的高度。
* @param int $X : 文本在图像中的 x 坐标。
* @param int $Y : 文本在图像中的 y 坐标。
* @param int $fsize : 文本的字体大小。
* @param array $color : 文本颜色的 RGB 颜色数组。
* @param array $bgcolor : 背景的 RGB 颜色数组。
*
*/
function imagettfJustifytext($text, $font="CENTURY.TTF", $Justify=2, $Leading=0, $W=0, $H=0, $X=0, $Y=0, $fsize=12, $color=array(0x0,0x0,0x0), $bgcolor=array(0xFF,0xFF,0xFF)){
$angle = 0;
$_bx = imageTTFBbox($fsize,0,$font,$text);
$s = split("[\n]+", $text); // 行数组
$nL = count($s); // 行数
$W = ($W==0)?abs($_bx[2]-$_bx[0]):$W; // 如果宽度没有被程序员初始化,那么它将检测并分配完美的宽度。
$H = ($H==0)?abs($_bx[5]-$_bx[3])+($nL>1?($nL*$Leading):0):$H; // 如果高度没有被程序员初始化,那么它将检测并分配完美的高度。
$im = @imagecreate($W, $H)
or die("无法初始化新的 GD 图像流");
$background_color = imagecolorallocate($im, $bgcolor[0], $bgcolor[1], $bgcolor[2]); // RGB 颜色背景。
$text_color = imagecolorallocate($im, $color[0], $color[1], $color[2]); // RGB 颜色文本。
if ($Justify == 0){ // 左对齐
imagettftext($im, $fsize, $angle, $X, $fsize, $text_color, $font, $text);
} else {
// 创建包含所有国际字符(大写和小写)的字母数字字符串
$alpha = range("a", "z");
$alpha = $alpha.strtoupper($alpha).range(0, 9);
// 使用该字符串来确定一行的高度
$_b = imageTTFBbox($fsize,0,$font,$alpha);
$_H = abs($_b[5]-$_b[3]);
$__H=0;
for ($i=0; $i<$nL; $i++) {
$_b = imageTTFBbox($fsize,0,$font,$s[$i]);
$_W = abs($_b[2]-$_b[0]);
// 定义 X 坐标。
if ($Justify == 1) $_X = $W-$_W; // 右对齐
else $_X = abs($W/2)-abs($_W/2); // 居中对齐
// 定义 Y 坐标。
$__H += $_H;
imagettftext($im, $fsize, $angle, $_X, $__H, $text_color, $font, $s[$i]);
$__H += $Leading;
}
}
return $im;
}