说说PHP的exif_read_data函数

36
0
0
2024-11-23 16:29

最近想在照片上传后,获取照片的相机信息和地理位置坐标,需要用到exif_read_data这个函数,我们先来看下这个方法的文档:

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

exif_read_data()从图像文件中读取EXIF标头。这样您就可以读取数码相机生成的元数据。

EXIF标题通常出现在数码相机生成的JPEG / TIFF图像中,但不幸的是,每个数码相机制造商对于如何实际标记图像都有不同的想法,因此您不能总是依赖特定的Exif标题。

高度宽度的计算方式与getimagesize()相同,因此它们的值不能是返回的任何标题的一部分。另外,html是在普通HTML中使用的高度/宽度文本字符串。

当Exif标题包含版权说明时,它本身可以包含两个值。由于Exif 2.10标准中的解决方案不一致,因此COMPUTED 部分将返回Copyright.PhotographerCopyright.Editor条目,而IFD0部分包含具有空字符的字节数组,分割两个条目。或者只是第一个条目,如果数据类型错误(Exif的正常行为)。该COMPUTED也会包含条目版权所有要么是原始的版权字符串,或者逗号分隔的摄像与编辑的版权的名单。

标签UserComment与版权标签具有相同的问题。它可以存储两个值。首先使用编码,其次是数值本身。如果是这样,IFD部分只包含编码或字节数组。该COMPUTED节将同时存储在各个入口UserCommentEncodingUserComment在。条目UserComment在两种情况下均可用,所以应优先使用IFD0部分中的值。

exif_read_data()还根据EXIF规范验证EXIF数据标签。

注意:Windows Me / XP可以在连接相机时擦除Exif标头。

参数

stream

图像文件的位置。这可以是文件的路径(也可以像往常一样支持流封装)或流资源。

sections

是逗号分隔的部分列表,需要在文件中出现才能生成结果数组。如果没有找到请求的部分,则返回值为FALSE

文件

FileName,FileSize,FileDateTime,SectionsFound

COMPUTED

HTML,宽度,高度,IsColor等(如果可用)。高度和宽度的计算方式与getimagesize()相同,因此它们的值不能是返回的任何标题的一部分。另外,html是在普通HTML中使用的高度/宽度文本字符串。

ANY_TAG

任何具有标签的信息,例如IFD0,EXIF,...

IFD0

IFD0的所有标记的数据。在正常的图像文件中包含图像大小等等。

THUMBNAIL

如果文件具有第二个IFD,则应该包含缩略图。所有关于嵌入式缩略图的标记信息都存储在本节中。

COMMENT

评论JPEG图像的标题。

EXIF

EXIF部分是IFD0的子部分。它包含更多关于图像的详细信息。这些条目中的大部分都与数码相机有关。

arrays

指定每个部分是否成为一个数组。 COMPUTED,THUMBNAIL和COMMENT节总是成为数组,因为它们可能包含名称与其他节相冲突的值。

thumbnail

当设置为TRUE时,缩略图本身被读取。 否则,只有标记的数据被读取。

返回值

它返回一个关联数组,其中数组索引是标题名称,数组值是与这些标题相关联的值。 如果没有数据可以返回,exif_read_data()将返回FALSE。

更新日志

描述

7.2.0

filename参数已重命名为流,现在支持本地文件或流资源。

7.2.0

增加了对以下EXIF格式的支持:三星DJI松下索尼宾得美能达Sigma / Foveon AGFA京瓷理光爱普生

4.3.0

可以读取所有嵌入的IFD数据,包括数组(如此返回)。此外,嵌入式缩略图的大小在THUMBNAIL子数组中返回,并且可以返回TIFF格式的缩略图。而且,返回值不再有最大长度(直到达到内存限制)。

4.3.0

如果PHP支持mbstring,用户注释可以自动更改编码。另外,如果用户评论使用Unicode或JIS编码,则该编码将根据php.ini中的exif ini设置自动更改

4.3.0

如果图像包含任何IFD0数据,则COMPUTED包含ByteOrderMotorola条目,对于little-endian(intel)为0,对于big-endian(motorola)字节顺序为1。此外,如果数据类型错误,COMPUTED和UserComment不再仅包含第一个版权条目。

