EXIF(Exchangeable image file format)是数码相机用于记录图片属性及拍摄数据的标准,最初由日本电子工业发展协会制定。这些信息是可以修改的,因此这些数据只有参考价值。在Windows下查看图片属性可以看到并修改这些信息,下图是在Picasa中看到的部分信息:

Exif扩展

PHP的Exif扩展用于处理这些信息,在编译PHP时–enable-exif即可。该简单比较简单,一共只有5个函数(准确地说只有4个,因为read_exif_data只是exif_read_data的别名),本文主要使用exif_read_data()与exif_thumbnail().

string exif_thumbnail ( string $filename [, int &$width [, int &$height [, int &$imagetype ]]] )

exif_thumbnail读取图片的缩略图,后面三个可选参数分别用于返回缩略图的宽、高及图片类型,图片类型是整型,如2代表JPEG格式(参考exif_imagetype),GD扩展提供了image_type_to_mime_type()函数可以方便地返回对应的mime类型。

array exif_read_data ( string $filename [, string $sections = NULL [, bool $arrays = false [, bool $thumbnail = false ]]] )

exif_read_data用于读取所有EXIF信息,返回的信息分为多个部分,如FILE, IFD0, EXIF等,详细解析参考文档。

顺便提一下,Imagick的getImageProperties()也可以读取部分exif信息。

读取信息

下面示例读取并列出所有信息。

$img = 'yansuo_p1.jpg';

//Read exif meta information
$info = exif_read_data($img, NULL, true, false);

//Read thumbnail data
$thumb = exif_thumbnail($img, $width, $height, $type);

//Get mime type: require GD2 extension
$mimeType = image_type_to_mime_type($type);
$data = base64_encode($thumb);

echo 'Thumbnail: ', $width , 'x', $height, ', Type:', 
	$type, ';', $mimeType , "<br />\n";
echo '<img alt="" src="data:', $type, ';base64,', $data, '" />';

foreach ($info as $key=>$sinfo) {
	echo '<h3>', $key, '</h3>';
	if (is_array($sinfo)) {
		echo '<table border="1" cellspacing="0" borderColor="#CCC">';
		foreach ($sinfo as $skey=>$svalue) {
			echo '<tr><td>', $skey, '</td><td>', $svalue, '</td></tr>';
		}
		echo '</table>';
	}
}

测试图片:http://lib.fwso.cn/exif/yansuo_p1.jpg
示例: http://lib.fwso.cn/exif/exif_read_data.php

注意到数据分为了几个部分(组), FILE是图片文件的基本信息.

表1, FILE
FileName yansuo_p1.jpg
FileDateTime 1321330357
FileSize 5439972
FileType 2
MimeType image/jpeg
SectionsFound ANY_TAG, IFD0, THUMBNAIL, EXIF, INTEROP, MAKERNOTE

COMPUTED是经过exif扩展处理的一些数据,IsColor没有找到相关资料,应该是否彩色的意思;ByteOrderMotorola是字节顺序,0为低字节序(little-endian), 1为高字节序(big-endian);CCDWidth表示相机感光器大小,该值跟计算方法有点关系,Canon 600D的感光器大小为22.3mm,这里显示为22,Picasa为23;ApertureFNumber,及后面几项不用解释了。其实这些我只关心Width, Height, CCDWidth, ApertureFNumber.

表2, COMPUTED
html width=”5184″ height=”3456″
Height 3456
Width 5184
IsColor 1
ByteOrderMotorola
CCDWidth 22mm
ApertureFNumber f/6.3
UserComment
UserCommentEncoding UNDEFINED
Thumbnail.FileType 2
Thumbnail.MimeType image/jpeg

IFD0表示主要图相的属性,对应的IFD1就是thumbnail。IFD0中我关心的数据只是Make和Model.

表3, IFD0
Make Canon
Model Canon EOS 600D
Orientation 1
XResolution 72/1
YResolution 72/1
ResolutionUnit 2
DateTime 2011:11:05 14:38:23
Artist
YCbCrPositioning 2
Copyright
Exif_IFD_Pointer 348

EXIF IFD部分数据比较多,只列出了部分,其中ExposureTime是曝光时间, FNumber是光圈大小, ExposureProgram是曝光程序(0表示未定义, 1表示手动曝光, 2表示程序自动曝光, 3表示光圈优先自动曝光,4表示快门优先自动曝光…), ISOSpeedRatings为ISO感光度,ExifVersion为EXIF标准的版本, Flash为闪光方式(16关闭,没有闪光,参考),FocalLength为焦距(这里是20mm, Canon 600D的实际焦距是20×1.6=32mm),

表4, EXIF IFD
ExposureTime 1/800
FNumber 63/10
ExposureProgram 3
ISOSpeedRatings 100
UndefinedTag:0x8830 2
UndefinedTag:0x8832 100
ExifVersion 0230
DateTimeOriginal 2011:11:05 14:38:23
DateTimeDigitized 2011:11:05 14:38:23
ComponentsConfiguration 
ShutterSpeedValue 630784/65536
ApertureValue 352256/65536
ExposureBiasValue 0/1
MeteringMode 5
Flash 16
FocalLength 20/1
FocalPlaneXResolution 5184000/905
FocalPlaneYResolution 3456000/595
FocalPlaneResolutionUnit 2
CustomRendered
ExposureMode
WhiteBalance
SceneCaptureType
UndefinedTag:0xA430
UndefinedTag:0xA431 074053015010
UndefinedTag:0xA432 Array
UndefinedTag:0xA434 EF-S18-55mm f/3.5-5.6 IS II
UndefinedTag:0xA435 0000042eb8

还注意到一些数据属性为UndefinedTag:0x****, 这些属性都是非标准属性,是由相机生产商自定义的一些数据。特别是MakerNote的属性都是根据不能品牌型号而定的。

一个简单示例:http://lib.fwso.cn/exif/index.php

参考

  1. EXIF tags