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

PHP getimagesize() 函數獲取圖片尺寸與類型完整指南

     編輯:更多程式設計知識

getimagesize() 是 PHP 內置函數,無需 GD/Imagick 擴展即可快速讀取圖片文件頭信息,返回寬度、高度、類型、屬性字符串及 MIME 類型。本文詳解返回值結構、實戰代碼、錯誤處理與進階應用場景。

函數簽名與返回值結構

getimagesize(string $filename, array &$imageinfo = null): array|false

成功返回包含 7 個元素的數組(索引 0-6 + 關聯鍵):

索引/鍵含義示例
0 / width圖片寬度 (像素)800
1 / height圖片高度 (像素)600
2 / type圖片類型常量IMAGETYPE_JPEG (2)
3 / attrHTML 屬性字符串width="800" height="600"
bits顏色深度 (位/像素)24
channels通道數3 (RGB), 4 (CMYK)
mimeMIME 類型image/jpeg

失敗返回 false 並觸發 E_WARNING。

基礎使用示例

<?php
$imagePath = 'photo.jpg';

$info = @getimagesize($imagePath); // @ 抑制警告,自行判斷返回值
if ($info === false) {
    die("無法讀取圖片或非圖片文件:$imagePath");
}

// 方法 1:直接使用 attr 輸出 img 標籤
echo "<img src=\"$imagePath\" {$info[3]} alt=\"\" />";
// 輸出:

// 方法 2:顯式寫出 width/height
echo "<img src=\"$imagePath\" width=\"{$info[0]}\" height=\"{$info[1]}\" alt=\"\" />";

// 獲取類型友好名稱
$typeMap = [
    IMAGETYPE_GIF => 'GIF',
    IMAGETYPE_JPEG => 'JPEG',
    IMAGETYPE_PNG => 'PNG',
    IMAGETYPE_WEBP => 'WEBP',
    IMAGETYPE_BMP => 'BMP',
    IMAGETYPE_SVG => 'SVG', // PHP 8.0+
];
echo "圖片格式:{$typeMap[$info[2]] ?? 'Unknown'}";
echo "MIME 類型:{$info['mime']}";
?>

進階應用場景

1. 上傳驗證:僅允許特定圖片格式

function validateImageUpload($tmpName, array $allowedTypes = [IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF, IMAGETYPE_WEBP]) {
    $info = @getimagesize($tmpName);
    if ($info === false) {
        throw new Exception('文件不是有效圖片或已損壞');
    }
    if (!in_array($info[2], $allowedTypes, true)) {
        throw new Exception('不支持的圖片格式,僅允許 JPG/PNG/GIF/WEBP');
    }
    // 可選:限制尺寸
    if ($info[0] > 4000 || $info[1] > 4000) {
        throw new Exception('圖片尺寸超過限制 (最大 4000x4000)');
    }
    return $info;
}

2. 批量獲取目錄圖片信息生成縮略圖索引

$images = glob('uploads/*.{jpg,jpeg,png,gif,webp}', GLOB_BRACE);
$index = [];
foreach ($images as $img) {
    $info = @getimagesize($img);
    if ($info) {
        $index[] = [
            'path' => $img,
            'width' => $info[0],
            'height' => $info[1],
            'mime' => $info['mime'],
            'size' => filesize($img),
            'ratio' => round($info[0] / $info[1], 2)
        ];
    }
}
// 輸出 JSON 供前端畫廊使用
header('Content-Type: application/json');
echo json_encode($index);

3. 結合 imageinfo 參數獲取 JPEG 詳細信息

$info = getimagesize('photo.jpg', $imageinfo);
if (isset($imageinfo['APP1'])) {
    // APP1 通常包含 EXIF 信息
    $exif = exif_read_data('photo.jpg');
    if ($exif) {
        echo "拍攝時間:{$exif['DateTimeOriginal'] ?? '未知'}";
        echo "相機型號:{$exif['Model'] ?? '未知'}";
        echo "光圈:f/{$exif['ApertureValue'] ?? '未知'}";
        echo "ISO:{$exif['ISOSpeedRatings'] ?? '未知'}";
    }
}

常見陷阱與最佳實踐

陷阱解決方案
遠程 URL 讀取緩慢/超時配合 stream_context_create(['http'=>['timeout'=>5]]) 設置超時;生產環境建議先下載到本地臨時文件
SVG 文件返回 false (PHP < 8.0)升級 PHP 8.0+ 或使用 finfo_file 檢測 MIME 類型
大文件讀取整個文件佔用內存getimagesize 僅讀取文件頭極少字節,內存佔用極小,無此問題
緩存導致尺寸讀取不準CDN/代理緩存舊圖片時,清理緩存或帶版本號 ?v=2
Windows 路徑中文亂碼確保腳本編碼為 UTF-8,路徑使用 realpath() 規範化

性能對比:getimagesize vs GD vs Imagick

  • getimagesize():僅解析文件頭,速度最快(微秒級),無依賴,首選。
  • GD (imagesx/imagesy):需完整解碼圖片到內存,耗時較長,適合需後續處理(縮放、水印)場景。
  • Imagick:功能最強,但啟動開銷大,適合複雜圖片處理流程。

掌握 getimagesize() 的返回值結構與錯誤處理模式,能讓你在圖片上傳驗證、畫廊索引構建、EXIF 信息提取等場景中編寫出健壯、高效的代碼。

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