ImageMagickを使ってPHPで画像にテキストを追加、生成する方法(さくらインターネット編)

お仕事でサーバーで画像を生成することが合ったのでまとめておきます。

お客様サーバーはさくらレンタルサーバーでしたので、PHPにて画像を生成するようにしております。

今回の場合、既存のPDF(をJPEGに加工し)をサーバーにアップしておき、フォームに入力されたテキストをそのPDFに配置してサーバーに保存する形を想定しています

画像をサーバー生成したり修正できるImageMagickを使えるようにする

さくらインターネットのサーバーでは、ImageMagickが標準設定では使えないようです。

ただ、サーバーコントロールパネルで以下の手順で使用できるようになります。

PHP設定ファイルの編集

画面に行き

php.iniファイルパスの欄に

extension=imagick.so

で保存しましょう

さっそく、ImageMagickを使ってみる

$aaa = new Imagick();

これを実行しますが、ImageMagickが入っていないとエラーが出ていま下が、白いページが表示されれば追加されていることがわかります。

次に簡単なサンプルで動作を見てみましょう

<?php
    $base = new Imagick();
    $base->newImage(320, 200, 'none');

    $text = new ImagickDraw();

    $text->setFillColor('white');

    $base->annotateImage($text, 10, 60, 0, 'Hello World');

    $base->setImageFormat('png');

    header('Content-type: image/png');
    echo $base;
?>

これだけです

とりあえず、画像の生成ができました。

画像を読み込んでそれに書く

前のサンプルは、新しい画像の上にテキストで文字を書いただけなので、今度はテンプレートになる欄が開いている用紙のJPGを解像度72dpiとして、595×841(本来は、842かもしれません)を用意してそれを読み込みます。

<?php

$filePath = "baseimg.jpg";


// 画像の読み込み
$base = new Imagick( $filePath );

//$back = new Imagick();
//$back->newImage(595, 841, 'none');

$draw = new ImagickDraw();
$draw->setFontSize(50);
//$draw->setFillColor('white');

$base->annotateImage($draw, 10, 140, 0, 'Hello World');

$base->setImageFormat('png');



// 画像へ文字列を合成!

$base->writeImage("./test.png");
// お掃除
//$back->destroy();




header('Content-type: image/png');
echo $base;
?>

背景になる画像を読み込んだ時点でサイズもそのサイズが設定されるようです

日本語の表示

デフォルトの状態だと、日本語を書き出そうとすると「???」という表示になってしまうので、フォントの指定をしてあげる必要があります。

$draw->setFont('old.otf');

日本語フォントであれば、ttfでも、otfでも大丈夫のようです。

今は、フリーの日本語フォントも豊富なので、お好きなものを使えますが、1つしか設定できないようなので、注意が必要です。

私はこちらを使用してみました。

テキスト配置の位置を決める

あとは、テキスト分書き出してあげればいいです

$base->annotateImage($draw, 10, 140, 0, 'ハロー わーるど');
$base->annotateImage($draw, 100, 240, 10, 'world');

まとめ

最終的なコードは、こちら

<?php

$filePath = "baseimg.jpg";

$base = new Imagick( $filePath );

$draw = new ImagickDraw();
$draw->setFont('old.otf');
$draw->setFontSize(50);
$draw->setFillColor('white');

$base->annotateImage($draw, 10, 140, 0, 'ハロー わーるど');
$base->annotateImage($draw, 100, 240, 10, 'world');

$base->setImageFormat('jpg');

$base->writeImage("./test.jpg");

header('Content-type: image/png');
echo $base;
?>

この記事を書いた人