そのまんま!

exif_read_data

(PHP 4 >= 4.2.0, PHP 5)

exif_read_data --  JPEG あるいは TIFF から EXIF ヘッダを読み込む

説明

array exif_read_data ( string filename [, string sections [, bool arrays [, bool thumbnail]]] )

exif_read_data() は、JPEG あるいは TIFF の画像ファイルから EXIF ヘッダを読み込みます。この方法で、デジタルカメラが生成したメタデータを 読み込むことが可能です。

Exif ヘッダは、デジタルカメラが作成した JPEG/TIFF 画像によく含まれています。しかし残念なことに、 そのタグ付けの方法はメーカーによって異なります。 したがって、特定の Exif ヘッダが常に存在すると仮定することはできません。

Height および Width は、getimagesize() と同じ方法で計算されます。 よって、これらの値は決してヘッダの一部として返してはいけません。 また、html は高さ/幅を表すテキスト文字列で、 通常の HTML の中で用いられます。

Exif ヘッダに著作権表示が含まれている場合、それ自身には 2 つの値を 含めることが可能です。Exif 2.10 のこの矛盾した規格に対応するため、 COMPUTED セクションは Copyright.Photographer および Copyright.Editor の両方を返します。 また IFD0 セクションには 2 つのエントリを NULL 文字で区切った バイト配列を含めます。データ型が間違っている場合は最初のエントリのみを かえします(Exif の通常の挙動)。COMPUTED には、元の著作権文字列あるいは カンマで区切られた写真と編集者の著作権表示のどちらかを Copyright エントリに含めることが可能です。

UserComment タグにも Copyright タグと同様の問題があります。ここにも 2 つの値を格納することが可能です。それは使用しているエンコーディングと 値自身の 2 つです。そうなると、IFD セクションにはエンコーディングのみを 含めるか、あるいはバイト配列を格納することになります。COMPUTED セクションは UserCommentEncoding および UserComment を両方格納することができます。UserComment はどちらの 場合でも有効なので、IFD0 セクションではこちらを優先すべきです。

exif_read_data() は、EXIF 仕様(http://exif.org/Exif2-2.PDF, 20 ページ)に基づいて EXIF データタグの検証も行います。

注意: Windows ME/XP は、カメラと接続した際に Exif ヘッダを書き換えることが可能です。 詳細な情報は http://www.canon.co.jp/Imaging/NOTICE/011214-e.html を参照ください。

パラメータ

filename

読み込む画像ファイルの名前。 URL 形式は使用できません。

sections

結果の配列を作成するために存在する必要のあるセクションのカンマ区切り リスト。要求されたセクションがひとつも見つからなかった場合の返り値は FALSE となります。

FILEFileName, FileSize, FileDateTime, SectionsFound
COMPUTED html, Width, Height, IsColor, および他の取得可能なもの。Height および Width は getimagesize() と同じ方法で取得した もので、その値はヘッダの一部ではありません。また、html は 通常の HTML 内で使用される height/width の 文字列です。
ANY_TAGタグを有するすべての情報。例えば IFD0, EXIF, ...
IFD0 IFD0 のすべてのタグつきデータ。通常の画像ファイルでは、 ここに画像のサイズが含まれます。
THUMBNAIL 2 番目の IFD がある場合、ファイルにサムネイルが含まれている 可能性があります。埋め込まれたサムネイルに関するすべての タグつき情報はこのセクションに格納されます。
COMMENTJPEG 画像のコメントヘッダ。
EXIF EXIF セクションは IFD0 のサブセクションです。ここには 画像に関する詳細な情報が含まれています。これらのエントリの ほとんどはデジタルカメラに関連するものです。

arrays

各セクションを配列とするかどうかを指定します。 COMPUTEDTHUMBNAIL および COMMENT のセクションは常に配列となります。これは、これらのセクションに 含まれる値の名前が他のセクションと衝突する可能性があるからです。

thumbnail

TRUE を指定すると、サムネイル本体を読み込みます。それ以外の場合は タグつきデータのみを読み込みます。

返り値

ヘッダ名がキー・ヘッダの内容が値となる連想配列を返します。 返されるデータがない場合は exif_read_data()FALSE を返します。

変更履歴

バージョン説明
4.3.0 埋め込まれた IFD データを、配列を含めて すべて読み込めます(そして返せます)。また、埋め込まれた サムネイルの大きさもサブ配列 THUMBNAIL に 格納され、TIFF フォーマットのサムネイルを 返すことが可能です。さらに、(メモリの制限に達しない限り) 返り値の長さの最大長には制限はありません。
4.3.0 PHP の mbstring サポートが 有効になっている場合、ユーザコメントのエンコーディングは自動的に 変換されます。また、ユーザコメントが Unicode あるいは JIS エンコーディングを使用している場合は php.ini の exif 設定に応じて エンコーディングが自動的に変換されます。
4.3.0 画像に何らかの IFD0 データが含まれている場合、COMPUTED にはエントリ ByteOrderMotorola が含まれます。このエントリは、バイトオーダーが リトルエンディアン(intel)の場合に 0 、ビッグエンディアン (motorola)の場合に 1 となります。また、COMPUTED および UserComment は、仮にデータ型が間違っていても最初の copyright エントリだけを格納するということはありません。

例 1. exif_read_data() の例

<?php
echo "test1.jpg:<br />\n";
$exif = exif_read_data('tests/test1.jpg', 'IFD0');
echo
$exif===false ? "No header data found.<br />\n" : "Image contains headers<br />\n";

$exif = exif_read_data('tests/test2.jpg', 0, true);
echo
"test2.jpg:<br />\n";
foreach (
$exif as $key => $section) {
    foreach (
$section as $name => $val) {
        echo
"$key.$name: $val<br />\n";
    }
}
?>

最初のコールは失敗します。画像がヘッダ情報を有していないためです。

上の例の出力は、たとえば 以下のようになります。

test1.jpg:
No header data found.
test2.jpg:
FILE.FileName: test2.jpg
FILE.FileDateTime: 1017666176
FILE.FileSize: 1240
FILE.FileType: 2
FILE.SectionsFound: ANY_TAG, IFD0, THUMBNAIL, COMMENT
COMPUTED.html: width="1" height="1"
COMPUTED.Height: 1
COMPUTED.Width: 1
COMPUTED.IsColor: 1
COMPUTED.ByteOrderMotorola: 1
COMPUTED.UserComment: Exif test image.
COMPUTED.UserCommentEncoding: ASCII
COMPUTED.Copyright: Photo (c) M.Boerger, Edited by M.Boerger.
COMPUTED.Copyright.Photographer: Photo (c) M.Boerger
COMPUTED.Copyright.Editor: Edited by M.Boerger.
IFD0.Copyright: Photo (c) M.Boerger
IFD0.UserComment: ASCII
THUMBNAIL.JPEGInterchangeFormat: 134
THUMBNAIL.JPEGInterchangeFormatLength: 523
COMMENT.0: Comment #1.
COMMENT.1: Comment #2.
COMMENT.2: Comment #3end
THUMBNAIL.JPEGInterchangeFormat: 134
THUMBNAIL.Thumbnail.Height: 1
THUMBNAIL.Thumbnail.Height: 1

参考

exif_thumbnail()
getimagesize()