PHPでExif情報を表示する

(1/1)
デジカメで撮影された JPEG画像には、撮影日時に加え、絞り、シャッター速度、デジカメの機種名、メーカー名など、さまざまな情報が Exif と呼ばれるタグ情報となって埋め込まれている。最近の GPS 付携帯デジカメでは、緯度・経度情報まで記録されている。

準備

PHP には、Exif 情報を取得する  exif_read_data  関数が用意されている。この関数を利用するのにGD ライブラリは不要だが、--enable-exif を enable にして PHP をコンパイルする必要がある。配布されている Windows バイナリの場合、extension に php_exif.dll を指定してやるだけで利用できるようになる。ただし、かならず php_mbstring.dll の後に読み込む必要がある。つまり、php.ini の定義は、かならず下記の順番にしておく必要がある。

extension=php_mbstring.dll
extension=php_exif.dll


では、任意の画像ファイルの Exif 情報を表示する PHP プログラムを紹介する。

サンプル・プログラム

サンプル・プログラムの解説

このプログラムの主役は、ユーザー定義関数 getexif である。引数は、ファイル名(URL も可能)と、Exif 情報を格納するための配列変数の 2 つ。

まず、ファイルが存在するかどうか調べる。
次に、そのファイルが JPEG か TIFF であるかどうか調べる。このような目的のために、PHP には  exif_imagetype  という関数が用意されている。
これらをクリアして、はじめて  exif_read_data  関数を使って Exif 情報を読み出す。
なお、Exif 情報がない場合は、  exif_read_data  関数は FALSE を返すので、このエラーもキャッチしておく必要がある。

Exif 情報はオブジェクト構造をしている。そこで、配列の添え字にタグ名、配列の中身として値を格納することにする。
これを実現するために、二段構えの foreach 構文で情報を配列へ展開している。実際に Exif 情報を画面に表示するのは、89行目である。
なお、タグ名の一部はデジカメ固有の文字列なので注意が必要だ。詳細はこちら

0043: /**
0044:  * Exif情報を配列に格納する
0045:  * @param String $fname 画像ファイル名
0046:  * @param Array  $exif  Exif情報を格納する配列
0047:  * @return 0:正常に表示した
0048:  *          (-1): ファイルが存在しない
0049:  *          (-2): JPEG/TIFF以外の形式
0050:  *          (-3): Exif情報がない
0051: */
0052: function getexif($fname, &$exif) {
0053:     //ファイルの存在チェック
0054:     if (fopen($fname, 'rb') == FALSE)    return (-1);
0055: 
0056:     //JPEG/TIFFの型チェック
0057:     switch (exif_imagetype($fname)) {
0058:         case IMAGETYPE_JPEG:
0059:         case IMAGETYPE_TIFF_II:
0060:         case IMAGETYPE_TIFF_MM:
0061:             break;
0062:         default:
0063:             return (-2);
0064:     }
0065: 
0066:     //Exif情報を配列へ
0067:     if (($cls = exif_read_data($fname, 'EXIF')) == FALSE)  return (-3);
0068:     foreach ($cls as $key=>$sect) {
0069:         if (is_array($sect) == FALSE) {
0070:             $exif[$key] = $sect;
0071:         } else {
0072:             foreach($sect as $name=>$val)   $exif[$key . '.' . $name] = $val;
0073:         }
0074:     }
0075:     return 0;
0076: }

応用

Exif 情報にある撮影年月日を使って、デジカメのファイル名を整理できる。この手のフリーソフトは何種類か出ているが、PHP でも同じことができる。
はてなフォトライフでは、Exifから取得した位置情報はてなマップへ展開する機能を持っている。
はてなマップは Google Map の機能を使っており、PHP でも同様のアプリケーションは実現できるだろう。

参考サイト

(この項おわり)
header