什么是Exif?
Exif是一种图象文件格式,它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图等。简单地说,Exif=JPEG+拍摄参数。因此,你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息。
默认情况下,PHP读取图片Exif信息模块是不开启的,我们需要先开启这个模块。
开启Exif模块需要mbstring支持,所以先来安装mbstring,以下是以Linux环境为例,其它环境类似。
安装mbstring模块
首先找到php源码包位置,直接进入ext/mbstring,执行以下命令安装,具体参数得看自己的环境。
1 2 3 4 5 6 7 8 9 10 11 |
|
安装好以后,我们可以进入extensions目录看看模块是否存在,存在表示安装成功。
1 2 3 4 5 6 7 8 |
|
安装exif模块
同安装mbstring模块类似,先找到源码位置并cd进去并配置安装,具体参数得看自己的环境
1 2 3 4 5 |
|
进入extensions目录验证是否安装成功
1 2 3 4 5 6 7 8 9 10 |
|
exif.so模块已经存在。
在php.ini中添加模块
打开php.ini添加以下两行
extension = "mbstring.so"
extension = "exif.so"
并且确认你的extension_dir值与你安装模块时提示的Installingshared extensions值一致,比如我安装模块时提示我的extensions位置是
/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/
那么你的php.ini里的extension_dir要指向正确目录
extension_dir="/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20090626/"
保存php.ini,重启webserver。
打开phpinfo()找到相应属性看看是否已正常工作
正常情况下你会看到如下两个模块信息
支持读取exif信息的图片类型在phpinfo里已经写明了,只能是jpeg或者tiff类型,其中jpeg是常用类型,这就已经足够。
我们来看看exif_read_data()函数的使用手册
1 |
|
参数:
filename :要读取图片exif信息的图片路径,这里不能是URL
sections:是需要存在于文件中的逗号分隔的区段列表用来产生结果数组。如果未找到所请求的区段则返回值为 FALSE。
FILE |
FileName, FileSize, FileDateTime, SectionsFound |
COMPUTED |
html,Width,Height,IsColor,可能有更多其它的。Height 和 Width 是用和 getimagesize() 一样的方法计算的,因此它们的值不能是任何返回的头信息的部分。此外 html 是一个 height/width 的文本字符串可以用于普通的HTML 中。 |
ANY_TAG |
任何包含有标记的信息,例如 IFD0,EXIF,... |
IFD0 |
所有 IFD0 的标记数据。在标准的图像文件中这包含了图像大小及其它。 |
THUMBNAIL |
如果有第二个 IFD,文件应该包含有缩略图。所有有关嵌入缩略图的标记信息都存储在本区。 |
COMMENT |
JPEG 图像的注释头信息。 |
EXIF |
EXIF 区段是 IFDO 的子区,包含有图像的更多详细信息。大多数内容都是数码相机相关的。 |
arrays :指定了是否每个区段都成为一个数组。sectionsCOMPUTED,THUMBNAIL 和COMMENT 区段总是成为数组,因为它们里面包含的名字和其它区段冲突。
thumbnail : 当设定为 TRUE 时,读取缩略图本身。否则只读取标记数据。
我们来读取一张图片的exif信息试试
1 2 3 4 5 |
|
执行结果:
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] => [1]
如果提示:
Fatalerror: Call to undefined function exif_read_data() in/data0/htdocs/www/exif/index.php on line 2
则表示模块没有打开,可能是你配置哪一块没有配置好,重新配置就好。
从以上的执行结果我们发现图片Exif很多,我们只需要从中过滤掉垃圾信息剩下有用的就好。本例就以常用的参数为前提写一个PHP函数。常用的参数包括快门,器材名称,光圈,感光度,焦距
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
读取照片
1 2 3 4 5 |
|
执行结果:
Array
(
[文件名] => 25556306.jpg
[器材品牌] => NIKON CORPORATION
[器材] => NIKON D3100
[快门] => 10/32000
[光圈] => 18/10
[焦距] => 350/10
[感光度] => 100
)
图片的Exif值是可以通过相应工具修改的,所以使用程序读取图片的Exif值只能用做参考,不做真实依据。
感兴趣的朋友也可以访问在线读取Exif信息网站http://exif.cn玩玩
通过PHP模块读取的Exif信息偶尔会错,或者信息不全,这种情况下,我们可以通过第三方工具。然后利用php执行系统linux命令读取