exif_read_data

(PHP 4 >= 4.2.0, PHP 5)

exif_read_data --  从 JPEGTIFF 文件中读取 EXIF 头信息,这样就可以读取数码相机产生的元数据

说明

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

exif_read_data() 函数从 JPEG 或 TIFF 图像文件中读取 EXIF 头信息。返回一个关联数组,键名是头信息名,值为与其相应的值。如果没有可供返回的数据则返回 FALSE

filename 是被读取的文件名。不能是 URL。

sections 是需要存在于文件中的逗号分隔的区段列表用来产生结果数组。如果未找到所请求的区段则返回值为 FALSE

FILEFileName,FileSize,FileDateTime,SectionsFound
COMPUTEDhtml,Width,Height,IsColor,可能有更多其它的。
ANY_TAG任何有标记的信息,例如 IFD0,EXIF,...
IFD0 所有 IFD0 的标记数据。在标准的图像文件中这包含了图像大小及其它。
THUMBNAIL 如果有第二个 IFD,文件应该包含有缩略图。所有有关嵌入缩略图的标记信息都存储在本区。
COMMENTJPEG 图像的注释头信息。
EXIF EXIF 区段是 IFDO 的子区,包含有图像的更多详细信息。大多数内容都是数码相机相关的。

arrays 指定了是否每个区段都成为一个数组。COMPUTEDTHUMBNAIL 区段总是成为数组,因为它们里面包含的名字和其它区段冲突。

thumbnail 指定了是否读取缩略图本身而不只是标记数据。

注: Exif 头信息往往存在于数码相机生成的 JPEG/TIFF 图像中,但不幸的是每个数码相机制造商的标记都不同,因此(编写代码时)不能依赖于某个特定的 Exif 头信息。

Windows ME/XP 在连接到数码相机时能清除掉 Exif 头信息。更多信息见 http://www.canon-asia.com/products/digital_cameras/winxp_problems.html

例子 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 />";
$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

注: 如果图像包含任何 IFD0 数据,则 COMPUTED 会包含有一项 ByteOrderMotorola,对于 little-endian (intel) 字节顺序,其值为 0,对于 big-endian (motorola) 字节顺序,其值为 1。这是 PHP 4.3 新加的。

当一个 Exif 头信息包含有一个 Copyright 时注意它本身可以包含两个值。解决方案和 Exif 2.10 标准不一致,COMPUTED 区段会同时返回 Copyright.PhotographerCopyright.Editor,但是 IFD0 区段则包含有一个字节数组用 NULL 字符分隔开两个项目。或者只有第一项如果数据类型错误的话(Exif 的正常行为)。COMPUTED 也会包含 Copyright,要么是原始的版权字符串,要么是逗号分隔的摄像与编辑的版权信息。

注: UserComment 标记和 Copyright 有同样的问题。它也可以存储两个值,第一个是使用的编码方式,第二个是其值本身。如果这样则 IFD0 区段仅包含编码方式或者一个字节数组。COMPUTED 区段将存储两个值到 UserCommentEncodingUserCommentUserComment 在两种情况下都可用因此应该优先使用它而不是 IFD0 区段中的该值。

如果用户注释使用 Unicode 或 JIS 编码并且可以使用 mbstring 模块,则此编码会根据 exif 在 php.ini 中的设置自动改变。这是 PHP 4.3 新加的。

注: Height 和 Width 是用和 getimagesize() 一样的方法计算的,因此它们的值不能是任何返回的头信息的部分。此外 html 是一个 height/width 的文本字符串可以用于普通的 HTML 中。

注: 自 PHP 4.3 起本函数可以读取所有嵌入的 IFD 数据,包括数组(也返回数组)。此外嵌入的缩略图的大小包括在 THUMBNAIL 子数组中并且 exif_read_data() 可以将缩略图按照 TIFF 格式返回。最后,不再有返回值最大长度的限制了(直到达到内存限定)。

注: 本函数仅在 PHP 编译时使用了 --enable-exif 选项时可用。其功能和行为在 PHP 4.2 改变了,早期版本极不稳定。

自 PHP 4.3 起用户注释可以自动修改编码,假如 PHP 4 编译时使用了 --enable-mbstring 的话。

本函数不需要 GD 图像库。

参见 exif_thumbnail()getimagesize()