文字列を文字列の画像に変換するためにimagettftext
andを使用しています。imageTTFBbox
たとえば、次の文字列
この惑星には問題がありました。というか、問題がありました。それは、この惑星に住んでいるほとんどの人が、ほぼ常に不幸だったということです。この問題に対して多くの解決策が提案されましたが、それらのほとんどは主に小さな緑色の紙片の動きに関係していました。これは奇妙なことでした。
になる
ただし、最後の行ほどはカットされています。
私のセットアップは、テキストをラップするラッパー関数 (完全に正常に動作) と、以下に示すメインの img2Text 関数で構成されています。
function imagettfJustifytext($text, $font="../../fonts/Roboto-Light.ttf", $Justify=2, $W=0, $H=0, $X=0, $Y=0, $fsize=12, $color=array(0x0,0x0,0x0), $bgcolor=array(0xFF,0xFF,0xFF)){
$angle = 0;
$L_R_C = $Justify;
$_bx = imageTTFBbox($fsize,0,$font,$text);
$W = ($W==0)?abs($_bx[2]-$_bx[0]):$W;
$H = ($H==0)?abs($_bx[5]-$_bx[3]):$H;
$im = @imagecreate($W, $H)
or die("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate($im, $bgcolor[0], $bgcolor[1], $bgcolor[2]);
$text_color = imagecolorallocate($im, $color[0], $color[1], $color[2]);
if($L_R_C == 0){ //Justify Left
imagettftext($im, $fsize, $angle, $X, $fsize, $text_color, $font, $text);
} elseif ($L_R_C == 1) { //Justify Right
$s = split("[\n]+", $text);
$__H=0;
foreach($s as $key=>$val){
$_b = imageTTFBbox($fsize,0,$font,$val);
$_W = abs($_b[2]-$_b[0]);
$_X = $W-$_W;
$_H = abs($_b[5]-$_b[3]);
$__H += $_H;
imagettftext($im, $fsize, $angle, $_X, $__H, $text_color, $font, $val);
$__H += 6;
}
} elseif ($L_R_C == 2) { //Justify Center
$s = split("[\n]+", $text);
$__H=0;
foreach($s as $key=>$val){
$_b = imageTTFBbox($fsize,0,$font,$val);
$_W = abs($_b[2]-$_b[0]);
$_X = abs($W/2)-abs($_W/2);
$_H = abs($_b[5]-$_b[3]);
$__H += $_H;
imagettftext($im, $fsize, $angle, $_X, $__H, $text_color, $font, $val);
$__H += 6;
}
}
return $im;
}
問題は imageTTFBox 組み込み関数、または画像の高さを計算するための使用法にあると思います。テキストの文字列が長いと、高さを過小評価しているようです。関連するコード行は ですline 6
。便宜上、以下に再掲します。
$H = ($H==0)?abs($_bx[5]-$_bx[3]):$H;
参考のため:
$_bx = imageTTFBbox($fsize,0,$font,$text);
および未開始のimageTTFBboxの場合:
array imagettfbbox ( float $size , float $angle , string $fontfile , string $text )
この関数は、TrueType テキストの境界ボックスをピクセル単位で計算して返します。
編集
timcluttonの答えは理にかなっ$__H += 6;
ています。行を削除してみましたが、役に立ちます。これで、最後のビットだけが切り取られます。(下の画像を参照)