ImageMagickを用いて画像処理[PHP]

間取り図のテキストを日本語から英語に一括で変更するために、画像にテキスト画像を上書きする作業を現在しています。 PHPで画像処理を行うツールにImageMagickという画像処理ツールがあり、PHPで利用することができます。 ImageMagickのインストール等が情報が沢山存在しているので、取捨選択に苦労するのですが、レンタルサーバーの種類によっては最初から機能として追加されているものもあるようです。 実際にPHPファイルで実行できるか確認できるコードを以下のリンクで上げている方がいました。

【ImageMagick】PHPでイメージマジック(imagick)が使用可能かさくっと調べるスクリプト

以下のコードを実行することでImageMagickが利用できるか確認できます。

<?php

//テスト出力用コード
function imagickTest(){

    if (!extension_loaded('imagick')){
        echo 'imagick not installed :(';
        exit;
    }


    $canvas = new Imagick();

    $canvas->newImage(256, 128, "light green");

    //外側の黒枠線
    $canvas->borderImage('black', 1, 1);

    //文字記入
    $draw = new ImagickDraw();
    $draw->setFontSize(16);
    $draw->setGravity(Imagick::GRAVITY_CENTER);
    $draw->annotation(0, 0, 'imagick inside :)');
    $canvas->drawImage($draw);

    $canvas->setImageFormat('jpg');

    //画像を出力
    header("Content-Type: image/jpg");
    echo $canvas;

    $canvas->destroy();
}

//実行
imagickTest();

?>

ImageMagickが入っていることが確認できたら、画像処理は以下のコードを実行することで行うことができます。 以下のコードはテキストを画像化する処理です。

<?php
    $image = new Imagick();
    $draw = new ImagickDraw();
    $pixel = new ImagickPixel( 'white' );

    /* 画像を作成します */
    $image->newImage(800, 75, $pixel);

    /* 黒いテキスト */
    $draw->setFillColor('black');

    /* フォントのプロパティ */
    $draw->setFont('Bookman-DemiItalic');
    $draw->setFontSize( 30 );

    /* テキストの作成 */
    $image->annotateImage($draw, 10, 45, 0, "Sample Text");

    /* 画像形式の設定 */
    $image->setImageFormat('png');

    /* ヘッダをつけて画像の出力 */
    header('Content-type: image/png');
    echo $image;
?>

また、以下のコードで画像を取得し、表示させることができます。

<?php
    $draw = new ImagickDraw();
    $pixel = new ImagickPixel( 'white' );

    $file_path = "表示させたい画像のパス(URL)"
    $image = new Imagick($file_path);

    /* 黒いテキスト */
    $draw->setFillColor('black');

    /* フォントのプロパティ */
    $draw->setFont('Bookman-DemiItalic');
    $draw->setFontSize( 30 );

    /* テキストの作成 */
    $image->annotateImage($draw, 10, 45, 0, "Sample Text");

    /* 画像形式の設定 */
    $image->setImageFormat('png');

    /* ヘッダをつけて画像の出力 */
    header('Content-type: image/png');
    echo $image;
?>

これらにより、テキストの画像と、もとの画像を取得できたので、後はテキストの画像をもとの画像に上書きをすることで、間取り図のテキストを日本語から英語に変換することができるようになります。 2つの画像の合成は以下のリンクで紹介していました。 PHPのImagickを使って合成画像を作ってみる

<?php
// ベース画像の読み込み
$imgBase = new Imagick("ベース画像ファイルへのパス");

// フレーム画像の読み込み
$imgFrame = new Imagick("フレーム画像ファイルへのパス");

// 合成
// 3,4番目の引数は、ベース画像の左上を0として、
// フレーム画像の左上をベース画像のどの位置に置くかを指定します。
// 今回は、写真に対する縁なので、両方0です。
$imgBase->compositeImage($imgFrame, $imgFrame->getImageCompose(), 0, 0);

// 合成した画像をファイルとして出力
$imgBase->writeImages("画像ファイルの出力先パス", TRUE);

これらの技術を利用することで間取り図の英語化を行うことができました。 以下に自分が今回作成したコード例を載せておきます。

function getTextImage($text){
    $textImage = new Imagick();
    $draw = new ImagickDraw();
    $pixel = new ImagickPixel( 'white' );
    $filePath = "https://bayan.jp/wp-content/uploads/2017/01/57c210e337688cb33332657a1e4964b8.jpg";

    $baseImage = new Imagick( $filePath );

    /* 画像を作成します */
    $textImage->newImage(800, 75, $pixel);

    /* 黒いテキスト */
    $draw->setFillColor('black');

    /* フォントのプロパティ */
    $draw->setFont('Bookman-DemiItalic');
    $draw->setFontSize( 30 );

    /* テキストの作成 */
    $textImage->annotateImage($draw, 10, 45, 0, $text);

    /* テキストの上書き(3,4番目の引数で上書きする座標の指定) */
    $baseImage ->compositeImage($textImage, $textImage->getImageCompose(), 0, 0);

    /* 画像形式の設定 */
    $baseImage->setImageFormat('png');

    /* ヘッダをつけて画像の出力 */
    header('Content-type: image/png');
    // echo $textImage;
    echo $baseImage;
}