數位相片內建的 EXIF(Exchangeable Image File Format)記錄了拍攝參數(光圈、快門、ISO)、GPS 座標、裝置型號、拍攝時間等豐富中繼資料。PHP 內建 exif_read_data() 函式可輕鬆解析,本文示範基本用法與回傳結構說明。
<?php
// 讀取指定區段(IFD0 為主要影像資訊)
$exif = exif_read_data('photo.jpg', 'IFD0');
// 讀取所有區段,並以關聯陣列回傳
$exif = exif_read_data('photo.jpg', 0, true);
?>
參數說明:
$filename:圖片路徑$sections:指定讀取區段(如 'IFD0', 'EXIF', 'GPS'),0 或 null 為全部$arrays:true 回傳多維關聯陣列,false 扁平化<?php
$file = 'test.jpg';
if (!file_exists($file)) {
die("檔案不存在:$file");
}
$exif = exif_read_data($file, 0, true);
if ($exif === false) {
echo "無 EXIF 資料或非支援格式";
} else {
echo "<h3>$file EXIF 資訊</h3>";
echo "<pre>";
foreach ($exif as $sectionName => $sectionData) {
echo "=== [$sectionName] ===\n";
foreach ($sectionData as $tagName => $value) {
// 陣列值轉字串顯示
$valStr = is_array($value) ? json_encode($value, JSON_UNESCAPED_UNICODE) : $value;
echo "$tagName: $valStr\n";
}
}
echo "</pre>";
}
?>
| 區段 | 常用標籤 | 說明 |
|---|---|---|
| FILE | FileName, FileDateTime, FileSize, FileType, MimeType | 檔案基本資訊 |
| COMPUTED | Width, Height, IsColor, ByteOrderMotorola, UserComment | PHP 計算衍生資訊 |
| IFD0 | Make, Model, Orientation, XResolution, YResolution, DateTime, Artist, Copyright | 影像主要屬性 |
| EXIF | ExposureTime, FNumber, ISOSpeedRatings, FocalLength, DateTimeOriginal, DateTimeDigitized | 拍攝參數核心 |
| GPS | GPSLatitude, GPSLongitude, GPSAltitude, GPSTimeStamp | 地理位置資訊 |
| THUMBNAIL | JPEGInterchangeFormat, JPEGInterchangeFormatLength | 內嵌縮圖位置與大小 |
<?php
function getGpsFromExif($file) {
$exif = exif_read_data($file, 'GPS', true);
if (!$exif || !isset($exif['GPS'])) return null;
$gps = $exif['GPS'];
// 輔助:度分秒轉十進制
$convert = function($coord, $ref) {
$deg = $coord[0][0] / $coord[0][1];
$min = $coord[1][0] / $coord[1][1];
$sec = $coord[2][0] / $coord[2][1];
$decimal = $deg + $min/60 + $sec/3600;
return ($ref === 'S' || $ref === 'W') ? -$decimal : $decimal;
};
$lat = $convert($gps['GPSLatitude'], $gps['GPSLatitudeRef']);
$lon = $convert($gps['GPSLongitude'], $gps['GPSLongitudeRef']);
return ['lat' => $lat, 'lng' => $lon];
}
// 使用
$gps = getGpsFromExif('photo.jpg');
if ($gps) {
echo "Google Maps: https://maps.google.com/?q={$gps['lat']},{$gps['lng']}";
}
?>
php.ini 中 extension=exif(Windows 另需 extension=mbstring 且須載入在 exif 之前)。exif_thumbnail() 直接取得二進位縮圖資料。$sections 參數,避免解析完整 EXIF 浪費資源。exif_read_data() 是 PHP 讀取相片中繼資料的標準工具,回傳結構化陣列方便後續處理。結合 GPS 轉換、拍攝參數分析、版權資訊提取等應用,可建構相簿管理、攝影社群、地理標記等豐富功能。記得確認伺服器已啟用 exif 擴展並正確載入 mbstring。