【PHP】imagettftextで自動で改行させるスクリプト

PHPでテキストを画像に書き出すimagettftextですが、 そのままでは改行が出来ないのが不便でした。 そこで改行させるスクリプトを何とか書いてみました。 仕組みは、テキストボックスの幅や高さを取得するimagettfbboxを使い、 文を一字ずつ増やしながら幅を取得し、それが指定の幅まできたら 下にもう一つテキストボックスを追加してまた一字ずつ追加して・・・を繰り返します。 実行サンプル ソースコード http://17sai.jp/sample/linebreak.txt サンプルはフォントの箇所だけ自分で用意したフォントのパスに変えてください。 上のサンプルではフリーの毛筆フォント、青柳衡山毛筆フォントを使用させていただいています。 汚いソースなので、好きに改造してください。 なんかバグや改善点があれば教えてください。
< ?php
//imagettftextで自動で改行させるサンプルです。ろっく(http://petitec.17sai.jp/)091114

$im = imagecreatetruecolor(500, 300);// 画像を作成
$black = imagecolorallocate($im, 30, 30, 30);//色指定
$white = imagecolorallocate($im, 250, 250, 250);
imagefilledrectangle($im, 0, 0, 500, 300, $white);// 背景を白に

$font = 'AoyagiKouzanFont2.ttf';// フォントファイルへのパス
$text ='吾輩(わがはい)は猫である。名前はまだ無い。どこで生れたかとんと見当(けんとう)がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪(どうあく)な種族であったそうだ。この書生というのは時々我々を捕(つかま)えて煮(に)て食うという話である。';
//使用するテキスト
$FontSize=16;//フォントサイズ
$Rotation=0;//角度 90以上にすると幅が増えず、whileから抜け出せなくなるので注意
$XPositon=10;//開始x座標
$YPositon=0;//開始y座標
$LineMax=15;//行の最大値
$LineHeight=32;//行の高さ
$MaxWidth=500-$FontSize*2-$XPositon;//テキストの最大幅(px)フォントによる誤差が大きいので調整が必要
$InitialLeng=7;//文字数の初期値。大きいほどwhileループが少なくて済むが、大きすぎるとはみ出る。
for ($i=0; $i<$LineMax; $i++)
{
	$textwidth[$i]=0;
	$text_leng[$i]=$InitialLeng;
	$cut_text[$i]=mb_substr($text, 0, $text_leng[$i]);
	
	//行の幅が$MaxWidthを超えるまで一字ずつ増やしていく
	while ($textwidth[$i]<$MaxWidth)
	{
		$TextPositon[$i]=0;
		for ($o=0; $o<$i; $o++)
		{
			$TextPositon[$i]+=$text_leng[$o];
		}
		if (mb_strlen($text)>$TextPositon[$i]+$text_leng[$i]-$i)
		{//最後まで文を切り分けたらbreak
			$text_leng[$i]++;
			$cut_text[$i]=mb_substr($text, $TextPositon[$i], $text_leng[$i]);
			$bbox[$i] = imagettfbbox($FontSize, $Rotation, $font, $cut_text[$i]);
			$textwidth[$i] =$bbox[$i][2];//テキストボックスの右下の座標を取得
		}
		else
		{
			break 2;
		}
	}
}
for ($p=0; $p

ソースコード貼り付けるとWordpressの校正機能が無駄に働いてちょっとうざい。
Posted in PHP by admin at 11月 14th, 2009.

Leave a Reply