您的位置主页 > PHP

用PHP显示图片的EXIF信息

最近迷恋上了一些网站的摄影作品,对比自己的傻瓜作品,觉得我白白糟蹋了大自然所赐予的美。总结经验,还是要在拍摄技术上下大功夫。于是决定把硬盘里的一大堆照片,让它们在拍摄时设置的参数与相片一起对比显示出来,供自己学习和纠正。   图片的[url=http://www.google.com/search?q=exif][color=#4371a6]EXIF[/color][/url]信息:
[img=294,305]http://www.phpres.com/upimg/allimg/080508/2049540.jpg[/img]
[b][u]什么是 EXIF[/u][/b]

  Exif是英文Exchangeable Image File(可交换图像文件)的缩写,最初由日本电子工业发展协会(JEIDA --Japan Electronic Industry Development Association) 制订,目前的最新版本是2.21 版。国际标准化组织(ISO)正在制订的相机文件设计标准(DCF -- Design role for Camera File system)可能以Exif2.1为基础。

  Exif 文件实际是JPEG文件的一种,遵从JPEG标准,只是在文件头信息中增加了有关拍摄信息的内容和索引图。所以你可以使用任何支持JPEG格式的图像工具软件观看或修改Exif文件,但,打开时可能看不到Exif信息,一旦修改,Exif信息可能丢失。
  简单来说,EXIF 信息就是由数码相机在拍摄过程中采集一系列的信息,然后把信息放置在我们熟知的 JPEG/TIFF 文件的头部,也就是说 EXIF 信息是镶嵌在 JPEG/TIFF 图像文件格式内的一组拍摄参数,主要包括摄影时的光圈、快门、ISO、日期时间等各种与当时摄影条件相关的讯息,相机品牌型号,色彩编码,拍摄时录制的声音以及全球定位系统(GPS)等信息。简单的说,它就好像是傻瓜相机的日期打印功能一样,只不过 EXIF 信息所记录的资讯更为详尽和完备。
[list][*][url=http://www.exshow.net/download/exif21.pdf][u][color=#0000ff]Exif21.pdf[/color][/u][/url] (580k) [url=http://www.jeida.or.jp/][u][color=#0000ff]JEIDA[/color][/u][/url] 制定的EXIF 2.1 官方标准。(1998.6.12)[*][url=http://www.exshow.net/download/exif22.pdf][u][color=#0000ff]Exif22.pdf[/color][/u][/url] (750k) [url=http://www.jeida.or.jp/][u][color=#0000ff]JEIDA[/color][/u][/url] 制定的EXIF 2.2 官方标准。(2002.4)[*][url=http://www.exshow.net/download/exif.htm][u][color=#0000ff]EXIF 文件格式说明[/color][/u][/url] 一个日本人写的 EXIF 英文参考文档,内容很详细。[/list][i][b]Exif的标识[/b]

[/i]  所有的JPEG文件以字符串“0xFFD8”开头,并以字符串“0xFFD9”结束。文件头中有一系列“0xFF??”格式的字符串,称为“标识”,用来标记JPEG文件的信息段。“0xFFD8”表示图像信息开始,“0xFFD9”表示图像信息结束,这两个标识后面没有信息,而其它标识紧跟一些信息字符。

  0xFFE0 -- 0xFFEF之间的标识符称为“应用标记”,没有被常规JPEG文件利用,Exif正是利用这些信息串记录拍摄信息如快门速度、光圈值等,甚至可以包括全球定位信息。按照Exif2.1标准对这些标识符的定义,数码相机可以把各种拍摄信息记入数码图像中,应用软件可以读取这些数据,再按照Exif2.1标准,检索出它们的具体含义,一般而言包括以下一些信息:

Image Description 图像描述、来源. 指生成图像的工具
Artist作者 有些相机可以输入使用者的名字
Make 生产者 指产品生产厂家
Model 型号 指设备型号
Orientation方向 有的相机支持,有的不支持
XResolution/YResolution X/Y方向分辨率 本栏目已有专门条目解释此问题。
ResolutionUnit分辨率单位 一般为PPI
Software软件 显示固件Firmware版本
DateTime日期和时间
YCbCrPositioning 色相定位
ExifOffsetExif信息位置,定义Exif在信息在文件中的写入,有些软件不显示。
ExposureTime 曝光时间 即快门速度
FNumber光圈系数
ExposureProgram曝光程序 指程序式自动曝光的设置,各相机不同,可能是Sutter Priority(快门优先)、Aperture Priority(快门优先)等等。
ISO speed ratings感光度
ExifVersionExif版本
DateTimeOriginal创建时间
DateTimeDigitized数字化时间
ComponentsConfiguration图像构造(多指色彩组合方案)
CompressedBitsPerPixel(BPP)压缩时每像素色彩位 指压缩程度
ExposureBiasValue曝光补偿。
MaxApertureValue最大光圈
MeteringMode测光方式, 平均式测光、中央重点测光、点测光等。
Lightsource光源 指白平衡设置
Flash是否使用闪光灯。
FocalLength焦距,一般显示镜头物理焦距,有些软件可以定义一个系数,从而显示相当于35mm相机的焦距 MakerNote(User Comment)作者标记、说明、记录
FlashPixVersionFlashPix版本 (个别机型支持)
ColorSpace色域、色彩空间
ExifImageWidth(Pixel X Dimension)图像宽度 指横向像素数
ExifImageLength(Pixel Y Dimension)图像高度 指纵向像素数
Interoperability IFD通用性扩展项定义指针 和TIFF文件相关,具体含义不详
FileSource源文件 Compression压缩比。
[b][u]在WINDOWS下查看图片EXIF信息[/u][/b]
  在windows下查看图片的EXIF信息比较方便,在资源管理器中用鼠标右键点击图片选择属性-->摘要-->高级。
[img=334,362]http://www.phpres.com/upimg/allimg/080508/2049541.jpg[/img] [img=352,454]http://www.phpres.com/upimg/allimg/080508/2049542.jpg[/img]
[b][u]如何在程序中调用图片EXIF信息[/u][/b]
  这方面我没有做太多查询研究,网上java、c++的代码都有,不过我偏爱的php似乎在这方面的支持更直接简洁,上手较快。
参考资料:[url=http://php.erst.cn/manual/zh/ref.exif.php][color=#4371a6]php的Exif Functions[/color][/url]
先用<? phpinfo(); ?>查找一下是否有EXIF模块
[img=614,160]http://www.phpres.com/upimg/allimg/080508/2049543.jpg[/img]
如果没有找到EXIF调用,只须重新编译一下php即可,步骤如下:
[indent][b]1[/b]、停掉apache进程
[b]2[/b]、找到php源码文件,进入后重新编译,编译时加入--enable-exif。例:
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --enable-force-cgi-redirect ……省略若干 ……--enable-mbstr-enc-trans --enable-exif
./make
./make install
[b]3[/b]、开启apache进程即可,不用担心重新设置php.ini文件,如果使用Zend,也不必担心需要重新安装Zend加速。
[/indent]

[b]PHP EXIF函数的使用:[/b] [url=http://php.erst.cn/manual/zh/function.exif-imagetype.php][color=#4371a6]exif_imagetype[/color][/url] -- 判断一个图像的类型 [url=http://php.erst.cn/manual/zh/function.exif-read-data.php][color=#4371a6]exif_read_data[/color][/url] -- 从 JPEG 或 TIFF 文件中读取 EXIF 头信息 [url=http://php.erst.cn/manual/zh/function.exif-tagname.php][color=#4371a6]exif_tagname[/color][/url] -- Get the header name for an index [url=http://php.erst.cn/manual/zh/function.exif-thumbnail.php][color=#4371a6]exif_thumbnail[/color][/url] -- 取得嵌入在 TIFF 或 JPEG 图像中的缩略图 array [b]exif_read_data[/b] ( string filename [, string sections [, bool arrays [, bool thumbnail]]] )

使用举例:
<?php
// 设置图片路径,必须是系统完整的路径
$dir = "/gallery";

//下面请注意exif_read_data读取的文件路径是与本程序所在位置相对的路径
$exif = exif_read_data('CIMG7348.jpg', 0, true);
echo "显示CIMG7348.jpg的元信息:<br />\n";
foreach ($exif as $key => $section) {
foreach ($section as $name => $val) {
echo "$key.$name: $val<br />\n";
}
}
?>
上面的代码执行后显示如下(其中EXIF.MakerNote会显示很长一段乱码,所以去除了):
CIMG7348.jpg:
FILE.FileName: CIMG7348.jpg
FILE.FileDateTime: 1043148976
FILE.FileSize: 1465229
FILE.FileType: 2
FILE.MimeType: image/jpeg
FILE.SectionsFound: ANY_TAG, IFD0, THUMBNAIL, EXIF, INTEROP
COMPUTED.html: width="2240" height="1680"
COMPUTED.Height: 1680
COMPUTED.Width: 2240
COMPUTED.IsColor: 1
COMPUTED.ByteOrderMotorola: 1
COMPUTED.ApertureFNumber: f/2.8
COMPUTED.Thumbnail.FileType: 2
COMPUTED.Thumbnail.MimeType: image/jpeg
IFD0.Make: CASIO COMPUTER CO.,LTD
IFD0.Model: QV-R40
IFD0.Orientation: 1
IFD0.XResolution: 72/1
IFD0.YResolution: 72/1
IFD0.ResolutionUnit: 2
IFD0.Software: 1.00
IFD0.DateTime: 2003:01:21 19:36:15
IFD0.YCbCrPositioning: 1
IFD0.Exif_IFD_Pointer: 276
IFD0.UndefinedTag:0xC4A5: PrintIM0250
THUMBNAIL.Compression: 6
THUMBNAIL.XResolution: 72/1
THUMBNAIL.YResolution: 72/1
THUMBNAIL.ResolutionUnit: 2
THUMBNAIL.JPEGInterchangeFormat: 32992
THUMBNAIL.JPEGInterchangeFormatLength: 8366
EXIF.ExposureTime: 1/125
EXIF.FNumber: 28/10
EXIF.ExposureProgram: 2
EXIF.ExifVersion: 0220
EXIF.DateTimeOriginal: 2003:01:21 19:36:15
EXIF.DateTimeDigitized: 2003:01:21 19:36:15
EXIF.ComponentsConfiguration: 
EXIF.CompressedBitsPerPixel: 1468416/3763200
EXIF.ExposureBiasValue: 0/3
EXIF.MaxApertureValue: 30/10
EXIF.MeteringMode: 5
EXIF.LightSource: 0
EXIF.Flash: 16
EXIF.FocalLength: 800/100
EXIF.ColorSpace: 1
EXIF.ExifImageWidth: 2240
EXIF.ExifImageLength: 1680
EXIF.InteroperabilityOffset: 32868
EXIF.FileSource: 
EXIF.CustomRendered: 0
EXIF.ExposureMode: 0
EXIF.WhiteBalance: 0
EXIF.DigitalZoomRatio: 0/0
EXIF.FocalLengthIn35mmFilm: 39
EXIF.SceneCaptureType: 0
EXIF.GainControl: 0
EXIF.Contrast: 0
EXIF.Saturation: 2
EXIF.Sharpness: 2
INTEROP.InterOperabilityIndex: R98
INTEROP.InterOperabilityVersion: 0100

用上面这种方法,可以在你不确定图片头有哪些信息名,和与其相应的值时,起到通览的作用。当然,你也可以在程序中调用指定的头信息:
echo "镜头类型:" . $exif['IFD0']['Model'];
从原始图片中提取缩略图,并显示的方法:
string [b]exif_thumbnail[/b] ( string filename [, int &width [, int &height [, int &imagetype]]] )
[font=Courier New]<?php
$imgdat = exif_thumbnail('CIMG7348.jpg'][/font][font=Courier New]);
header('Content-type: ' . image_type_to_mime_type(image/jpeg[/font][font=Courier New]));
echo($imgdat[/font][font=Courier New]);
[/font][font=Courier New]?>[/font]
详细内容可参考php的相关手册进行开发。

备注:
本站文章若非注明,均属原创。转载请保持文章完整性, 不足之处欢迎来信交流指教. 作者邮箱:[email=nicekey@gmail.com][color=#6666cc]nicekey@gmail.com[/color][/email] 网站:[url=http://www.phpres.com/include/FCKeditor/editor/][color=#6666cc]http://erst.cn/[/color][/url]