在CodeIgniter框架中实现图片EXIF信息读取,核心依赖PHP的exif扩展,通过封装对应的功能方法,可以快速获取图片的拍摄时间、相机型号、光圈、快门等拍摄相关数据,适用于相册系统、图片管理后台等场景。

环境准备
首先需要确保PHP环境已经安装并启用了exif扩展,同时需要开启mbstring扩展,避免中文编码出现乱码问题。可以通过phpinfo()函数查看扩展是否启用,若未启用,在php.ini中添加以下配置后重启服务:
extension=exif extension=mbstring
功能实现步骤
1. 创建EXIF读取辅助函数
在CodeIgniter的application/helpers目录下创建exif_helper.php文件,封装EXIF信息读取的核心逻辑:
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* 读取图片EXIF信息
* @param string $image_path 图片绝对路径
* @return array|false 成功返回EXIF数组,失败返回false
*/
function read_image_exif($image_path)
{
// 检查文件是否存在
if (!file_exists($image_path)) {
return false;
}
// 检查文件是否为图片
$image_info = @getimagesize($image_path);
if (!$image_info) {
return false;
}
// 仅支持JPEG和TIFF格式
$allowed_types = array(IMAGETYPE_JPEG, IMAGETYPE_TIFF_II, IMAGETYPE_TIFF_MM);
if (!in_array($image_info[2], $allowed_types)) {
return false;
}
// 读取EXIF信息
$exif_data = @exif_read_data($image_path, 'ANY_TAG', true);
if (!$exif_data) {
return false;
}
// 整理常用EXIF字段
$result = array();
// 拍摄时间
if (isset($exif_data['EXIF']['DateTimeOriginal'])) {
$result['shoot_time'] = $exif_data['EXIF']['DateTimeOriginal'];
}
// 相机品牌
if (isset($exif_data['IFD0']['Make'])) {
$result['camera_make'] = $exif_data['IFD0']['Make'];
}
// 相机型号
if (isset($exif_data['IFD0']['Model'])) {
$result['camera_model'] = $exif_data['IFD0']['Model'];
}
// 光圈值
if (isset($exif_data['EXIF']['FNumber'])) {
$fnumber = $exif_data['EXIF']['FNumber'];
$result['aperture'] = 'f/' . ($fnumber[0] / $fnumber[1]);
}
// 快门速度
if (isset($exif_data['EXIF']['ExposureTime'])) {
$exposure = $exif_data['EXIF']['ExposureTime'];
if ($exposure[1] == 1) {
$result['shutter_speed'] = $exposure[0] . 's';
} else {
$result['shutter_speed'] = '1/' . $exposure[1] * $exposure[0] . 's';
}
}
// ISO值
if (isset($exif_data['EXIF']['ISOSpeedRatings'])) {
$result['iso'] = $exif_data['EXIF']['ISOSpeedRatings'];
}
// 图片宽度
$result['width'] = $image_info[0];
// 图片高度
$result['height'] = $image_info[1];
return $result;
}
2. 在控制器中调用功能
创建图片处理控制器,加载辅助函数后调用EXIF读取方法,处理上传的图片或者指定路径的图片:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Image extends CI_Controller
{
public function __construct()
{
parent::__construct();
// 加载自定义EXIF辅助函数
$this->load->helper('exif');
}
/**
* 读取指定路径图片的EXIF信息
*/
public function read_exif()
{
// 图片绝对路径,实际项目中可替换为上传后的图片路径
$image_path = FCPATH . 'uploads/test.jpg';
$exif_info = read_image_exif($image_path);
if ($exif_info) {
echo '<pre>';
print_r($exif_info);
echo '</pre>';
} else {
echo '读取EXIF信息失败,请检查图片格式或路径是否正确';
}
}
/**
* 处理上传图片并读取EXIF
*/
public function upload_image()
{
// 简单上传处理逻辑
$config['upload_path'] = FCPATH . 'uploads/';
$config['allowed_types'] = 'jpg|jpeg|tiff';
$config['max_size'] = 2048;
$this->load->library('upload', $config);
if ($this->upload->do_upload('image_file')) {
$upload_data = $this->upload->data();
$image_path = $upload_data['full_path'];
$exif_info = read_image_exif($image_path);
$data['exif_info'] = $exif_info;
$this->load->view('image_exif_result', $data);
} else {
echo $this->upload->display_errors();
}
}
}
3. 结果展示视图
创建application/views/image_exif_result.php视图文件,展示读取到的EXIF信息:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>图片EXIF信息结果</title>
</head>
<body>
<h2>图片EXIF信息</h2>
<?php if (isset($exif_info) && $exif_info): ?>
<table border="1" cellpadding="10" cellspacing="0">
<tr>
<th>字段</th>
<th>值</th>
</tr>
<?php foreach ($exif_info as $key => $value): ?>
<tr>
<td><?php echo $key; ?></td>
<td><?php echo $value; ?></td>
</tr>
<?php endforeach; ?>
</table>
<?php else: ?>
<p>未获取到EXIF信息</p>
<?php endif; ?>
</body>
</html>
注意事项
- EXIF信息仅存在于JPEG、TIFF等格式的图片中,PNG、GIF等格式无法读取EXIF数据
- 部分图片可能被编辑软件清除EXIF信息,读取时会返回空结果
- 若读取中文相机型号出现乱码,可在输出时使用
mb_convert_encoding函数转换编码 - 生产环境中建议对图片路径做安全校验,避免路径遍历漏洞
CodeIgniterEXIF信息读取拍摄数据解析PHP修改时间:2026-07-20 16:33:44