1

文字列を文字列の画像に変換するためにimagettftextandを使用しています。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;ています。行を削除してみましたが、役に立ちます。これで、最後のビットだけが切り取られます。(下の画像を参照)

img2

4

1 に答える 1

2

によって返される寸法に基づいて関数の開始時に画像が作成されimagettfbbox()ますが、ループの最後に をforeach介して +6 の「行間」を追加します$__H += 6;。これにより、縦方向のテキスト サイズが最初に測定された寸法を超えて大きくなります。

その行を削除して、テキストが画像に収まるようになったことを確認することで、これをテストできます。

追加の行間隔を含めたい場合は、関数の開始時に変数を作成し、返された寸法imagettfbbox()と行間隔の値に行数を掛けた値に基づいて画像を作成する必要があります。


関数を次のように書き直しました。

function imagettftextalign($text, $align = 0, $fsize = 12, $color = array(0x0, 0x0, 0x0), $bgcolor = array(0xFF, 0xFF, 0xFF), $font = './font/Roboto-Light.ttf', $angle = 0)
{
    // measure input text.
    $box = imagettfbbox($fsize, $angle, $font, $text);
    $w = abs($box[2] - $box[0]);
    $h = abs($box[5] - $box[3]);

    // create resources.
    $im = imagecreatetruecolor($w, $h);
    $background_color = imagecolorallocate($im, $bgcolor[0], $bgcolor[1], $bgcolor[2]);
    $text_color = imagecolorallocate($im, $color[0], $color[1], $color[2]);

    // set background.
    imagefilledrectangle($im, 0, 0, $w, $h, $background_color);

    // split text by line and get line height.
    $lines = explode("\n", $text);
    $lh = floor($h / count($lines));

    // output lines.
    $y = ($lh * .8); // note: this is a guesstimate at the font baseline!
    foreach ($lines as $line) {
        if ($align > 0) {
            $box = imagettfbbox($fsize, $angle, $font, $line);
            $lw = abs($box[2] - $box[0]); // line width.
            switch ($align) {
                case 1: // centre.
                    $x = ($w / 2) - ($lw / 2);
                    break;
                case 2: // right.
                    $x = $w - $lw;
                    break;
            }
        } else {
            $x = 0;
        }

        imagettftext($im, $fsize, $angle, $x, $y, $text_color, $font, $line);
        $y += $lh; // increment line y position.
    }

    return $im;
}

$txt = "This planet has — or rather had — a problem, which
was this: most of the people living on it were unhappy
for pretty much all of the time. Many solutions were
suggested for this problem, but most of these were
largely concerned with the movement of small green
pieces of paper, which was odd because on the whole
it wasn't the small green pieces of paper that were
unhappy.";

$im = imagettftextalign($txt, 1);

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

これにより、次の出力が得られます。これは、あなたが目指しているもののようです。

関数出力の例

于 2014-11-16T09:43:13.303 に答える