Samsung,DJI,Panasonic,Sony,Pentax,Minolta,Sigma/Foveon,AGFA,Kyocera,Ricoh,Epson

调用方式也比较简单:

$exif = exif_read_data('tests/test1.jpg', 'IFD0');

不过值得注意的是,地址位置信息从手机通过浏览器直接上传到网上会丢失,我单独写了篇文章做下说明,参数很多,都是英文的,也不好理解,所以我罗列下解释:

<?php  


/** 
* @Author: TonyLevid 
* @Copyright: TonyLevid.com 
* @Name: Image Exif Class 
* @Version: 0.0.1 
* 欢迎各位测试,如有BUG,请到网站留言 
* I'm pleased if you are willing to test my Image Exif class,if bug exists,you can leave a message. 
**/  
  
//error_reporting(0);   不想让用户看到错误如果存在bug  
header("content-type:text/html;charset=utf-8");   //如果在html页面已经设置编码,请删除此行  
class imgExif{  
    public $imgPath;  
    public $unitFlag;  
    public $imgInfoAll;  
    public $imgInfoAllCN;  
    public $imgInfoCommon;  
    public $imgInfoBrief;  
    public $imgInfoAllCNUnit;  
  
    /*构造函数,检测exif和mbstring模块是否开启*/  
    function __construct(){  
        extension_loaded('exif')&&extension_loaded('mbstring') or 
            die('exif module was not loaded,please check it in php.ini<br>NOTICE:On Windows,php_mbstring.dll must be before php_exif.dll'); 
    } 
 
    /*获取图片格式,返回图片格式信息 
    *     如果只获取图片格式信息,建议采用此方法 
    * 
    * @param $imgPath(必填,字符串),图片路径,不可为url。 
    * @param $MimeOrExifOrExtension(可选,字符串),获取图片格式为Mime类型或Exif类型或图片类型文件后缀。 
    *      如果为字符串'Mime',则获取Mime图片类型。 
    *      如果为字符串'Exif',则获取Exif图片类型。 
    *      如果为字符串'Extension',则获取图片类型的文件后缀。 
    *      如果填写参数异常或缺省,则默认获取Mime图片类型。 
    */ 
 
    function getImgtype($imgPath,$MimeOrExifOrExtension = null){ 
        $exifImgtype = array( 
            'IMAGETYPE_GIF' => 1, 
            'IMAGETYPE_JPEG' => 2, 
            'IMAGETYPE_PNG' => 3, 
            'IMAGETYPE_SWF' => 4, 
            'IMAGETYPE_PSD' => 5, 
            'IMAGETYPE_BMP' => 6, 
            'IMAGETYPE_TIFF_II' => 7, //(Intel 字节顺序) 
            'IMAGETYPE_TIFF_MM' => 8, //(Motorola 字节顺序) 
            'IMAGETYPE_JPC' => 9, 
            'IMAGETYPE_JP2' => 10, 
            'IMAGETYPE_JPX' => 11, 
            'IMAGETYPE_JB2' => 12, 
            'IMAGETYPE_SWC' => 13, 
            'IMAGETYPE_IFF' => 14, 
            'IMAGETYPE_WBMP' => 15, 
            'IMAGETYPE_XBM' => 16 
            ); 
        $exifType = array_search(exif_imagetype($imgPath),$exifImgtype); 
        $mimeType = image_type_to_mime_type(exif_imagetype($imgPath)); 
        $extension = substr(image_type_to_extension(exif_imagetype($imgPath)),1); 
        if($MimeOrExifOrExtension){ 
            if($MimeOrExifOrExtension === 'Mime'){ 
                return $mimeType; 
            } 
            elseif($MimeOrExifOrExtension === 'Exif'){ 
                return $exifType; 
            } 
            elseif($MimeOrExifOrExtension === 'Extension'){ 
                return $extension; 
            } 
            else{ 
                return $mimeType; 
            } 
        } 
        else{ 
            return $mimeType; 
        } 
    } 
 
