PHP如何读取照片的Exif信息

什么是Exif

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

例子

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

full

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

full

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

开启PHP模块

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

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

首先找到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()找到相应属性看看是否已正常工作,正常情况下你会看到如下两个模块信息

full full

读取图片Exif信息

支持读取Exif信息的图片类型在phpinfo里已经写明了,只能是jpeg或者tiff类型,其中jpeg是常用类型,这就已经足够。

我们来看看exif_read_data()函数的使用手册

array exif_read_data ( string $filename [, string $sections = NULL [, bool $arrays = false [, bool $thumbnail = false ]]] )

我们来读取一张图片的exif信息试试

<?php
$exif = getExif('a.jpg');
print_r($exif);
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函数。常用的参数包括快门,器材名称,光圈,感光度,焦距

/**
 * 读取jpeg图片的Exif信息
 * $img 为图片路径
 *
 * 琼台博客 www.qttc.net
 */

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']
  );
}

$exifInfo = getExif('a.jpg');
print_r($exifInfo);

Output:

Array
(
  [文件名] => 25556306.jpg
  [器材品牌] => NIKON CORPORATION
  [器材] => NIKON D3100
  [快门] => 10/32000
  [光圈] => 18/10
  [焦距] => 350/10
  [感光度] => 100
)

其它说明

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

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

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

分享

TITLE: PHP如何读取照片的Exif信息

LINK: https://www.qttc.net/278-php-read-exif-from-photo.html

NOTE: 原创内容,转载请注明出自琼台博客