在處理圖片上傳、縮圖生成、格式驗證等場景時,準確獲取圖片屬性是基礎。本文系統梳理 PHP 核心函數 getimagesize()、pathinfo()、exif_imagetype() 的用法差異,並提供開箱即用的封裝函數。
getimagesize() —— 尺寸、類型、屬性一網打盡支援格式:GIF、JPG、PNG、SWF、PSD、TIFF、BMP、IFF、JP2、JPX、JB2、JPC、XBM、WBMP 等。
<?php
$arr = getimagesize('1.jpg');
/*
返回數組結構:
$arr[0] => 寬度 (像素)
$arr[1] => 高度 (像素)
$arr[2] => 圖片類型常量 (1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP, 7=TIFF, 8=IFF, 9=JPC, 10=JP2, 11=JPX, 12=JB2, 13=SWC, 14=IFF, 15=WBMP, 16=XBM)
$arr[3] => 字符串 'width="xxx" height="yyy"' 可直接插入 <img> 標籤
$arr['bits'] => 色深
$arr['channels'] => 通道數 (3=RGB, 4=CMYK)
$arr['mime'] => MIME 類型 (image/jpeg, image/png 等)
*/
// 兩種等效輸出方式
echo '<img src="1.jpg" ' . $arr[3] . ' alt="" />';
echo '<img src="1.jpg" width="' . $arr[0] . '" height="' . $arr[1] . '" alt="" />';
?>
pathinfo()不僅限圖片,適用於任意文件路徑解析。
$a = 'aaaaa.jpg';
print_r(pathinfo($a));
/*
Array
(
[dirname] => .
[basename] => aaaaa.jpg
[extension] => jpg
[filename] => aaaaa
)
*/
// 直接取擴展名
$ext = pathinfo($a, PATHINFO_EXTENSION); // 'jpg'
// 直接取不含擴展名的文件名
$name = pathinfo($a, PATHINFO_FILENAME); // 'aaaaa'
exif_imagetype()僅返回類型常量(整數),比 getimagesize() 更快、內存佔用更低,適合僅需驗證格式的場景。
$type = exif_imagetype('c:/a.jpg'); // 返回 2 表示 JPEG
// 常量對照:IMAGETYPE_GIF=1, IMAGETYPE_JPEG=2, IMAGETYPE_PNG=3...
整合上述函數,返回關鍵信息陣列,方便業務層直接使用:
<?php
/**
* 獲取圖片完整信息
* @param string $imagePath 圖片絕對路徑或相對路徑
* @return array|false 成功返回信息陣列,失敗返回 false
*/
function getImageInfo( $imagePath ) {
if ( ! file_exists($imagePath) ) return false;
$imgInfo = getimagesize($imagePath);
if ( $imgInfo === false ) return false;
// 類型常量轉人類可讀字符串
$typeMap = [
1 => 'GIF', 2 => 'JPEG', 3 => 'PNG', 4 => 'SWF',
5 => 'PSD', 6 => 'BMP', 7 => 'TIFF', 8 => 'IFF',
9 => 'JPC', 10 => 'JP2', 11 => 'JPX', 12 => 'JB2',
13 => 'SWC', 14 => 'IFF', 15 => 'WBMP', 16 => 'XBM'
];
$typeStr = $typeMap[$imgInfo[2]] ?? 'Unknown';
// 文件大小格式化 (KB, 保留整數)
$sizeKB = ceil(filesize($imagePath) / 1024) . ' KB';
return [
'width' => $imgInfo[0],
'height' => $imgInfo[1],
'type' => $typeStr . ' 圖像',
'mime' => $imgInfo['mime'],
'size' => $sizeKB,
'bits' => $imgInfo['bits'],
'channels' => $imgInfo['channels'],
'html_attr' => $imgInfo[3], // 可直接用於 <img>
];
}
// 使用示例
$info = getImageInfo('./images/photo.jpg');
if ( $info ) {
echo "寬度: {$info['width']}px
";
echo "高度: {$info['height']}px
";
echo "類型: {$info['type']}
";
echo "大小: {$info['size']}
";
echo "MIME: {$info['mime']}
";
// 直接輸出 img 標籤
echo '<img src="./images/photo.jpg" ' . $info['html_attr'] . ' alt="" />';
}
?>
| 場景 | 推薦函數 | 注意事項 |
|---|---|---|
| 僅需驗證是否為圖片/格式 | exif_imagetype() | 速度最快,不讀取像素數據 |
| 需獲取尺寸、用於縮圖計算 | getimagesize() | 會讀取文件頭,稍慢但信息全 |
| 需解析路徑獲取擴展名 | pathinfo() | 注意大小寫,建議 strtolower() |
| 上傳驗證 | 組合使用 | 先 exif_imagetype() 快速過濾,再 getimagesize() 確認尺寸限制 |
掌握這組函數組合,即可應對絕大多數圖片屬性獲取與驗證需求。