    /*处理Exif信息*/ 
    function imgInfo(){ 
        $imgPath = $this->imgPath; 
 
        $imgInfoAll = exif_read_data($imgPath,0,1); 
        foreach($imgInfoAll as $section => $arrValue){ 
            foreach($arrValue as $key => $value){ 
                $infoAllKey[] = $key; 
                $infoAllValue[] = $value; 
            } 
        } 
        $infoAll = array_combine($infoAllKey,$infoAllValue); 
 
        $translate = array( 
            'FileName'=>'文件名', 
            'FileDateTime' => '文件修改时间', 
            'FileSize' => '文件大小', 
            'FileType' => 'Exif文件类型', 
            'MimeType' => 'Mime文件类型', 
            'SectionsFound' => '找到Sections', 
            'html' => 'html中图片宽高', 
            'Height' => '图片高度', 
            'Width' => '图片宽度', 
            'IsColor' => '是否彩色', 
            'ByteOrderMotorola' => '是否为Motorola字节顺序', 
            'ApertureFNumber' => '光圈数', 
            'Comments' => '作者注释', 
            'Author' => '作者', 
            'UserComment' => '用户注释', 
            'UserCommentEncoding' => '用户注释编码', 
            'Thumbnail.FileType' => '缩略图Exif文件类型', 
            'Thumbnail.MimeType' => '缩略图Mime文件类型', 
            'Make' => '制造商', 
            'Model' => '型号', 
            'Orientation' => '方向', 
            'XResolution' => '水平分辨率', 
            'YResolution' => '垂直分辨率', 
            'ResolutionUnit' => '分辨率单位', 
            'Software' => '创建软件', 
            'DateTime' => '最后修改时间', 
            'YCbCrPositioning' => 'YCbCr位置控制', 
            'Exif_IFD_Pointer' => 'Exif图像IFD的指针', 
            'Compression' => '压缩方式', 
            'JPEGInterchangeFormat' => 'JPEG SOI偏移', 
            'JPEGInterchangeFormatLength' => 'JPEG数据字节', 
            'ExposureTime' => '曝光时间', 
            'FNumber' => '焦距比数', 
            'ExposureProgram' => '曝光程序', 
            'ISOSpeedRatings' => 'ISO感光度', 
            'ExifVersion' => 'Exif版本', 
            'DateTimeOriginal' => '拍摄时间', 
            'DateTimeDigitized' => '数字化时间', 
            'ComponentsConfiguration' => '分量配置', 
            'CompressedBitsPerPixel' => '图像压缩率', 
            'ExposureBiasValue' => '曝光补偿', 
            'MaxApertureValue' => '最大光圈值', 
            'MeteringMode' => '测光模式', 
            'LightSource' => '光源', 
            'Flash' => '闪光灯', 
            'FocalLength' => '焦距', 
            'SubSecTime' => '亚秒时间', 
            'SubSecTimeOriginal' => '亚秒级拍摄时间', 
            'SubSecTimeDigitized' => '亚秒级数字化时间', 
            'FlashPixVersion' => 'FlashPix版本', 
            'ColorSpace' => '色彩空间', 
            'ExifImageWidth' => 'Exif图片宽度', 
            'ExifImageLength' => 'EXif图片高度', 
            'InteroperabilityOffset' => 'IFD格式数据偏移量', 
            'SensingMethod' => '彩色区域传感器类型', 
            'FileSource' => '图片像源', 
            'SceneType' => '场景类型', 
            'CFAPattern' => '滤波阵列图案', 
            'CustomRendered' => '自定义图像处理', 
            'ExposureMode' => '曝光模式', 
            'WhiteBalance' => '白平衡', 
            'DigitalZoomRatio' => '数位变焦倍率', 
            'FocalLengthIn35mmFilm' => '等价35mm焦距', 
            'SceneCaptureType' => '取景模式', 
            'GainControl' => '增益控制', 
            'Contrast' => '对比度', 
            'Saturation' => '饱和度', 
            'Sharpness' => '清晰度', 
            'SubjectDistanceRange' => '对焦距离', 
            'InterOperabilityIndex' => 'InterOperability指数', 
            'InterOperabilityVersion' => 'InterOperability版本' 
            ); 
 
        @$translate_unit = array( 
            '文件名' => $infoAll['FileName'], 
            '文件修改时间' => date('Y:m:d H:i:s',$infoAll['FileDateTime']), 
            '文件大小' => round($infoAll['FileSize']/1024) . 'kb', 
            'Exif文件类型' => $this->getImgtype($imgPath,'Exif'), 
            'Mime文件类型' => $infoAll['MimeType'], 
            '找到Sections' => $infoAll['SectionsFound'], 
            'html中图片宽高' => $infoAll['html'], 
            '图片高度' => $infoAll['Height'] . 'px', 
            '图片宽度' => $infoAll['Width'] . 'px', 
            '是否彩色' => $infoAll['IsColor'] == 1 ? '是' : '否', 
            '是否为Motorola字节顺序' => $infoAll['ByteOrderMotorola'] == 1 ? '是' : '否', 
            '光圈数' => $infoAll['ApertureFNumber'], 
            '作者注释' => $infoAll['Comments'], 
            '作者' => $infoAll['Author'], 
            '用户注释' => $infoAll['UserComment'], 
            '用户注释编码' => $infoAll['UserCommentEncoding'], 
            '缩略图Exif文件类型' => $this->getImgtype($imgPath,'Exif'), 
            '缩略图Mime文件类型' => $infoAll['Thumbnail.MimeType'], 
            '制造商' => $infoAll['Make'], 
            '型号' => $infoAll['Model'], 
            '方向' => array_search($infoAll['Orientation'],array( 
                'top left side' => 1, 
                'top right side' => 2, 
                'bottom right side' => 3, 
                'bottom left side' => 4, 
                'left side top' => 5, 
                'right side top' => 6, 
                'right side bottom' => 7, 
                'left side bottom' => 8 
            )), 
            '水平分辨率' => $infoAll['XResolution'], 
            '垂直分辨率' => $infoAll['YResolution'], 
            '分辨率单位' => array_search($infoAll['ResolutionUnit'],array( 
                '无单位' => 1, 
                '英寸' => 2, 
                '厘米' => 3 
            )), 
            '创建软件' => $infoAll['Software'], 
            '最后修改时间' => $infoAll['DateTime'], 
            'YCbCr位置控制' => $infoAll['YCbCrPositioning'] == 1 ? '像素阵列的中心' : '基准点', 
            'Exif图像IFD的指针' => $infoAll['Exif_IFD_Pointer'], 
            '压缩方式' => $infoAll['Compression'] == 6 ? 'jpeg压缩' : '无压缩', 
            'JPEG SOI偏移' => $infoAll['JPEGInterchangeFormat'], 
            'JPEG数据字节' => $infoAll['JPEGInterchangeFormatLength'], 
            '曝光时间' => $infoAll['ExposureTime'] . '秒', 
            '焦距比数' => $infoAll['FNumber'], 
            '曝光程序' => array_search($infoAll['ExposureProgram'],array( 
                '手动控制' => 1, 
                '程序控制' => 2, 
                '光圈优先' => 3, 
                '快门优先' => 4, 
                '景深优先' => 5, 
                '运动模式' => 6, 
                '肖像模式' => 7, 
                '风景模式' => 8 
            )), 
            'ISO感光度' => $infoAll['ISOSpeedRatings'], 
            'Exif版本' => $infoAll['ExifVersion'], 
            '拍摄时间' => $infoAll['DateTimeOriginal'], 
            '数字化时间' => $infoAll['DateTimeDigitized'], 
            '分量配置' => $infoAll['ComponentsConfiguration'], 
            '图像压缩率' => $infoAll['CompressedBitsPerPixel'], 
            '曝光补偿' => $infoAll['ExposureBiasValue'] . '电子伏特', 
            '最大光圈值' => $infoAll['MaxApertureValue'], 
            '测光模式' => array_search($infoAll['MeteringMode'],array( 
                '未知' => 0, 
                '平均' => 1, 
                '中央重点平均测光' => 2, 
                '点测' => 3, 
                '分区' => 4, 
                '评估' => 5, 
                '局部' => 6, 
                '其他' => 255 
            )), 
            '光源' => array_search($infoAll['LightSource'],array( 
                '未知' => 0, 
                '日光灯' => 1, 
                '荧光灯' => 2, 
                '钨丝灯' => 3, 
                '闪光灯' => 10, 
                '标准灯光A' => 17, 
                '标准灯光B' => 18, 
                '标准灯光C' => 19, 
                'D55' => 20, 
                'D65' => 21, 
                'D75' => 22, 
                '其他' => 255, 
            )), 
            '闪光灯' => array_search($infoAll['Flash'],array( 
                '闪光灯未闪光' => 0, 
                '闪光灯已闪光' => 1, 
                '闪光灯已闪光但频闪观测器未检测到返回光源' => 5, 
                '闪光灯已闪光,频闪观测器检测到返回光源' => 7 
            )), 
            '焦距' => $infoAll['FocalLength'] . '毫米', 
            '亚秒时间' => $infoAll['SubSecTime'], 
            '亚秒级拍摄时间' => $infoAll['SubSecTimeOriginal'], 
            '亚秒级数字化时间' => $infoAll['SubSecTimeDigitized'], 
            'FlashPix版本' => $infoAll['FlashPixVersion'], 
            '色彩空间' => $infoAll['ColorSpace'] == 1 ? 'sRGB' : 'Uncalibrated', 
            'Exif图片宽度' => $infoAll['ExifImageWidth'] . 'px', 
            'EXif图片高度' => $infoAll['ExifImageLength'] . 'px', 
            'IFD格式数据偏移量' => $infoAll['InteroperabilityOffset'], 
            '彩色区域传感器类型' => $infoAll['SensingMethod'] == 2 ? '单色区传感器' : '其他', 
            '图片像源' => $infoAll['FileSource'] == '0x03' ? '数码相机' : '其他', 
            '场景类型' => $infoAll['SceneType'] == '0x01' ? '直接拍摄' : '其他', 
            '滤波阵列图案' => $infoAll['CFAPattern'], 
            '自定义图像处理' => $infoAll['CustomRendered'], 
            '曝光模式' => $infoAll['CustomRendered'] == 1 ? '手动' : '自动', 
            '白平衡' => $infoAll['WhiteBalance'] == 1 ? '手动' : '自动', 
            '数位变焦倍率' => $infoAll['DigitalZoomRatio'], 
            '等价35mm焦距' => $infoAll['FocalLengthIn35mmFilm'] . '毫米', 
            '取景模式' => array_search($infoAll['SceneCaptureType'],array( 
                '自动' => 0, 
                '肖像场景' => 1, 
                '景观场景' => 2, 
                '运动场景' => 3, 
                '夜景' => 4, 
                '自动曝光' => 5, 
                '光圈优先自动曝光' => 256, 
                '快门优先自动曝光' => 512, 
                '手动曝光' => 768, 
            )), 
            '增益控制' => $infoAll['GainControl'], 
            '对比度' => array_search($infoAll['Contrast'],array( 
                '低' => -1, 
                '普通' => 0, 
                '高' => 1 
            )), 
            '饱和度' => array_search($infoAll['Saturation'],array( 
                '低' => -1, 
                '普通' => 0, 
                '高' => 1 
            )), 
            '清晰度' => array_search($infoAll['Sharpness'],array( 
                '低' => -1, 
                '普通' => 0, 
                '高' => 1 
            )), 
            '对焦距离' => array_search($infoAll['SubjectDistanceRange'],array( 
                '未知' => 0, 
                '微距' => 1, 
                '近景' => 2, 
                '远景' => 3 
            )), 
            'InterOperability指数' => $infoAll['InterOperabilityIndex'], 
            'InterOperability版本' => $infoAll['InterOperabilityVersion'] 
            ); 
 
        $infoAllCNKey = array_keys($translate); 
        $infoAllCNName = array_values($translate); 
        foreach($infoAllCNKey as $value){ 
            @$infoAllCNValue[] = $infoAll[$value]; 
        } 
        $infoAllCNUnit = array_combine($infoAllCNName,array_values($translate_unit)); 
        $infoAllCN = array_combine($infoAllCNName,$infoAllCNValue); 
        $infoCommon = array( 
            $translate['FileName'] => $infoAll['FileName'], 
            $translate['DateTimeOriginal'] => $infoAll['DateTimeOriginal'], 
            $translate['MimeType'] => $infoAll['MimeType'], 
            $translate['Width'] => $infoAll['Width'], 
            $translate['Height'] => $infoAll['Height'], 
            $translate['Comments'] => $infoAll['Comments'], 
            $translate['Author'] => $infoAll['Author'], 
            $translate['Make'] => $infoAll['Make'], 
            $translate['Model'] => $infoAll['Model'], 
            $translate['CompressedBitsPerPixel'] => $infoAll['CompressedBitsPerPixel'], 
            $translate['ExposureBiasValue'] => $infoAll['ExposureBiasValue'], 
            $translate['MaxApertureValue'] => $infoAll['MaxApertureValue'], 
            $translate['MeteringMode'] => $infoAll['MeteringMode'], 
            $translate['LightSource'] => $infoAll['LightSource'], 
            $translate['Flash'] => $infoAll['Flash'], 
            $translate['FocalLength'] => $infoAll['FocalLength'], 
            $translate['SceneType'] => $infoAll['SceneType'], 
            $translate['CFAPattern'] => $infoAll['CFAPattern'], 
            $translate['CustomRendered'] => $infoAll['CustomRendered'], 
            $translate['ExposureMode'] => $infoAll['ExposureMode'], 
            $translate['WhiteBalance'] => $infoAll['WhiteBalance'], 
            $translate['DigitalZoomRatio'] => $infoAll['DigitalZoomRatio'], 
            $translate['FocalLengthIn35mmFilm'] => $infoAll['FocalLengthIn35mmFilm'], 
            $translate['SceneCaptureType'] => $infoAll['SceneCaptureType'], 
            $translate['GainControl'] => $infoAll['GainControl'], 
            $translate['Contrast'] => $infoAll['Contrast'], 
            $translate['Saturation'] => $infoAll['Saturation'], 
            $translate['Sharpness'] => $infoAll['Sharpness'], 
            $translate['SubjectDistanceRange'] => $infoAll['SubjectDistanceRange'], 
            $translate['Software'] => $infoAll['Software'], 
            $translate['DateTime'] => $infoAll['DateTime'], 
            $translate['FileSize'] => $infoAll['FileSize'] 
            ); 
        foreach($infoCommon as $cKey => $cKalue){ 
            $infoCommonUnitKeys[] = $cKey; 
            $infoCommonUnitValues[] = $translate_unit[$cKey]; 
        } 
        $infoCommonUnit = array_combine($infoCommonUnitKeys,$infoCommonUnitValues); 
 
        $infoBrief = array( 
            $translate['FileName'] => $infoAll['FileName'], 
            $translate['Width'] => $infoAll['Width'], 
            $translate['Height'] => $infoAll['Height'], 
            $translate['DateTimeOriginal'] => $infoAll['DateTimeOriginal'], 
            $translate['Make'] => $infoAll['Make'], 
            $translate['Model'] => $infoAll['Model'], 
            $translate['MimeType'] => $infoAll['MimeType'] 
            ); 
        foreach($infoBrief as $bKey => $bValue){ 
            $infoBriefUnitKeys[] = $bKey; 
            $infoBriefUnitValues[] = $translate_unit[$bKey]; 
        } 
        $infoBriefUnit = array_combine($infoBriefUnitKeys,$infoBriefUnitValues); 
 
        $this->imgInfoAll = $infoAll; 
        $this->imgInfoAllCN = $infoAllCN; 
        $this->imgInfoAllCNUnit = $infoAllCNUnit; 
        $this->imgInfoCommon = $this->unitFlag ? $infoCommonUnit : $infoCommon; 
        $this->imgInfoBrief = $this->unitFlag ? $infoBriefUnit : $infoBrief; 
    } 
 
