exif_read_data
exif_read_data
(PHP 4 >= 4.2.0, PHP 5, PHP 7)
exif_read_data - 从图像文件中读取EXIF标头
描述
array exif_read_data ( mixed $stream [, string $sections = NULL [, bool $arrays = false [, bool $thumbnail = false ]]] )
exif_read_data()
从图像文件中读取EXIF标头。这样您就可以读取数码相机生成的元数据。
EXIF标题通常出现在数码相机生成的JPEG / TIFF图像中,但不幸的是,每个数码相机制造商对于如何实际标记图像都有不同的想法,因此您不能总是依赖特定的Exif标题。
高度
和宽度
的计算方式与getimagesize()相同,因此它们的值不能是返回的任何标题的一部分。另外,html
是在普通HTML中使用的高度
/宽度
文本字符串。
当Exif标题包含版权说明时,它本身可以包含两个值。由于Exif 2.10标准中的解决方案不一致,因此COMPUTED
部分将返回Copyright.Photographer
和Copyright.Editor
条目,而IFD0
部分包含具有空字符的字节数组,分割两个条目。或者只是第一个条目,如果数据类型错误(Exif的正常行为)。该COMPUTED
也会包含条目版权所有
要么是原始的版权字符串,或者逗号分隔的摄像与编辑的版权的名单。
标签UserComment
与版权标签具有相同的问题。它可以存储两个值。首先使用编码,其次是数值本身。如果是这样,IFD
部分只包含编码或字节数组。该COMPUTED
节将同时存储在各个入口UserCommentEncoding
和UserComment在
。条目UserComment在
两种情况下均可用,所以应优先使用IFD0
部分中的值。
exif_read_data()
还根据EXIF规范验证EXIF数据标签(»http://exif.org/Exif2-2.PDF,page 20)。
注意
:Windows Me / XP可以在连接相机时擦除Exif标头。
参数
stream
图像文件的位置。这可以是文件的路径(也可以像往常一样支持流封装)或流资源。
sections
是逗号分隔的部分列表,需要在文件中出现才能生成结果数组。如果没有找到请求的部分,则返回值为FALSE
。
文件 | FileName,FileSize,FileDateTime,SectionsFound |
---|---|
COMPUTED | HTML,宽度,高度,IsColor等(如果可用)。高度和宽度的计算方式与getimagesize()相同,因此它们的值不能是返回的任何标题的一部分。另外,html是在普通HTML中使用的高度/宽度文本字符串。 |
ANY_TAG | 任何具有标签的信息,例如IFD0,EXIF,... |
IFD0 | IFD0的所有标记的数据。在正常的图像文件中包含图像大小等等。 |
THUMBNAIL | 如果文件具有第二个IFD,则应该包含缩略图。所有关于嵌入式缩略图的标记信息都存储在本节中。 |
COMMENT | 评论JPEG图像的标题。 |
EXIF | EXIF部分是IFD0的子部分。它包含更多关于图像的详细信息。这些条目中的大部分都与数码相机有关。 |
arrays
指定每个部分是否成为一个数组。 COMPUTED,THUMBNAIL和COMMENT节总是成为数组,因为它们可能包含名称与其他节相冲突的值。
thumbnail
当设置为TRUE时,缩略图本身被读取。 否则,只有标记的数据被读取。
返回值
它返回一个关联数组,其中数组索引是标题名称,数组值是与这些标题相关联的值。 如果没有数据可以返回,exif_read_data()将返回FALSE。
更新日志
版 | 描述 |
---|---|
7.2.0 | filename参数已重命名为流,现在支持本地文件或流资源。 |
7.2.0 | 增加了对以下EXIF格式的支持:三星DJI松下索尼宾得美能达Sigma / Foveon AGFA京瓷理光爱普生 |
4.3.0 | 可以读取所有嵌入的IFD数据,包括数组(如此返回)。此外,嵌入式缩略图的大小在THUMBNAIL子数组中返回,并且可以返回TIFF格式的缩略图。而且,返回值不再有最大长度(直到达到内存限制)。 |
4.3.0 | 如果PHP支持mbstring,用户注释可以自动更改编码。另外,如果用户评论使用Unicode或JIS编码,则该编码将根据php.ini中的exif ini设置自动更改 |
4.3.0 | 如果图像包含任何IFD0数据,则COMPUTED包含ByteOrderMotorola条目,对于little-endian(intel)为0,对于big-endian(motorola)字节顺序为1。此外,如果数据类型错误,COMPUTED和UserComment不再仅包含第一个版权条目。 |
- Samsung
- DJI
- Panasonic
- Sony
- Pentax
- Minolta
- Sigma/Foveon
- AGFA
- Kyocera
- Ricoh
- Epson
4.3.0 Can read all embedded IFD data including arrays (returned as such). Also the size of an embedded thumbnail is returned in a _THUMBNAIL_ subarray, and can return thumbnails in TIFF format. Also, there is no longer a maximum length for returned values (not until the memory limit has been reached). 4.3.0 If PHP has [mbstring](https://secure.php.net/manual/en/ref.mbstring.php) support, the user comment can automatically change encoding. Also, if the user comment uses _Unicode_ or _JIS_ encoding this encoding will automatically be changed according to the exif ini settings in php.ini 4.3.0 If the image contains any _IFD0_ data then _COMPUTED_ contains the entry _ByteOrderMotorola_ which is 0 for _little-endian_ (intel) and 1 for _big-endian_ (motorola) byte order. Also, _COMPUTED_ and _UserComment_ no longer only contain the first copyright entry if the datatype was wrong.
例子
示例#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 exif_read_data()带有自PHP 7.2.0起的可用流
<?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指令之一来正确指定用于解码的编码。
扩展内容
- exif_thumbnail() - 检索图像的嵌入缩略图
- getimagesize() - 获取图像的大小
← exif_imagetype
exif_tagname →