ホームページ  >  記事  >  バックエンド開発  >  画像へのテキスト出力のフォーマットに関する問題

画像へのテキスト出力のフォーマットに関する問題

WBOY
WBOYオリジナル
2016-06-13 12:16:381154ブラウズ

画像へのテキスト出力の組版問題

画像上にボックスが与えられた場合 (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);

このように計算して描画するよりも、計算して描画した方が良いです (背景画像があると難しいです)
------解決策のアイデア----------------------
問題を完璧に解決する唯一の方法は、あなたの指示に従うことですこの方法はアイデアを提供するために行われたものです
が、あまり完璧ではないかもしれませんが、よろしければ試してみてください
1. ボックスの面積を 30*10= と仮定して計算します。 300
2. 単語数を 16 単語として合計を計算します
3. 単語数の合計を面積で割り切れる値に増やし、300 として割り切れる値を求めます。 /20=15
4. 割り切れる値の平方根を計算し、15 の平方根を 3
5 と仮定して、平方根の後の値をフォントのサイズ6. 仮説を検証します: 30/3 は 1 行に 10 ワード、2 行に 16 ワードは問題ありません。サイズを 4、1 行に 7 ワード、3 行が必要ですが、4*3=12>10
を超えます。笑、方法は上記のとおりです。一般的なアイデアにすぎませんが、多くの問題があるはずです。参考までに

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。