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


Posted in PHP onAugust 20, 2014

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

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

以上引自百度百科。

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

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

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

PHP中读取照片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 = "mbstring.so"

extension = "exif.so"

并且确认你的extension_dir值与你安装模块时提示的Installing shared 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()找到相应属性看看是否已正常工作

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

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

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

使用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 是用和 getimagesize() 一样的方法计算的,因此它们的值不能是任何返回的头信息的部分。此外 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信息网站http://exif.cn玩玩

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

PHP 相关文章推荐
php 数组的创建、调用和更新实现代码
Mar 09 PHP
PHP 翻页 实例代码
Aug 07 PHP
PHP 采集获取指定网址的内容
Jan 05 PHP
php使用strtotime和date函数判断日期是否有效代码分享
Dec 25 PHP
PHP+shell实现多线程的方法
Jul 01 PHP
PHP中Restful api 错误提示返回值实现思路
Apr 12 PHP
详解Yii2.0使用AR联表查询实例
Jun 16 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
详细解读php的命名空间(二)
Feb 21 PHP
详解PHP变量传值赋值和引用赋值变量销毁
Mar 23 PHP
PHP函数eval()介绍和使用示例
Aug 20 #PHP
PHP命令行脚本接收传入参数的三种方式
Aug 20 #PHP
PHP中IP地址与整型数字互相转换详解
Aug 20 #PHP
PHP函数http_build_query使用详解
Aug 20 #PHP
PHP函数in_array()使用详解
Aug 20 #PHP
PHP中使用json数据格式定义字面量对象的方法
Aug 20 #PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
Aug 19 #PHP
You might like
php Try Catch异常测试
2009/03/01 PHP
phpmail类发送邮件函数代码
2012/02/20 PHP
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
php实现PDO中捕获SQL语句错误的方法
2017/02/16 PHP
Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解
2017/03/02 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
PHP autoload使用方法及步骤详解
2020/09/05 PHP
JavaScript While 循环基础教程
2007/04/05 Javascript
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
2015/09/14 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
原生JavaScript实现刮刮乐
2020/09/29 Javascript
python判断端口是否打开的实现代码
2013/02/10 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
Python爬虫进阶之爬取某视频并下载的实现
2020/12/08 Python
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
新西兰最大、占有率最高的综合性药房:PharmacyDirect药房中文网
2020/11/03 全球购物
一道SQL面试题
2012/12/31 面试题
授权委托书格式模板
2014/04/03 职场文书
市级绿色学校申报材料
2014/08/25 职场文书
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
个人债务授权委托书
2014/10/17 职场文书
张思德观后感
2015/06/09 职场文书
心术观后感
2015/06/11 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
go原生库的中bytes.Buffer用法
2021/04/25 Golang
MySQL query_cache_type 参数与使用详解
2021/07/01 MySQL