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

PHP getimagesize() 完整指南:取得圖片尺寸、類型、MIME、HTML 屬性字串

     編輯:PHP 綜合知識

getimagesize() 是 PHP 內建**零相依**函數,能從本地檔案或遠端 URL 讀取圖片標頭,**不載入完整圖片到記憶體**,瞬間取得寬高、類型、MIME、HTML 屬性字串。本文詳細說明回傳陣列結構、常數對照、遠端讀取、錯誤處理與實戰應用場景。

一、回傳值結構

成功回傳 **7 元素陣列**(索引 0~6 + 關聯鍵),失敗回傳 false 並觸發 E_WARNING。

索引/鍵說明範例
0 / width寬度 (px)800
1 / height高度 (px)600
2 / type圖片類型常數 (1~17)2 (IMAGETYPE_JPEG)
3HTML 屬性字串 width="800" height="600"width="800" height="600"
mimeMIME 類型image/jpeg
channels通道數 (3=RGB, 4=RGBA/CMYK)3
bits每色位元深度8

二、類型常數對照表 (IMAGETYPE_*)

1  => IMAGETYPE_GIF
2  => IMAGETYPE_JPEG
3  => IMAGETYPE_PNG
4  => IMAGETYPE_SWF
5  => IMAGETYPE_PSD
6  => IMAGETYPE_BMP
7  => IMAGETYPE_TIFF_II (intel byte order)
8  => IMAGETYPE_TIFF_MM (motorola byte order)
9  => IMAGETYPE_JPC
10 => IMAGETYPE_JP2
11 => IMAGETYPE_JPX
12 => IMAGETYPE_JB2
13 => IMAGETYPE_SWC
14 => IMAGETYPE_IFF
15 => IMAGETYPE_WBMP
16 => IMAGETYPE_XBM
17 => IMAGETYPE_ICO

三、基礎使用範例

<?php
$file = 'photo.jpg';
$info = @getimagesize($file);
if ($info === false) {
    die('無法讀取圖片或非支援格式');
}

// 直接輸出 img 標籤
echo '<img src="' . $file . '" ' . $info[3] . ' alt="">';
// 等同於
printf('<img src="%s" width="%d" height="%d" alt="">', $file, $info[0], $info[1]);

// 判斷類型
if ($info[2] === IMAGETYPE_JPEG) {
    echo 'JPEG 圖片';
}

// 取得 MIME (適合 header 輸出)
header('Content-Type: ' . $info['mime']);
// readfile($file);

四、遠端 URL 讀取

支援 https://、https://、ftp:// 封裝協定(需 allow_url_fopen=On)。**僅下載標頭資料**,不會下載完整檔案,速度極快。

$url = 'https://example.com/banner.png';
$info = @getimagesize($url);
if ($info) {
    echo "遠端圖片:{$info[0]}x{$info[1]} {$info['mime']}";
}

五、進階應用:圖片上傳驗證管線

function validateImageUpload(array $file, array $rules = []): array {
    $rules += [
        'max_width'  => 4096,
        'max_height' => 4096,
        'min_width'  => 1,
        'min_height' => 1,
        'allowed_types' => [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_WEBP],
        'max_size'   => 5 * 1024 * 1024, // 5MB
    ];

    // 1. 檔案大小
    if ($file['size'] > $rules['max_size']) return ['ok'=>false, 'msg'=>'檔案過大'];

    // 2. getimagesize 驗證真實圖片格式與尺寸
    $info = @getimagesize($file['tmp_name']);
    if ($info === false) return ['ok'=>false, 'msg'=>'非有效圖片檔案'];

    if (!in_array($info[2], $rules['allowed_types'], true)) return ['ok'=>false, 'msg'=>'不支援的圖片格式'];
    if ($info[0] < $rules['min_width'] || $info[0] > $rules['max_width'])  return ['ok'=>false, 'msg'=>'寬度不符'];
    if ($info[1] < $rules['min_height'] || $info[1] > $rules['max_height']) return ['ok'=>false, 'msg'=>'高度不符'];

    // 3. 可選:檢查 MIME 是否與副檔名一致 (防偽裝)
    $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
    $expectedMime = ['jpg'=>'image/jpeg','jpeg'=>'image/jpeg','png'=>'image/png','gif'=>'image/gif','webp'=>'image/webp'];
    if (isset($expectedMime[$ext]) && $expectedMime[$ext] !== $info['mime']) {
        return ['ok'=>false, 'msg'=>'副檔名與實際格式不符'];
    }

    return ['ok'=>true, 'info'=>$info];
}

六、常見問題與替代方案

問題原因/解決
回傳 false 但檔案存在非支援格式、檔案損壞、權限不足、allow_url_fopen=Off 讀遠端
SVG 回傳 falsePHP 內建不支援 SVG,需自行解析 XML 或用 Imagick
大型圖片 (超過 2^31 px) 溢位極罕見,改用 Imagick::getImageGeometry()
效能:頻繁呼叫快取結果(檔案 mtime + size 作為 key),避免重複統計

七、getimagesize() vs exif_read_data() vs Imagick

  • getimagesize():零相依、極快、只讀標頭、功能基礎。
  • exif_read_data():讀取 JPEG/TIFF Exif 資訊 (GPS、相機參數、拍攝時間)。
  • Imagick:完整圖片處理、支援 200+ 格式、可讀取多幀、ICC 色彩配置、效能較重、需安裝擴充套件。

getimagesize() 以**零成本、高效能、標準化**特性,成為 PHP 圖片上傳驗證、縮圖前置檢查、HTML 圖片屬性自動填入的首選工具。

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