haohailuo 发表于 2010-5-27 22:05:38

获取照片的exif信息的类库

本帖最后由 haohailuo 于 2010-5-28 07:14 编辑

刚看到论坛中langziyang发布了“CI有没有读取照片的exif信息?”的求助信息,相信同样有些人需要这个功能的,特分享此类库:

返回的信息见图片:

代码如下:

<?php
/**
* FILE_NAME : Image.php
* 图片处理类
*
* @package                haohailuo
* @author                By Laurence.xu <haohailuo@163.com>
* @copyright        Copyright (c) 2010, Haohailuo, Inc.
* @link                http://www.haohailuo.com
* @since                Version 1.0 $Id$
* @version                Thu Jan 27 21:19:53 CST 2010
* @filesource
*/
class Image {
       
        var $imgtype = array();                                //图片类型
        var $orientation = array();                        //位置信息
        var $resolution_unit = array();                //分辨率单位
        var $ycb_cr_positioning = array();        //YCbCr位置控制
        var $exposure_program = array();        //曝光
        var $metering_mode_arr = array();        //测光模式
        var $lightsource_arr = array();                //光源信息
        var $flash_arr = array();                        //闪光灯
        /**
       * 构造函数
       *
        */
        function __construct(){
                $this->Image();
        }
       
        function Image() {
                $this->imgtype = array("", "GIF", "JPG", "PNG", "SWF", "PSD", "BMP", "TIFF(intel byte order)", "TIFF(motorola byte order)", "JPC", "JP2", "JPX", "JB2", "SWC", "IFF", "WBMP", "XBM");
                $this->orientation = array("", "top left side", "top right side", "bottom right side", "bottom left side", "left side top", "right side top", "right side bottom", "left side bottom");
                $this->resolution_unit = array("", "", "英寸", "厘米");
                $this->ycb_cr_positioning = array("", "the center of pixel array", "the datum point");
                $this->exposure_program = array("未定义", "手动", "标准程序", "光圈先决", "快门先决", "景深先决", "运动模式", "肖像模式", "风景模式");
                $this->metering_mode_arr = array("0" => "未知","1" => "平均",        "2" => "中央重点平均测光",        "3" => "点测","4" => "分区","5" => "评估","6" => "局部","255" => "其他");
                $this->lightsource_arr = array("0" => "未知","1" => "日光","2" => "荧光灯","3" => "钨丝灯","10" => "闪光灯","17" => "标准灯光A","18" => "标准灯光B","19" => "标准灯光C","20" => "D55","21" => "D65","22" => "D75","255" => "其他");
                $this->flash_arr = array(
                        "0" => "flash did not fire",
                        "1" => "flash fired",
                        "5" => "flash fired but strobe return light not detected",
                        "7" => "flash fired and strobe return light detected",
                );
               
                log_message('debug', "The Extend Image Class Initialized");
        }
       
