首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

exif_read_data

(PHP 4 >= 4.2.0, PHP 5, PHP 7)

exif_read_data - 从图像文件中读取EXIF标头

描述

代码语言:javascript
复制
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.PhotographerCopyright.Editor条目,而IFD0部分包含具有空字符的字节数组,分割两个条目。或者只是第一个条目,如果数据类型错误(Exif的正常行为)。该COMPUTED也会包含条目版权所有要么是原始的版权字符串,或者逗号分隔的摄像与编辑的版权的名单。

标签UserComment与版权标签具有相同的问题。它可以存储两个值。首先使用编码,其次是数值本身。如果是这样,IFD部分只包含编码或字节数组。该COMPUTED节将同时存储在各个入口UserCommentEncodingUserComment在。条目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
代码语言:txt
复制
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()示例

代码语言:javascript
复制
<?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";
????}
}
?>

第一次调用失败,因为图像没有标题信息。

上面的例子会输出类似于:

代码语言:javascript
复制
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起的可用流

代码语言:javascript
复制
<?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);
}
?>

上面的例子会输出类似于:

代码语言:javascript
复制
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_motorolaexif.decode_unicode_intel指定的方式选择字符集。exif扩展名不会尝试自行找出编码,并且由用户在调用exif_read_data()之前通过设置这两个ini指令之一来正确指定用于解码的编码。

扩展内容

  • exif_t??humbnail() - 检索图像的嵌入缩略图
  • getimagesize() - 获取图像的大小

← exif_imagetype

exif_tagname →

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com