exif_read_data
(PHP 4 >= 4.2.0, PHP 5, PHP 7)
exif_read_data — 画像ファイルから EXIF ヘッダを読み込む
説明
exif_read_data
( resource|string $file
[, string|null $required_sections
= null
[, bool $as_arrays
= false
[, bool $read_thumbnail
= false
]]] ) : array|false
exif_read_data() は、 画像ファイルから 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 ヘッダを書き換えることが可能です。
パラメータ
file
画像ファイルの位置。 ファイルのパス (ストリームラッパーもいつもどおりサポートされています) またはストリームresource。
required_sections
結果の配列を作成するために存在する必要のあるセクションのカンマ区切り リスト。要求されたセクションがひとつも見つからなかった場合の返り値は
false
となります。FILE FileName, FileSize, FileDateTime, SectionsFound COMPUTED html, Width, Height, IsColor, および他の取得可能なもの。Height および Width は getimagesize() と同じ方法で取得した もので、その値はヘッダの一部ではありません。また、
html
は 通常の HTML 内で使用される height/width の 文字列です。ANY_TAG タグを有するすべての情報。例えば IFD0
,EXIF
, ...IFD0 IFD0 のすべてのタグつきデータ。通常の画像ファイルでは、 ここに画像のサイズが含まれます。
THUMBNAIL 2 番目の IFD
がある場合、ファイルにサムネイルが含まれている可能性があります。埋め込まれたサムネイルに関するすべての タグつき情報はこのセクションに格納されます。
COMMENT JPEG 画像のコメントヘッダ。 EXIF EXIF セクションは IFD0
のサブセクションです。ここには画像に関する詳細な情報が含まれています。これらのエントリの ほとんどはデジタルカメラに関連するものです。
as_arrays
各セクションを配列とするかどうかを指定します。
required_sections
のCOMPUTED
、THUMBNAIL
およびCOMMENT
は常に配列となります。これは、これらのセクションに 含まれる値の名前が他のセクションと衝突する可能性があるからです。read_thumbnail
true
を指定すると、サムネイル本体を読み込みます。それ以外の場合は タグつきデータのみを読み込みます。
返り値
ヘッダ名がキー・ヘッダの内容が値となる連想配列を返します。
返されるデータがない場合は
exif_read_data() は false
を返します。
エラー / 例外
サポートされていないタグや、エラーが起きうる条件が指定された場合は、
E_WARNING
かつ/または E_NOTICE
が発生します。
警告が発生しても、この関数は対応する情報を全て読み取ろうとします。
変更履歴
バージョン | 説明 |
---|---|
8.0.0 | required_sections は、nullable になりました。
|
7.2.0 | file パラメータは
ローカルファイルとストリームリソースを両方サポートするようになりました。 |
7.2.0 |
以下の EXIF フォーマットのサポートが追加されました:
|
例
例1 exif_read_data() の例
<?phpecho "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
例2 PHP 7.2.0 で利用できるストリームを exif_read_data() で使う例
<?php// Open a the file, this should be in binary mode$fp = fopen('/path/to/image.jpg', 'rb');if (!$fp) { echo 'Error: Unable to open image for reading'; exit;}// Attempt to read the exif headers$headers = exif_read_data($fp);if (!$headers) { echo 'Error: Unable to read exif headers'; exit;}// Print the 'COMPUTED' headersecho 'EXIF Headers:' . PHP_EOL;foreach ($headers['COMPUTED'] as $header => $value) { printf(' %s => %s%s', $header, $value, PHP_EOL);}?>
上の例の出力は、 たとえば以下のようになります。
EXIF Headers: Height => 576 Width => 1024 IsColor => 1 ByteOrderMotorola => 0 ApertureFNumber => f/5.6 UserComment => UserCommentEncoding => UNDEFINED Copyright => Denis Thumbnail.FileType => 2 Thumbnail.MimeType => image/jpeg
注意
注意:
mbstring が有効な場合、 exif はUnicodeを処理し、 exif.decode_unicode_motorola および exif.decode_unicode_intel で指定された文字コードとして取り出そうとします。 exif 拡張モジュールはエンコーディングを自分自身で探そうとはしないので、 exif_read_data() を呼ぶ前に、 これらの ini ディレクティブのうちのひとつに どのエンコーディングをデコードに使うかを適切に設定するのはユーザーの責任です。
注意:
この関数にストリームを渡すために
file
を使った場合、 ストリームはシーク可能でなければなりません。 ファイルポインタの位置は、関数から戻った後でも変化しないことに注意してください。