imagepng($im, null, $level),$level 0-9imagepng($image, null, $level);| 壓縮等級 | 輸出體積 | 壓縮率 | 視覺質量 |
|---|---|---|---|
| 0 (無壓縮) | 225 KB | -80% (變大) | 無損,最快 |
| 1 | 85.9 KB | 31% | 無損可見 |
| 2 | 83.7 KB | 33% | 無損可見 |
| 3 | 80.9 KB | 35% | 無損可見 |
| 4 | 74.6 KB | 40% | 無損可見 |
| 5 | 73.8 KB | 41% | 無損可見 |
| 6 | 73 KB | 42% | 無損可見 |
| 7 | 72.4 KB | 42% | 極微損 |
| 8 | 71 KB | 43% | 輕微可見 |
| 9 (最大壓縮) | 70.6 KB | 44% | 明顯損失 |
官方文檔:Level 0 = 無壓縮(Zlib 不壓縮)。原圖可能已經過輕度壓縮,Level 0 存儲原始像素數據 + PNG 結構開銷,導致體積增大。
類比:原圖像「已壓縮的 zip」,Level 0 解壓後存為「未壓縮的目錄」,自然更大。
| 場景 | 推薦等級 | 理由 |
|---|---|---|
| 用戶上傳頭像/照片 | 6 | 存儲成本敏感,質量要求高 |
| 實時生成圖表/驗證碼 | 1-2 | CPU 敏感,體積次要 |
| 靜態資源構建(部署時) | 9 | 一次性投入,極致體積 |
| 醫療/工程/檔案圖像 | 0 或 不用 PNG | 絕對無損,考慮 TIFF/RAW |
function savePngOptimized($im, $filename, $level = 6) {
// 參數驗證
$level = max(0, min(9, (int)$level));
// 確保目錄存在
$dir = dirname($filename);
if (!is_dir($dir)) mkdir($dir, 0755, true);
// 保存
$result = imagepng($im, $filename, $level);
// 可選:二次優化(需安裝 optipng/pngcrush)
if ($result && $level < 9 && function_exists('exec')) {
exec("optipng -o{$level} {$filename} 2>/dev/null &");
}
return $result;
}
現代項目建議:
imagewebp($im, $file, 80) 質量 80 相當 PNG Level 6 效果picture 標籤或 Accept 頭內容協商PNG 壓縮等級 0-9 並非線性關係。Level 6 是綜合性價比最高點:體積減少 42%,無視覺損失,CPU 開銷可控。Level 0 無壓縮反而增大,僅用於特殊無損需求。生產環境建議封裝優化函數,根據場景動態選擇等級,並積極遷移至 WebP。