发布phpexif v0.1 - 顺带简单谈谈EXIF

什么是EXIF(网上抄来的):
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 信息所记录的资讯更为详尽和完备。



包含EXIF信息的JPEG文件:
所有的JPEG文件以字符串“0xFFD8”开头(SOI),并以字符串“0xFFD9”结束(EOI),一个JPEG文件的格式大致如下图一(Exif2-2.PDF 第11页):


APP1 Maker固定为0xFFE1
APP1 Length是一个2bytes的SHORT
Exif Identifier Code为6bytes,前4bytes是字符"EXIF",后2bytes是0x00

TIFF Headers的结构可以参考下表一(Exif2-2.PDF 第10页):


TIFF Header开始到最后的详细结构可以查考如下图二(Exif2-2.PDF 第9页):


如果是要获取一张照片拍摄的相关信息,一般来说我们主要是需要关注的结构有0th IFD、Exif IFD,还有一个就是MakerNote。

0th IFD一般称为“图像信息”,里其中包含了相机厂商、相机型号、拍摄时间和Exif IFD结构入口的指针(TAG为0x8769);

Exif IFD一般称为“相机拍摄记录”,其中包含了快门、光圈、测光模式、ISO等拍摄参数信息,还有就是包含了MakerNote结构的入口指针(TAG为0x927C);

MakerNote一般称为“厂商注释”,这个是个最混乱的结构,因为不同的厂商都有自己定义的结构,里面都是一些厂商定义的信息,例如Nikon在里面定义了镜头相关的信息,ISO数值;对于D70之类N家的“老”相机,ISO数值是没有按照规范记录在Exif IFD中的,并且MakerNote中的这个字段还没有遵照文件中多字节存储顺序(big-endian和little-endian)存放,很是神奇。



phpexif:
最近给公司的摄影协会搞了个Discuz!论坛,论坛最大的目的就是交流相片,于是考虑做些改动,在页面上直接显示上传照片的Exif信息。在网上找了一下,解决的方法多数都是启用PHP自带的Exif函数,然后修改include\attachment.func.php和模板templates\default\discuzcode.htm,但是试用之后我发现php的Exif函数有些问题,有些信息显示出来格式有问题,我的php版本是4.4.7,于是改用我自己原来为自己的相册写的一个函数替代。发现原来写得很粗糙,很多问题都没有考虑,兴致一来,决定重写一个。

这次的这个版本使用了面向对象的结构,相对规整,而且对一些情况考虑得也周全一些,不过只是用来获取有限的一些参数,其他的暂时忽略不计。且对于MakerNote结构,也只是针对Nikon的jpeg文件获取了ISO数值,Nikon文件的其他信息和其他品牌的MakerNote均未涉及。一些功能也不通用,放上来主要供有兴趣的人参考或者修改使用。

版本:v0.1
功能:获取指定jpeg文件的如下Exif信息,相机厂商、相机型号、快门、光圈、曝光程序、测光模式、拍摄时间、感光度、闪光灯模式、焦距、曝光补偿、白平衡模式、等价35mm焦距、感光度,并输出成固定格式的HTML字符串

下载


参考资料:
这里还有一个压缩包包含了一些我收藏的参考资料供大家使用:
1、JEIDA 制定的EXIF 2.1官方标准 (1998.6.12)
2、JEIDA 制定的EXIF 2.2 官方标准 (2002.4)
3、EXIF 文件格式说明,一个日本人写的EXIF英文参考文档,内容有点旧,不过还是比官方规范好读很多;原始下载地址已经404错误了,好在我有备份
4、Nikon Tags说明

下载


在Discuz! 6.0中增加图片显示Exif信息的方法:
大家可以参考《数码相片EXIF信息For DZ 6.0正式版》:http://www.discuz.net/viewthread.php?tid=733174

将phpexif.php上传到Discuz! 6.0的include目录,将文中include\attachment.func.php中添加的代码改为:

/*******EXIF信息**********/
if (($extension == 'jpg' || $extension == 'jpeg'))
{
require_once("./include/phpexif.php");
if (!isset($ex) || $ex == null)
{
$ex = new EXIF();
}
$ex->get_exif("./attachments/".$attach['attachment']);
$attach['exif'] = $ex->TAG->to_string();
}
/*******EXIF信息**********/



显示效果如下:



Exif查看工具推荐:
最后还是推荐查看Exif的IE插件Opanda IExif,下载地址:http://www.opanda.com/cn/iexif/download.htm,方便查看更多Exif信息。

站点更新

1、修改了『我的照片』中看大照片的页面:解决了Nikon Editor v4.3.2输出的jpeg文件无法正确读取EXIF信息的问题;解决了原来无法读取Fuji S304拍摄的jpeg文件EXIF信息的问题;修改了读取EXIF信息中照片拍摄日期的输出规则。

2、修改了首页弹出消息框,用window.createPopup方法替换原来的div方法,并控制不重复显示;


附3个很好的EXIF格式资源,来源是http://www.exshow.net:
exif21.pdf (580k) JEIDA 制定的EXIF 2.1官方标准 (1998.6.12)
exif22.pdf (750k) JEIDA 制定的EXIF 2.2 官方标准 (2002.4)
EXIF 文件格式说明,一个日本人写的EXIF英文参考文档,内容有点旧,不过还是比官方规范好读很多

-----以下2008-04-04增加-----
这里还有一个压缩包包含了一些参考资料供大家使用:
1、JEIDA 制定的EXIF 2.1官方标准 (1998.6.12)
2、JEIDA 制定的EXIF 2.2 官方标准 (2002.4)
3、EXIF 文件格式说明,一个日本人写的EXIF英文参考文档,内容有点旧,不过还是比官方规范好读很多;原始下载地址已经404错误了,豪宅我有备份
4、Nikon Tags

下载

20050710

把图片区点击看大图的功能改动了一下,现在可以加个框,然后还可以显示一些基本的EXIF参数。

/photo/view.php?phot...02/DSC_7197.jpg

功能虽少,但却写的我有点吐血的感觉 EM74.gif ,主要是EXIF格式太繁琐,版本不统一,现在上的版本对于原来的Fuji S304的EXIF还不能读出来EM206.gif ,效果也没有想像的好,唉,有空再改了~~~