    /*获取图片Exif信息,返回Exif信息一维数组 
    * 
    * @param $imgPath(必填,字符串),图片路径,不可为url。 
    * @param $iChoice(可选,字符串或一维数组) 
    *    此参数内置了三种模式: 
    *      如果为字符串'All',则获取所有信息; 
    *      如果为字符串'Common',则获取常用信息; 
    *      如果为字符串'Brief',则获取简要信息。 
    *    用户可以自定义数组获取精确的信息,如array('图片宽度','图片高度'),则获取图片宽度和高度。 
    *    对于异常输入或缺省,则自动获取简要信息。 
    * @param $showUnit(可选,字符串),只要不为null,则获取已经转换后的值,否则获取未转换后的值。 
    */ 
    function getImgInfo($imgPath,$iChoice = null,$showUnit = null){ 
        $this->imgPath = $imgPath; 
        $this->unitFlag = $showUnit; 
        $this->imgInfo(); 
        $this->imgInfoAllCN = $showUnit ? $this->imgInfoAllCNUnit : $this->imgInfoAllCN; 
        if($iChoice){ 
            if(is_string($iChoice)){ 
                if($iChoice === 'All'){ 
                    return $this->imgInfoAllCN; 
                } 
                elseif($iChoice === 'AllUnit'){ 
                    return $this->imgInfoAllCN; 
                } 
                elseif($iChoice === 'Common'){ 
                    return $this->imgInfoCommon; 
                } 
                elseif($iChoice === 'Brief'){ 
                    return $this->imgInfoBrief; 
                } 
                else{ 
                    return $this->imgInfoBrief; 
                } 
            } 
            elseif(is_array($iChoice)){ 
                foreach($iChoice as $value){ 
                    $arrCustomValue[] = $this->imgInfoAllCN[$value]; 
                } 
                $arrCustom = array_combine($iChoice,$arrCustomValue) or die('Ensure the array $iChoice values match $infoAll keys!'); 
                return $arrCustom; 
            } 
            else{ 
                return $this->imgInfoBrief; 
            } 
        } 
        else{ 
            return $this->imgInfoBrief; 
        } 
    } 
} 
 
