準備
extension=php_mbstring.dllでは、任意の画像ファイルの Exif 情報を表示するPHPプログラムを紹介する。
extension=php_exif.dll
サンプル・プログラムの実行例

サンプル・プログラム
sprintexif.php | サンプル・プログラム本体。 |
解説:Exif情報を配列に格納する
0187: /**
0188: * Exif情報を配列に格納する(下請け関数)
0189: * @param String $fname 画像ファイル名
0190: * @param Array $exif Exif情報を格納する配列
0191: * @return 0:正常に表示した
0192: * (-1): ファイルが存在しない
0193: * (-2): JPEG/TIFF以外の形式
0194: * (-3): Exif情報がない
0195: */
0196: function _getexif($fname, &$exif) {
0197: //ファイルの存在チェック
0198: if (fopen($fname, 'rb') == FALSE) return (-1);
0199:
0200: //JPEG/TIFFの型チェック
0201: switch (exif_imagetype($fname)) {
0202: case IMAGETYPE_JPEG:
0203: case IMAGETYPE_TIFF_II:
0204: case IMAGETYPE_TIFF_MM:
0205: break;
0206: default:
0207: return (-2);
0208: }
0209:
0210: //Exif情報を配列へ
0211: if (($cls = exif_read_data($fname, 'EXIF')) == FALSE) return (-3);
0212: foreach ($cls as $key=>$sect) {
0213: if (is_array($sect) == FALSE) {
0214: $exif[$key] = $sect;
0215: } else {
0216: foreach($sect as $name=>$val) $exif[$key . '.' . $name] = $val;
0217: }
0218: }
0219: return 0;
0220: }

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

Exif情報はオブジェクト構造をしている。そこで、配列の添え字にタグ名、配列の中身として値を格納することにする。
これを実現するために、二段構えの foreach 構文で情報を配列へ展開している。
なお、タグ名の一部はデジカメ固有の文字列なので注意が必要だ。詳細はこちら。
0187: /**
0188: * Exif情報を配列に格納する(下請け関数)
0189: * @param String $fname 画像ファイル名
0190: * @param Array $exif Exif情報を格納する配列
0191: * @return 0:正常に表示した
0192: * (-1): ファイルが存在しない
0193: * (-2): JPEG/TIFF以外の形式
0194: * (-3): Exif情報がない
0195: */
0196: function _getexif($fname, &$exif) {
0197: //ファイルの存在チェック
0198: if (fopen($fname, 'rb') == FALSE) return (-1);
0199:
0200: //JPEG/TIFFの型チェック
0201: switch (exif_imagetype($fname)) {
0202: case IMAGETYPE_JPEG:
0203: case IMAGETYPE_TIFF_II:
0204: case IMAGETYPE_TIFF_MM:
0205: break;
0206: default:
0207: return (-2);
0208: }
0209:
0210: //Exif情報を配列へ
0211: if (($cls = exif_read_data($fname, 'EXIF')) == FALSE) return (-3);
0212: foreach ($cls as $key=>$sect) {
0213: if (is_array($sect) == FALSE) {
0214: $exif[$key] = $sect;
0215: } else {
0216: foreach($sect as $name=>$val) $exif[$key . '.' . $name] = $val;
0217: }
0218: }
0219: return 0;
0220: }
応用
参考サイト
- Exit情報(F6 Exif)
- Exif形式の画像ファイル解説
- Exifファイルフォーマット(AlbumMaker)
(2022年2月19日)PHP8対応,全面改訂