tanaka's Programming Memo

プログラミングについてのメモ。

mac OS X 10.10 のPHPでPELを使ってEXIFを書き換える

ImagickのsetPropertyで書き換えて、writeFileでファイルに出力すればよいかと思いましたが、やってみるとダメでした。setPropertyで書き換えた内容はファイルへの保存には反映しないようです。そこで、PHPEXIFをいじるためのライブラリであるPELを導入しました。

バージョンが変わったからか、見つけたサイトの情報ではうまく動きませんでした。公式情報やサンプルを読んで使えるようになったので、まとめておきます。

実装環境

インストール

公式で紹介されているpearを使う方法は、配信が止まっているからかうまくできませんでした。圧縮アーカイブをダウンロードして、パスを通して利用しました。

lsolesen/pel @ GitHub

  • DownloadのZIPなどをダウンロードして解凍しておきます。
  • PELを利用するプロジェクトフォルダーにpelなどの名前でフォルダーを作成します。
  • 作成したpelフォルダー内に、解凍したフォルダーにあるautoload.phpと、srcフォルダーをコピーします。

以下のような構成になります。

  • test.php
  • pel/autoload.php
  • pel/src/Pel.php
  • pel/src/PelConvert.php
  • pel/src/:srcフォルダー内の全てのphpファイル

検索して出てきたサンプルや、公式サイトでもPelJpeg.phpをrequireすれば使えるような書き方ですが、0.9.2は沢山のPHPファイルを読み込む必要から、autoload.phpによって解決するようになっています。その際、autoload.phpと同じフォルダーに、srcフォルダーがあり、その中にPelの全てのPHPファイルが入っている必要があります。

サンプル

公式ページのサンプルを書き換えて、画像の幅と高さの表示を加えたものです。

<?php
require_once "pel/autoload.php";
use lsolesen\pel\PelJpeg;
use lsolesen\pel\PelTag;
use lsolesen\pel\PelIfd;

$jpeg = new PelJpeg("test.jpg");
$ifd0 = $jpeg->getExif()->getTiff()->getIfd();
$exif = $ifd0->getSubIfd(PelIfd::EXIF);
echo "width=".$exif->getEntry(PelTag::PIXEL_X_DIMENSION)->getValue()."\n";
echo "height=".$exif->getEntry(PelTag::PIXEL_Y_DIMENSION)->getValue()."\n";
$entry = $ifd0->getEntry(PelTag::IMAGE_DESCRIPTION);
$entry->setValue('Edited by PEL');
$jpeg->saveFile("out.jpg");
?>

test.phpと同じフォルダーにあるtest.jpgを読み込んで、幅と高さをEXIFから読み込んで画面に表示します。その後、EXIFのコメントに「Edited by PEL」と書き込んで、out.jpgというファイル名で出力します。

php test.php などで実行して、出来上がったout.jpgの情報をみるとEXIFへの情報の書き込みが確認できます。macでは以下のようにします。

  • out.jpgをダブルクリックしてプレビューで表示
  • [command]+[i]で情報を表示
  • (i)アイコンの詳細情報タブに切り替える
  • [TIFF]をクリック
  • [イメージの説明]欄に、Edited by PEL と表示されていれば、書き込み成功。

機能の追加

PELには各種機能があり、様々なクラスが用意されています。それらのクラスを利用する場合は、useを追加すると楽です。