//示例,同时检测脚本执行时间 
 
function exeTime(){ 
    $micro = microtime(); 
    list($usec,$sec) = explode(' ',$micro); 
    return ($sec + $usec); 
} 
 
$start = exeTime(); 
 
$i = new imgExif(); 
//echo '<font color=\'blue\'>图片格式:' . $i->getImgtype('12.jpg','Extension') . '<br><br></font>';  
$arr = $i->getImgInfo('12.jpg','All','1');  
foreach($arr as $key => $value){  
    echo $key . ': ' . $value . '<br>';  
}  
  
$end = exeTime();  
echo '<br><font color=\'red\'>脚本执行时间:' . ($end - $start) . '<br></font>';  
  
?>

还可以包含坐标值,

  "GPSLongitude" => array:3 [
    0 => "121/1"
    1 => "18/1"
    2 => "463464/10000"
  ]
  "GPSLatitude" => array:3 [
    0 => "31/1"
    1 => "21/1"
    2 => "434700/10000"
  ]
  "GPSLongitudeRef" => "E" 
  "GPSLatitudeRef" => "N"

如何讲以上信息转化为经纬度坐标值呢?几行代码就搞定:

 $latitude = $exifData['GPSLatitude'];
 longitude = $exifData['GPSLongitude'];
 $latitudeRef = strtolower($exifData['GPSLatitudeRef']);
 $longitudeRef = strtolower($exifData['GPSLongitudeRef']);
 $latitudeDegrees = $latitude[0] + $latitude[1] / 60 + $latitude[2] / 3600;
 $longitudeDegrees = $longitude[0] + $longitude[1] / 60 + $longitude[2] / 3600;
 if (strtoupper($latitudeRef) == 'S') {
     //南半球
     $latitudeDegrees = -$latitudeDegrees;
 }
 if (strtoupper($longitudeRef) == 'W') {
     //西半球
     $longitudeDegrees = -$longitudeDegrees;
 }

获取经纬度后,可以调用地图api来获取具体的地址,比如高度地图API,具体怎么申请,可以看下这篇文章:

高度地图api申请

参考文档:

exif_read_data

php获取图片完整Exif信息类 获取图片详细完整信息类

博主信息
博客数
161
昵称
性别
年龄
39
居住城市
上海市