SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

目的に応じて適材適所で使うPHPライブラリ

PHPで簡易デコメール/簡易アバター画像生成システムを作る

目的に応じて適材適所で使うPHPライブラリ(2)

ブラウザから文字列オブジェクトを指定して画像に文字を描画する

 ブラウザから文字列、フォント、色、サイズ、位置を指定して画像に文字列を描画する簡易デコメール作成システム的なサンプルを作成します。

 本サンプルは変数を定義するconfig.php、入力フォームを出力するinput.php、画像を出力するimage.phpの3つのファイルで構成されています。

 携帯電話での実行を想定しておりますので入力フォームの表示はSJIS、画像出力部分はUTF-8の文字コードで作成します。

入力フォームの作成

 config.phpで定義した変数をinput.phpのformに展開しています。

 config.phpでは次のように配列でセレクトボックスに表示すべき値とテキストを連想配列の形式で定義しています。

[リスト6]config.php(抜粋)
// 横位置
$x_array = array(
                    "0"=>"0",
                    "10"=>"→10",
                    "20"=>"→20",
# 省略
                );

 input.phpの入力フォーム生成部分ではPOSTされた変数をプリセットする形でセレクトボックスを出力しています。

[リスト7]input.php(抜粋)
横位置
<select name="x">
<?php
foreach($x_array as $k=>$v){
?>
<option value="<?php echo $k; ?>" <?php if($k==$_POST['x']){ ?>selected<?php } ?>><?php echo $v; ?></option>
<?php
}
?>
</select>

画像出力部分

 フォームで受け取ったパラメーターをクエリとしてimage.phpに渡します。その際の文字コードをUTF-8に変換してクエリを生成します。

[リスト8]input.php(抜粋)
// POSTされた変数の値の文字コードをUTF-8に変換する
mb_convert_variables('UTF-8', 'SJIS', $_POST);

// image.phpに渡す際にURLエンコードする
?>
<img src="image.php?<?php echo http_build_query($_POST); ?>" />

 image.php内ではImagickDrawクラスを使って文字列を画像に描画します。

 クエリより変数を取得してImagickDrawクラスの各メソッドに渡して文字列オブジェクトを生成します。

画像描画部分

 クエリで指定されたパラメーターに合わせて画像に文字を描画します。

[リスト9]image.php(抜粋)
// 文字列取得
$text    = $_GET['text'];
// 文字サイズ取得
$size   = $_GET['size'];
// 横位置取得
$x   = $_GET['x'];
// 縦位置取得
$y   = $_GET['y'];
// 文字色取得
$colors   = explode('-',$_GET['color']);
// フォント取得
$font   = $_GET['font'];

// Imagickクラスを生成し、画像を読込み
$im = new Imagick();
$im->readImage("images/lake.jpg");
$canvas = $im->coalesceImages();

// ImagickDrawクラスを生成
$idraw = new ImagickDraw();

if($text){
    // フォントのセット
    $idraw->setFont('font/'.$font);
    // フォントサイズのセット
    $idraw->setFontSize($size);
    // フォントカラーのセット
    $idraw->setFillColor($colors[0]);
    $idraw->setStrokeColor($colors[1]);
    $idraw->setStrokeWidth(1);
    // 画像に描画
    $canvas->annotateImage($idraw, $x, $y, 0, $text);
}

// 画像出力
$canvas->setImageFormat("jpg");
$canvas->thumbnailImage(240,0);
$canvas->setCompressionQuality(80);
Header("Content-Type: image/jpg");
echo $canvas;

 Imagickを利用すると、上記のようにフォームから送信された変数に応じて動的に画像を出力させるアプリケーションを比較的容易に作成できます。

次のページ
画像の合成

この記事は参考になりましたか?

目的に応じて適材適所で使うPHPライブラリ連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4661 2010/01/07 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー