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 / attr | HTML 屬性字符串 | width="800" height="600" |
bits | 顏色深度 (位/像素) | 24 |
channels | 通道數 | 3 (RGB), 4 (CMYK) |
mime | MIME 類型 | 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']}";
?>
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;
}
$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);
$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() 的返回值結構與錯誤處理模式,能讓你在圖片上傳驗證、畫廊索引構建、EXIF 信息提取等場景中編寫出健壯、高效的代碼。