函數原型
getimagesize(string $filename, array &$imageinfo = null): array|false
回傳陣列結構
| 索引 | 鍵名 | 說明 |
| 0 | width | 寬度 (像素) |
| 1 | height | 高度 (像素) |
| 2 | type | 圖片類型常數 (IMAGETYPE_JPEG=2 等) |
| 3 | html | 可直接用於 ` ` 的 `width="..." height="..."` 字串 |
| bits | 色深 (bits per pixel) |
| channels | 通道數 (3=RGB, 4=RGBA/CMYK) |
| mime | MIME 類型 (image/jpeg, image/png...) |
支援格式
GIF, JPG, PNG, SWF, SWC, PSD, TIFF, BMP, IFF, JP2, JPX, JB2, JPC, XBM, WBMP, WebP (PHP 7.0+), AVIF (PHP 8.1+)
基本用法
<?php
// 本地檔案
$info = getimagesize('/var/www/uploads/photo.jpg');
if ($info) {
echo "寬: {$info[0]}, 高: {$info[1]}, MIME: {$info['mime']}";
// 直接用於 img 標籤
echo '
';
}
// 遠端 URL (需 allow_url_fopen=On)
$info = @getimagesize('https://example.com/image.png');
if ($info === false) {
echo '無法讀取遠端圖片';
}
?>
進階:第二參數取得額外資訊 (JPEG APP 標記)
<?php
$imageInfo = [];
$size = getimagesize('photo.jpg', $imageInfo);
if ($size && isset($imageInfo['APP1'])) {
// APP1 通常包含 Exif 資料
$exif = $imageInfo['APP1'];
// 解析 Exif 需額外邏輯或用 exif_read_data()
}
?>
常見應用場景
上傳驗證:檢查尺寸與類型
<?php
function validateImageUpload($tmpPath, $maxWidth = 2000, $maxHeight = 2000)
{
$info = @getimagesize($tmpPath);
if (!$info) {
return ['valid' => false, 'error' => '非有效圖片檔案'];
}
// MIME 白名單
$allowedMimes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
if (!in_array($info['mime'], $allowedMimes, true)) {
return ['valid' => false, 'error' => '不支援的圖片格式'];
}
// 尺寸限制
if ($info[0] > $maxWidth || $info[1] > $maxHeight) {
return ['valid' => false, 'error' => "圖片尺寸超過限制 ({$maxWidth}x{$maxHeight})"];
}
// 檔案大小另行檢查 (getimagesize 不回傳檔案大小)
return ['valid' => true, 'info' => $info];
}
?>
動態縮圖:依原圖比例計算目標尺寸
<?php
function calculateResize($srcW, $srcH, $maxW, $maxH)
{
$ratio = min($maxW / $srcW, $maxH / $srcH);
if ($ratio >= 1) return ['w' => $srcW, 'h' => $srcH]; // 無需縮小
return [
'w' => (int)round($srcW * $ratio),
'h' => (int)round($srcH * $ratio),
];
}
// 使用
$info = getimagesize($source);
$target = calculateResize($info[0], $info[1], 800, 600);
// 交給 GD/Imagick 縮放
?>
SWF/Flash 尺寸讀取 (歷史專案維護)
<?php
// getimagesize 直接支援 SWF
$info = getimagesize('animation.swf');
if ($info && $info[2] === IMAGETYPE_SWF) {
echo "Flash 尺寸: {$info[0]}x{$info[1]}";
// 注意:SWF 可能為向量動畫,尺寸僅代表舞台大小
}
?>
效能與替代方案
| 方法 | 優點 | 缺點 | 適用場景 |
getimagesize() | 內建、支援 URL、回傳豐富資訊 | 需讀取檔案頭部、大檔/遠端較慢 | 一般上傳驗證、中小型專案 |
getimagesizefromstring() | 從字串/記憶體讀取、避免臨時檔 | 需先載入完整檔案到記憶體 | S3/資料庫 Blob 直讀 |
exif_read_data() | 完整 Exif 解析 (GPS、相機參數等) | 僅支援 JPEG/TIFF、較慢 | 需攝影資訊時 |
Imagick::pingImage() | 極快、僅讀取頭部、支援超大檔 | 需安裝擴充套件 | 高併發、大量圖片處理 |
錯誤處理模式
<?php
function safeGetImageSize($path)
{
// 抑制警告,統一回傳 false
$info = @getimagesize($path);
if ($info === false) {
$error = error_get_last();
error_log("getimagesize failed for $path: " . ($error['message'] ?? 'unknown'));
return null;
}
return $info;
}
?>