jpg画像にテキストを入れるには

フォトフレームに大量のjpg画像を入れているのだが、画像が表示されるだけでタイムスタンプなどのメタ情報が一切表示されないので、フォトフレームを見ただけではいつの写真だかわからないものが多い。

ローカルで管理しているjpgのファイル名は撮影日時を元にした YYYYMMDDhhmmssの14桁の数字になっているので、とりあえずファイル名をそのまま画像に直接書き出しておけば、画像だけを表示しているフォトフレームでも撮影日時がわかるようになる。

フォトフレームに入れたい画像が5000枚以上あるので、手でやる訳にはいかない。

方法を探った結果、以下のようにPHPでスクリプトを書いた。画像にテキストを入れる方法をググると、PHPでのサンプルが多かったので、 Webアプリケーションでもなんでもないのだが、とりあえずPHPを使った。

<?php

$src_fname = $argv[1]; // 元となる画像ファイルのパス
$dst_fname = $argv[2]; // 出力先のパス

echo "editing $src_fname ...\n";

// $text は画像に印字するテキスト
if (preg_match("/(.*)\\.jpg/", $src_fname, $matches)) {
  $text = $matches[1];
} else {
  $text = $src_fname;
}

// フォントのファイル名
$font_fname = "/usr/share/fonts/japanese/ipa/ipaexg.ttf";

$img = imagecreatefromjpeg($src_fname);

$color = imagecolorallocate($img, 255, 255, 255);

// フォントの大きさ24, アングル0, 場所左上角(座標 0, 24)でテキストを印字
imagettftext($img, 24, 0, 0, 24, $color, $font_fname, $text);

// 新しい画像をファイルに保存
imagejpeg($img, $dst_fname);

フォントは、既存の環境のどこにフォントがあるのかわからなかったので、とりあえず
http://ipafont.ipa.go.jp/ipaexfont/download.html
からダウンロードして /usr/share/fonts/japanese/ipa/ipaexg.ttf にインストールした。

imagecreatefromjpg関数は、画像ファイルから画像をロードする関数である。反対にimagejpg関数は、画像をファイルに保存する関数である。

imagecreatefromjpg 関数 | PHP Manual
http://php.net/manual/ja/function.imagecreatefromjpeg.php

imagejpg 関数 | PHP Manual
http://php.net/manual/ja/function.imagejpeg.php

imagettftext でテキストを画像に印字する。今回は、左上に印字したので、固定の座標でよかったが、下とか右端にしたい場合は、その前に画像のサイズを取得しないといけない。

imagegettftext 関数 | PHP Manual
http://php.net/manual/ja/function.imagettftext.php

最初は imagetftext ではなく、imagestring を使おうとしたのだが、フォントや大きさの指定の仕方がよくわからなかくてあきらめた。 imagestring の2つ目の引数がフォントの大きさのようで、 PHPマニュアルには1〜5とされているが、5を指定しても小さすぎたのである。

imagestring 関数 | PHP Manual
http://php.net/manual/ja/function.imagestring.php

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。