こんにちは。
PHPマニュアルを見てみましたが、直接縦書きに指定できるものは無さそうなので
簡単にですが作ってみました。
//====================================================================
// 基本設定項目
//====================================================================
// 画像サイズ
define ( IMGWID, 400 );
define ( IMGHEI, 300 );
// 使用するフォント名
define ( FONTTYPE, 'HGRSMP' );
// フォントサイズ
define ( FONTSIZE, 30 );
// 開始x座標
define ( START_X, 300 );
// 開始y座標
define ( START_Y, 40 );
// 横方向マージン
define ( MARGIN_X, 10 );
// 縦方向マージン
define ( MARGIN_Y, 20 );
// 改行文字数
define ( RETURN_LEN, 2 );
// 方向(true:右から左 false:左から右)
define ( DIRECTION, true );
//====================================================================
// ここより実行部
//====================================================================
// 表示する文字列
$txt = "春夏秋冬";
// 生成画像
$img = imagecreatetruecolor ( IMGWID, IMGHEI );
// 背景色
$bgc = ImageColorAllocate ( $img, 255, 255, 255 );
$frc = ImageColorAllocate ( $img, 0, 0, 0 );
// 背景色を白で塗りつぶし
ImageFilledRectangle ( $img, 0, 0, IMGWID, IMGHEI, $bgc );
// フォントパスの設定
putenv ( 'GDFONTPATH='.realpath('.') );
$x = START_X;
$y = START_Y;
if ( DIRECTION ) {
$direction = -1;
} else {
$direction = 1;
}
// 文字数分のループを実行
for ( $i = 0; $i < mb_strlen($txt); $i ++ ) {
// 環境ごとに違うかも?
// 文字を1文字ずつ取り出し、コンバートを実行
$str = mb_convert_encoding(mb_substr($txt,$i,1), "UTF-8", "auto" );
// X座標を算出
// 最初以外の改行数分のループ処理の時にx座標を計算する
if ( ($i != 0) && ($i % RETURN_LEN == 0) ) {
// 方向値を使用して減算か加算を行う
$x += (FONTSIZE+MARGIN_X)*$direction;
}
// Y座標を算出
// 改行文字の時は初期y座標
// 改行しない時はフォントサイズとマージンを加算
if ( $i % RETURN_LEN == 0) {
$y = START_Y;
} else {
$y += FONTSIZE+MARGIN_Y;
}
// 文字を書き出し
ImageTTFText ( $img, FONTSIZE, 0, $x, $y , $frc, FONTTYPE, $str );
}
header ( "Content-type: image/png" );
ImagePng ( $img );
ImageDestroy ( $img );
$txtに入った文字を基本設定で行った数値で縦書きにし、
かつ、指定文字にて次の行に改行処理を行っています。
DIRECTIONをfalse設定することで逆の縦書きも出来ます(使わないと思いますが・・)
基本設定のフォント名やフォントサイズ、開始座標なんかは私のテスト環境で使った数値なのでいろいろいじってみてください。
改行文字数に関しては、指定した数値まで縦に書きます。
(2なら2文字書いて、次の文字から次の行へ)
$txtに入ってくる文字が"春夏秋冬"とか決まっているのならこんな処理はいりません。
ようは1文字ずつに分解して値を調整しつつ4回ImageTTFTextを実行すれば
いろいろな配置ができます。