exif_read_data
画像ファイルから EXIF ヘッダを読み込む
説明
arrayfalse exif_read_data(
resourcestring $file
,
stringnull $required_sections
= null
,
bool $as_arrays
= false
,
bool $read_thumbnail
= false
)
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 データタグの検証も行います。
パラメータ
-
file
-
画像ファイルの位置。
ファイルのパス
(ストリームラッパーもいつもどおりサポートされています)
またはストリームresource。
-
required_sections
-
結果の配列を作成するために存在する必要のあるセクションのカンマ区切り
リスト。要求されたセクションがひとつも見つからなかった場合の戻り値は
false
となります。
-
as_arrays
-
各セクションを配列とするかどうかを指定します。
required_sections
の
COMPUTED
、
THUMBNAIL
および COMMENT
は常に配列となります。これは、これらのセクションに
含まれる値の名前が他のセクションと衝突する可能性があるからです。
-
read_thumbnail
-
true
を指定すると、サムネイル本体を読み込みます。それ以外の場合は
タグつきデータのみを読み込みます。
戻り値
ヘッダ名がキー・ヘッダの内容が値となる連想配列を返します。
返されるデータがない場合は
exif_read_data は false
を返します。
エラー / 例外
サポートされていないタグや、エラーが起きうる条件が指定された場合は、
E_WARNING
かつ/または E_NOTICE
が発生します。
警告が発生しても、この関数は対応する情報を全て読み取ろうとします。
例
例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
例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' headers
echo '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
を使った場合、
ストリームはシーク可能でなければなりません。
ファイルポインタの位置は、関数から戻った後でも変化しないことに注意してください。