画像へのテキスト出力の組版問題
画像上にボックスが与えられた場合 (4 点の座標がわかっている)、テキストの文字列を N 行に分割し、各行を画像に出力する必要があります。 N 行の幅と高さの合計がボックスを超えることはできません。合計の高さがボックスの高さを超える場合は、テキストがボックス内に収まるまでフォント サイズを小さくします。
現在の状況:
英単語の分割は考慮されていません
mb_strlen と mb_substr を使用して長さを取得し、文字列をインターセプトします
imagettfbbox はテキストの幅と高さを計算し、imagettftext はテキストを画像に出力します
問題:
これで、再帰を使用して、固定フォント サイズで適切な幅の画像を出力できるようになりました。
しかし、最終的な高さが超えた場合、フォント サイズを小さくして再度実行するにはどうすればよいでしょうか?メソッドを使用したい場合は、それを実行してください。
-----ソリューションのアイデア----------------------
フォントサイズの計算がうまくいきません。
実はこんなこともあるのです。
最初にすべての単語を画像 A に生成し、次に B をベース画像として使用し、次に A を B に収まるように縮小します。
------解決策----------------------
等幅フォントを使用する
すべては計算可能です
-----解決策のアイデア----------------------
わかりませんどのように書いたかわかります (なぜ再帰を使用するのですか?)
$font = 'c:/windows/fonts/simsun.ttf';<br />$text = iconv('gbk', 'utf-8', '图片上给定一个方框(知道4点坐标),需要把一串文本分成N行输出到图片上,每行文字不能超过方框的宽度,N行总高度也不能超过方框。如果总高度会超过方框高度,则缩小字体,直至文字能全部显示在方框中。');<br /><br />$im = imagecreate(200, 200);<br />$bg = imagecolorallocate($im, 255, 255, 255);<br />$pen = imagecolorallocate($im, 0, 0, 0);<br />$style = array( $pen, $pen, $bg, $bg, $pen );<br />imagesetstyle($im, $style);<br />iconv_set_encoding("internal_encoding", "UTF-8"); //我偏好 iconv,用 mb 也是一样的<br /><br />$sx = 20;<br />$sy = 20;<br />$ex = 180;<br />$ey = 180;<br />$h = 30; //行高<br />$loop = true;<br />while($loop) {<br /> $size = $h / 3 * 2; //字体大小<br /> $s = '';<br /> $r = 1;<br /> imagefilledrectangle($im, $sx, $sy, $ex, $ey, $bg);<br /> imagerectangle($im, $sx, $sy, $ex, $ey, IMG_COLOR_STYLED);<br /><br /> for($i=0; $i<iconv_strlen($text); $i++) {<br /> $c = iconv_substr($text, $i, 1);<br /> $box = ImageTTFBBox($size, 0, $font, $s.$c);<br /> if($box[2] - $box[0] < $ex - $sx) $s .= $c;<br /> else {<br /> if($h*$r > $ey - $sy) break;<br /> imagettftext($im, $size, 0, $box[0]+$sx, $sy+$h*$r, $pen, $font, $s);<br /> $s = '';<br /> $r++;<br /> $i--;<br /> }<br /> }<br /> if($s) {<br /> if($h*$r > $ey - $sy) {<br /> $h--;<br /> continue;<br /> }<br /> $loop = false;<br /> imagettftext($im, $size, 0, $box[0]+$sx, $sy+$h*$r, $pen, $font, $s);<br /> }<br />}<br />imagettftext($im, $size, 0, $sx, $ey+$h, $pen, $font, "size:$size");<br /><br />imagegif($im);