PHP中读取照片exif信息的方法

先来了解什么是图片的Exif信息

Exif是一种图象文件格式,它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图等。简单地说,Exif=JPEG+拍摄参数。因此,你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息。

以上引自百度百科。

读取照片的exif在很多时候都没有必要,但相对于一些探讨摄影技术的站点,那么读取照片的exif信息就显得尤为重要了,比如摄影论坛蜂鸟。

截图自蜂鸟论坛,红圈信息部分就是程序读取照片的exif信息。我们把图片下载到本地,使用光影魔术手打开图片看看它的Exif信息,当BG然除了光影还有很多工具都能查看图片的Exif值。

除了Exif信息里的镜头值读不出来以外其余的值都能正确读出来。

开启PHP模块

认情况下,PHP读取图片Exif信息模块是不开启的,我们需要先开启这个模块。

开启Exif模块需要mbstring支持,所以先来安装mbstring,以下是以Linux环境为例,其它环境类似。

安装mbstring模块

首先找到PHP源码包位置,直接进入ext/mbstring,执行以下命令安装,具体参数得看自己的环境。

代码如下:
PHP/ext/mbstring [root@lee mbstring]# /usr/local/webserver/PHP/bin/PHPize Configuring for: PHP Api Version: 20090626 Zend Module Api No: 20090626 Zend Extension Api No: 220090626 [root@lee exif]# ./configure --with-PHP-config=/usr/local/webserver/PHP/bin/PHP-config [root@lee mbstring]# make && make install Installing shared extensions: /usr/local/webserver/PHP/lib/PHP/extensions/no-debug-non-zts-20090626/ Installing header files: /usr/local/webserver/PHP/include/PHP/ [root@lee mbstring]#

安装好以后,我们可以进入extensions目录看看模块是否存在,存在表示安装成功。

代码如下:
PHP/lib/PHP/extensions/no-debug-non-zts-20090626/ [root@lee no-debug-non-zts-20090626]# ll 总用量 1880 -rwxr-xr-x. 1 root root 414405 6月 12 2012 eaccelerator.so -rwxr-xr-x. 1 root root 1091242 9月 23 2011 imagick.so -rwxr-xr-x. 1 root root 5285 2月 20 15:07 mbstring.so -rwxr-xr-x. 1 root root 246752 9月 23 2011 memcache.so -rwxr-xr-x. 1 root root 154252 9月 23 2011 pdo_MysqL.so

安装exif模块

同安装mbstring模块类似,先找到源码位置并cd进去并配置安装,具体参数得看自己的环境。

代码如下:
PHP-5.3.13/ext/exif [root@lee exif]# ./configure --with-PHP-config=/usr/local/webserver/PHP/bin/PHP-config [root@lee exif]# make && make install Installing shared extensions: /usr/local/webserver/PHP/lib/PHP/extensions/no-debug-non-zts-20090626/ [root@lee exif]#

进入extensions目录验证是否安装成功

代码如下:
PHP/lib/PHP/extensions/no-debug-non-zts-20090626/ [root@lee no-debug-non-zts-20090626]# ll 总用量 2036 -rwxr-xr-x. 1 root root 414405 6月 12 2012 eaccelerator.so -rwxr-xr-x. 1 root root 158554 2月 20 15:25 exif.so -rwxr-xr-x. 1 root root 1091242 9月 23 2011 imagick.so -rwxr-xr-x. 1 root root 5285 2月 20 15:07 mbstring.so -rwxr-xr-x. 1 root root 246752 9月 23 2011 memcache.so -rwxr-xr-x. 1 root root 154252 9月 23 2011 pdo_MysqL.so [root@lee no-debug-non-zts-20090626]#

exif.so模块已经存在。

PHP.ini中添加模块 打开PHP.ini添加以下两行

代码如下:
.so" extension = "exif.so"
并且确认你的extension_dir值与你安装模块时提示的Installing shared extensions值一致,比如我安装模块时提示我的extensions位置是
代码如下:
PHP/lib/PHP/extensions/no-debug-non-zts-20090626/
那么你的PHP.ini里的extension_dir要指向正确目录
代码如下:
PHP/lib/PHP/extensions/no-debug-non-zts-20090626/"
保存PHP.ini,重启webserver。 打开PHPinfo()找到相应属性看看是否已正常工作

正常情况下你会看到如下两个模块信息

使用exif_read_data()读取图片的exif信息

支持读取exif信息的图片类型在PHPinfo里已经写明了,只能是jpeg或者tiff类型,其中jpeg是常用类型,这就已经足够。 我们来看看exif_read_data()函数的使用手册

代码如下:

参数:

filename :要读取图片exif信息的图片路径,这里不能是URL sections:是需要存在于文件中的逗号分隔的区段列表用来产生结果数组。如果未找到所请求的区段则返回值为 FALSE。

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

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

thumbnail : 当设定为 TRUE 时,读取缩略图本身。否则只读取标记数据。

我们来读取一张图片的exif信息试试
<div class="codetitle"><a style="CURSOR: pointer" data="50321" class="copybut" id="copybut50321" onclick="doCopy('code50321')"> 代码如下:<div class="codebody" id="code50321">
<?PHP
$exif = getExif('a.jpg');
echo '

';
print_r($exif);
echo '
';