        /**
       * 一个全面获取图象信息的函数
       *
       * @see                get_img_info()
       * @author        Laurence.xu <haohailuo@163.com>
       * @version        Thu May 27 21:26:36 CST 2010
       * @param        <string> $image 图片路径
       * @return        <array> $info 图片信息数组
        */
        function get_img_info($image) {
                $exif = exif_read_data($image, "IFD0");
                if ($exif === false) {
                        $new_img_info = array ("文件信息" => "没有图片EXIF信息");
                } else {
                        $exif = exif_read_data ($image, 0, true);
                        $new_img_info = array (
                                "文件信息"                => "----------------------------",
                                "文件名"                        => $exif['FILE']['FileName'],
                                "文件类型"                => $this->imgtype[$exif['FILE']['FileType']],
                                "文件格式"                => $exif['FILE']['MimeType'],
                                "文件大小"                => $exif['FILE']['FileSize'],
                                "时间戳"                        => date("Y-m-d H:i:s",$exif['FILE']['FileDateTime']),
                                "图像信息"                => "-----------------------------",
                                "图片说明"                => $exif['IFD0']['ImageDescription'],
                                "制造商"                        => $exif['IFD0']['Make'],
                                "型号"                        => $exif['IFD0']['Model'],
                                "方向"                        => $this->orientation[$exif['IFD0']['Orientation']],
                                "水平分辨率"                => $exif['IFD0']['XResolution'].$this->resolution_unit[$exif['IFD0']['ResolutionUnit']],
                                "垂直分辨率"                => $exif['IFD0']['YResolution'].$this->resolution_unit[$exif['IFD0']['ResolutionUnit']],
                                "创建软件"                => $exif['IFD0']['Software'],
                                "修改时间"                => $exif['IFD0']['DateTime'],
                                "作者"                        => $exif['IFD0']['Artist'],
                                "YCbCr位置控制"        => $this->ycb_cr_positioning[$exif['IFD0']['YCbCrPositioning']],
                                "版权"                        => $exif['IFD0']['Copyright'],
                                "摄影版权"                => $exif['COMPUTED']['Copyright.Photographer'],
                                "编辑版权"                => $exif['COMPUTED']['Copyright.Editor'],
                                "拍摄信息"                => "-----------------------------",
                                "Exif版本"                => $exif['EXIF']['ExifVersion'],
                                "FlashPix版本"        => "Ver. ".number_format($exif['EXIF']['FlashPixVersion']/100,2),
                                "拍摄时间"                => $exif['EXIF']['DateTimeOriginal'],
                                "数字化时间"                => $exif['EXIF']['DateTimeDigitized'],
                                "拍摄分辨率高"        => $exif['COMPUTED']['Height'],
                                "拍摄分辨率宽"        => $exif['COMPUTED']['Width'],
                                /*
                                The actual aperture value of lens when the image was taken.
                                Unit is APEX.
                                To convert this value to ordinary F-number(F-stop),
                                calculate this value's power of root 2 (=1.4142).
                                For example, if the ApertureValue is '5', F-number is pow(1.41425,5) = F5.6.
                                */
                                "光圈"                        => $exif['EXIF']['ApertureValue'],
                                "快门速度"                => $exif['EXIF']['ShutterSpeedValue'],
                                "快门光圈"                => $exif['COMPUTED']['ApertureFNumber'],
                                "最大光圈值"                => "F".$exif['EXIF']['MaxApertureValue'],
                                "曝光时间"                => $exif['EXIF']['ExposureTime'],
                                "F-Number"                => $exif['EXIF']['FNumber'],
                                "测光模式"                => $this->_get_img_info_val($exif['EXIF']['MeteringMode'],$this->metering_mode_arr),
                                "光源"                        => $this->_get_img_info_val($exif['EXIF']['LightSource'], $this->lightsource_arr),
                                "闪光灯"                        => $this->_get_img_info_val($exif['EXIF']['Flash'], $this->flash_arr),
                                "曝光模式"                => ($exif['EXIF']['ExposureMode'] == 1 ? "手动" : "自动"),
                                "白平衡"                        => ($exif['EXIF']['WhiteBalance'] == 1 ? "手动" : "自动"),
                                "曝光程序"                => $this->exposure_program[$exif['EXIF']['ExposureProgram']],
                                /*
                                Brightness of taken subject, unit is APEX. To calculate Exposure(Ev) from BrigtnessValue(Bv), you must add SensitivityValue(Sv).
                                Ev=Bv+Sv Sv=log((ISOSpeedRating/3.125),2)
                                ISO100:Sv=5, ISO200:Sv=6, ISO400:Sv=7, ISO125:Sv=5.32.
                                */
                                "曝光补偿"                => $exif['EXIF']['ExposureBiasValue']."EV",
                                "ISO感光度"                => $exif['EXIF']['ISOSpeedRatings'],
                                "分量配置"                => (bin2hex($exif['EXIF']['ComponentsConfiguration']) == "01020300" ? "YCbCr" : "RGB"),//'0x04,0x05,0x06,0x00'="RGB" '0x01,0x02,0x03,0x00'="YCbCr"
                                "图像压缩率"                => $exif['EXIF']['CompressedBitsPerPixel']."Bits/Pixel",
                                "对焦距离"                => $exif['COMPUTED']['FocusDistance']."m",
                                "焦距"                        => $exif['EXIF']['FocalLength']."mm",
                                "等价35mm焦距"        => $exif['EXIF']['FocalLengthIn35mmFilm']."mm",
                                /*
                                Stores user comment. This tag allows to use two-byte character code or unicode. First 8 bytes describe the character code. 'JIS' is a Japanese character code (known as Kanji).
                                '0x41,0x53,0x43,0x49,0x49,0x00,0x00,0x00':ASCII
                                '0x4a,0x49,0x53,0x00,0x00,0x00,0x00,0x00':JIS
                                '0x55,0x4e,0x49,0x43,0x4f,0x44,0x45,0x00':Unicode
                                '0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00':Undefined
                                */
                                "用户注释编码"        => $exif['COMPUTED']['UserCommentEncoding'],
                                "用户注释"                => $exif['COMPUTED']['UserComment'],
                                "色彩空间"                => ($exif['EXIF']['ColorSpace'] == 1 ? "sRGB" : "Uncalibrated"),
                                "Exif图像宽度"        => $exif['EXIF']['ExifImageLength'],
                                "Exif图像高度"        => $exif['EXIF']['ExifImageWidth'],
                                "文件来源"                => (bin2hex($exif['EXIF']['FileSource']) == 0x03 ? "digital still camera" : "unknown"),
                                "场景类型"                => (bin2hex($exif['EXIF']['SceneType']) == 0x01 ? "A directly photographed image" : "unknown"),
                                "缩略图文件格式"        => $exif['COMPUTED']['Thumbnail.FileType'],
                                "缩略图Mime格式"        => $exif['COMPUTED']['Thumbnail.MimeType']
                        );
                }
                return $new_img_info;
        }
       
        /**
       * 获取图象信息的函数
       *
       * @see                getImageInfo()
       * @author        Laurence.xu <haohailuo@163.com>
       * @version        Thu May 27 21:22:43 CST 2010
       * @param        <string> $img_info 图片信息
       * @param        <array> $val_arr 值
       * @return        <string> $info_val
        */
        function _get_img_info_val($img_info, $val_arr) {
                $info_val = "未知";
                foreach($val_arr as $name=>$val) {
                        if ($name == $img_info) {
                                $info_val =& $val;
                                break;
                        }
                }
                return $info_val;
        }
}

/* End of file Image.php */
/* Location: ./www/libraries/Image.php */



附件下载:

Hex 发表于 2010-5-28 00:00:45

难得总版发布好东西!前来祝贺~~~~

songah 发表于 2010-5-28 08:42:51

不错,顶一个

baiyuxiong 发表于 2010-5-28 20:07:25

主要是利用了php自带的函数:
exif_read_data

matchbox 发表于 2010-5-28 21:58:26

本帖最后由 matchbox 于 2010-5-28 22:04 编辑

能给个用的实例么?我试了几次都没成功提取。可能我太菜

rosen 发表于 2010-7-1 21:30:39

还是版主强。马上实验一把
页: [1]
查看完整版本: 获取照片的exif信息的类库