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,执行以下命令安装,具体参数得看自己的环境。
[root@lee ext]# cd /data0/software/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目录看看模块是否存在,存在表示安装成功。
[root@lee mbstring]# cd /usr/local/webserver/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进去并配置安装,具体参数得看自己的环境。
[root@lee exif]# cd /data0/software/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目录验证是否安装成功
[root@lee exif]# cd /usr/local/webserver/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添加以下两行
extension = "exif.so"
并且确认你的extension_dir值与你安装模块时提示的installing shared extensions值一致,比如我安装模块时提示我的extensions位置是
那么你的php.ini里的extension_dir要指向正确目录
保存php.ini,重启webserver。
打开phpinfo()找到相应属性看看是否已正常工作
正常情况下你会看到如下两个模块信息
使用exif_read_data()读取图片的exif信息
支持读取exif信息的图片类型在phpinfo里已经写明了,只能是jpeg或者tiff类型,其中jpeg是常用类型,这就已经足够。
我们来看看exif_read_data()函数的使用手册
array exif_read_data ( string $filename [, string $sections = null [, bool $arrays = false [, bool $thumbnail = false ]]] )
参数:
filename :要读取图片exif信息的图片路径,这里不能是url
sections:是需要存在于文件中的逗号分隔的区段列表用来产生结果数组。如果未找到所请求的区段则返回值为 false。
file | filename, filesize, filedatetime, sectionsfound |
computed | html,width,height,iscolor,可能有更多其它的。height 和 width 是用和 一样的方法计算的,因此它们的值不能是任何返回的头信息的部分。此外 html 是一个 height/width 的文本字符串可以用于普通的html 中。 |
any_tag | 任何包含有标记的信息,例如 ifd0,exif,... |
ifd0 | 所有 ifd0 的标记数据。在标准的图像文件中这包含了图像大小及其它。 |
thumbnail | 如果有第二个 ifd,文件应该包含有缩略图。所有有关嵌入缩略图的标记信息都存储在本区。 |
comment | jpeg 图像的注释头信息。 |
exif | exif 区段是 ifdo 的子区,包含有图像的更多详细信息。大多数内容都是数码相机相关的。 |
arrays :指定了是否每个区段都成为一个数组。sections computed,thumbnail 和comment 区段总是成为数组,因为它们里面包含的名字和其它区段冲突。
thumbnail : 当设定为 true 时,读取缩略图本身。否则只读取标记数据。
我们来读取一张图片的exif信息试试
<?php
$exif = getexif('a.jpg');
echo '<pre>';
print_r($exif);
echo '</pre>';
执行结果:
array
(
[filename] => 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函数。常用的参数包括快门,器材名称,光圈,感光度,焦距:
<?php
/**
* 读取jpeg图片的exif信息
* $img 为图片路径
*
* 琼台博客
*/
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 '<pre>';
print_r($exifinfo);
echo '</pre>';
执行结果:
array
(
[文件名] => 25556306.jpg
[器材品牌] => nikon corporation
[器材] => nikon d3100
[快门] => 10/32000
[光圈] => 18/10
[焦距] => 350/10
[感光度] => 100
)
其它说明
图片的exif值是可以通过相应工具修改的,所以使用程序读取图片的exif值只能用做参考,不做真实依据。
感兴趣的朋友也可以访问在线读取exif信息网站玩玩
通过php模块读取的exif信息偶尔会错,或者信息不全,这种情况下,我们可以通过第三方工具。然后利用php执行系统linux命令读取
上一篇: cdr怎样将一个圆形平均划分为三等分?