执行结果:
代码如下:
a.jpg [FileDateTime] => 1361340032 [FileSize] => 69170 [FileType] => 2 [MimeType] => image/jpeg [SectionsFound] => ANY_TAG,IFD0,THUMBNAIL,EXIF,GPS,INTEROP [COmpuTED] => Array ( [html] => width="600" height="397" [Height] => 397 [Width] => 600 [IsColor] => 1 [ByteOrderMotorola] => 1 [ApertureFNumber] => f/13.0 [Focusdistance] => 3.76m [UserComment] => [UserCommentEncoding] => ASCII [copyright] => [Thumbnail.FileType] => 2 [Thumbnail.MimeType] => image/jpeg ) [ImageWidth] => 4928 [ImageLength] => 3264 [BitsPerSample] => Array ( [0] => 8 [1] => 8 [2] => 8 ) [PhotometricInterpretation] => 2 [Make] => NIKON CORPORATION [Model] => NIKON D7000 [Orientation] => 1 [SamplesPerPixel] => 3 [XResolution] => 3000000/10000 [YResolution] => 3000000/10000 [ResolutionUnit] => 2 [Software] => Adobe Photoshop CS5 Windows [DateTime] => 2013:02:18 20:50:46 [WhitePoint] => Array ( [0] => 313/1000 [1] => 329/1000 ) [Primarychromaticities] => Array ( [0] => 64/100 [1] => 33/100 [2] => 21/100 [3] => 71/100 [4] => 15/100 [5] => 6/100 ) [ycbcrCoefficients] => Array ( [0] => 299/1000 [1] => 587/1000 [2] => 114/1000 ) [ycbcrPositioning] => 2 [copyright] => [Exif_IFD_Pointer] => 500 [GPS_IFD_Pointer] => 1248 [THUMBNAIL] => Array ( [Compression] => 6 [XResolution] => 72/1 [YResolution] => 72/1 [ResolutionUnit] => 2 [JPEGInterchangeFormat] => 1362 [JPEGInterchangeFormatLength] => 4784 ) [ExposureTime] => 40/10 [FNumber] => 130/10 [ExposureProgram] => 1 [ISOSpeedratings] => 1000 [UndefinedTag:0x8830] => 2 [ExifVersion] => 0230 [DateTimeOriginal] => 2013:02:14 21:12:08 [DateTimeDigitized] => 2013:02:14 21:12:08 [ComponentsConfiguration] =>  [CompressedBitsPerPixel] => 4/1 [ShutterSpeedValue] => -2/1 [ApertureValue] => 7400879/1000000 [ExposureBiasValue] => 2/6 [MaxApertureValue] => 36/10 [Subjectdistance] => 376/100 [MeteringMode] => 3 [LightSource] => 0 [Flash] => 16 [FocalLength] => 180/10 [UserComment] => ASCII [SubSecTime] => 10 [SubSecTimeOriginal] => 10 [SubSecTimeDigitized] => 10 [FlashPixVersion] => 0100 [ColorSpace] => 65535 [ExifImageWidth] => 600 [ExifImageLength] => 397 [InteroperabilityOffset] => 1216 [SensingMethod] => 2 [FileSource] =>  [SceneType] =>  [CFAPattern] =>  [Customrendered] => 0 [ExposureMode] => 1 [WhiteBalance] => 0 [DigitalZoomratio] => 1/1 [FocalLengthIn35mmFilm] => 27 [SceneCaptureType] => 0 [GainControl] => 2 [Contrast] => 0 [Saturation] => 0 [Sharpness] => 0 [SubjectdistanceRange] => 0 [UndefinedTag:0xA500] => 22/10 [GPsversion] =>  [InterOperabilityIndex] => R03 [InterOperabilityVersion] => 0100 )

如果提示

代码如下:
Fatal error: Call to undefined function exif_read_data() in /data0/htdocs/www/exif/index.PHP on line 2
则表示模块没有打开,可能是你配置哪一块没有配置好,重新配置就好。

从Exif信息读取结果中取出有用的信息

从以上的执行结果我们发现图片Exif很多,我们只需要从中过滤掉垃圾信息剩下有用的就好。本例就以常用的参数为前提写一个PHP函数。常用的参数包括快门,器材名称,光圈,感光度,焦距:

代码如下:
function getExif($img){

$exif = exif_read_data($img,'IFD0');

return array (
'文件名' => $exif['FileName'],
'器材品牌' => $exif['Make'],
'器材' => $exif['Model'],
'快门' => $exif['ExposureTime'],
'光圈' => $exif['FNumber'],
'焦距' => $exif['FocalLength'],
'感光度' => $exif['ISOSpeedratings']
);

}

读取照片

代码如下:
PHP $exifInfo = getExif('a.jpg'); echo '
';
print_r($exifInfo);
echo '
';
执行结果:
代码如下:
25556306.jpg [器材品牌] => NIKON CORPORATION [器材] => NIKON D3100 [快门] => 10/32000 [光圈] => 18/10 [焦距] => 350/10 [感光度] => 100 )

其它说明

图片的Exif值是可以通过相应工具修改的,所以使用程序读取图片的Exif值只能用做参考,不做真实依据。

感兴趣的朋友也可以访问在线读取Exif信息网站http://exif.cn玩玩

通过PHP模块读取的Exif信息偶尔会错,或者信息不全,这种情况下,我们可以通过第三方工具。然后利用PHP执行系统linux命令读取

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...