数码照片EXIF信息读取(PHP)
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是图片文件的基本信息.
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.
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.
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),
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