動態處理圖片時,需準確識別類型、MIME、擴展名以正確輸出 Header 與選擇 GD 創建函數。本文匯總核心函數與組合模式。
| 函數 | 用途 | 示例 |
|---|---|---|
image_type_to_mime_type(IMAGETYPE_PNG) | 常量 → MIME | image/png |
getimagesize($file) | 文件 → [寬, 高, 類型常量, 屬性字符串, MIME] | [800,600,2,'width=800 height=600','image/jpeg'] |
image_type_to_extension($type, $include_dot=true) | 類型常量 → 擴展名 | .jpg |
exif_imagetype($file) | 快速獲取類型常量(不解析全圖) | IMAGETYPE_JPEG (2) |
function outputImage($filename) {
$size = getimagesize($filename);
if (!$size) { header("HTTP/1.0 404 Not Found"); exit; }
// 直接輸出原文件(最高效)
header("Content-Type: {$size['mime']}");
header("Content-Length: " . filesize($filename));
readfile($filename);
exit;
}
// 若需處理後再輸出(如加水印)
function processAndOutput($filename) {
$size = getimagesize($filename);
$mime = $size['mime']; // image/jpeg, image/png, image/gif
$type = $size[2]; // IMAGETYPE_* 常量
// 動態選擇創建函數
$createFunc = 'imagecreatefrom' . image_type_to_extension($type, false); // imagecreatefromjpeg
$src = $createFunc($filename);
// ... 圖片處理邏輯 ...
// 動態選擇輸出函數
$outputFunc = 'image' . image_type_to_extension($type, false); // imagejpeg
header("Content-Type: $mime");
$outputFunc($src); // 或 $outputFunc($src, null, 90) 調質量
imagedestroy($src);
}
image_type_to_extension 需 PHP 5.2+,參數 true 返回帶點擴展名(.jpg),false 返回無點(jpg)。getimagesize 或 exif_imagetype 讀取文件頭魔數。Content-Type,否則瀏覽器可能誤判或下載而非顯示。掌握「文件頭識別 → 常量映射 → 動態調用創建/輸出函數」模式,實現格式無關的圖片處理管線。