首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 使用 exif_read_data 讀取圖片 EXIF 資訊完整教學

     編輯:PHP 綜合知識

前言

數位相片內建的 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 扁平化

完整範例:列印所有 EXIF 標籤

<?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>";
}
?>

常見 EXIF 區段與實用標籤對照表

區段常用標籤說明
FILEFileName, FileDateTime, FileSize, FileType, MimeType檔案基本資訊
COMPUTEDWidth, Height, IsColor, ByteOrderMotorola, UserCommentPHP 計算衍生資訊
IFD0Make, Model, Orientation, XResolution, YResolution, DateTime, Artist, Copyright影像主要屬性
EXIFExposureTime, FNumber, ISOSpeedRatings, FocalLength, DateTimeOriginal, DateTimeDigitized拍攝參數核心
GPSGPSLatitude, GPSLongitude, GPSAltitude, GPSTimeStamp地理位置資訊
THUMBNAILJPEGInterchangeFormat, JPEGInterchangeFormatLength內嵌縮圖位置與大小

進階應用:提取 GPS 並轉換為十進制度

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

注意事項與常見問題

  • 需啟用 exif 延伸模組: php.ini 中 extension=exif(Windows 另需 extension=mbstring 且須載入在 exif 之前)。
  • 僅支援 JPEG/TIFF: PNG、GIF、WebP 等格式無 EXIF 資料。
  • 縮圖提取: 可用 exif_thumbnail() 直接取得二進位縮圖資料。
  • 大檔案效能: 只需特定區段時指定 $sections 參數,避免解析完整 EXIF 浪費資源。

小結

exif_read_data() 是 PHP 讀取相片中繼資料的標準工具,回傳結構化陣列方便後續處理。結合 GPS 轉換、拍攝參數分析、版權資訊提取等應用,可建構相簿管理、攝影社群、地理標記等豐富功能。記得確認伺服器已啟用 exif 擴展並正確載入 mbstring。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved