首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP imagepng 壓縮等級 0-9 實測對比:體積與質量權衡指南

     編輯:PHP 綜合知識

實測環境

  • 原圖:PNG 格式,125 KB
  • PHP GD imagepng($im, null, $level),$level 0-9
  • 測試代碼:imagepng($image, null, $level);

壓縮等級對比結果

壓縮等級輸出體積壓縮率視覺質量
0 (無壓縮)225 KB-80% (變大)無損,最快
185.9 KB31%無損可見
283.7 KB33%無損可見
380.9 KB35%無損可見
474.6 KB40%無損可見
573.8 KB41%無損可見
673 KB42%無損可見
772.4 KB42%極微損
871 KB43%輕微可見
9 (最大壓縮)70.6 KB44%明顯損失

關鍵發現與解釋

為什麼 Level 0 體積反而變大?

官方文檔:Level 0 = 無壓縮(Zlib 不壓縮)。原圖可能已經過輕度壓縮,Level 0 存儲原始像素數據 + PNG 結構開銷,導致體積增大。

類比:原圖像「已壓縮的 zip」,Level 0 解壓後存為「未壓縮的目錄」,自然更大。

壓縮等級與質量的非線性關係

  • 1-6 級:體積顯著下降,質量無損(PNG 無損壓縮本質)
  • 7-9 級:體積邊際收益遞減,CPU 耗時顯著增加,極高壓縮可能引入視覺伪影(非標準行為)

最佳實踐建議

推薦等級:2-6(甜點區)

  • Level 2-3:速度較快,體積減少 30%+,質量完美
  • Level 6:平衡點,體積減少 42%,CPU 可接受

場景化選擇

場景推薦等級理由
用戶上傳頭像/照片6存儲成本敏感,質量要求高
實時生成圖表/驗證碼1-2CPU 敏感,體積次要
靜態資源構建(部署時)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;
}

進階:PNG 與 WebP 對比

現代項目建議:

  • 瀏覽器支持 WebP 時優先輸出 WebP(體積再減 25-35%)
  • imagewebp($im, $file, 80) 質量 80 相當 PNG Level 6 效果
  • 使用 picture 標籤或 Accept 頭內容協商

總結

PNG 壓縮等級 0-9 並非線性關係。Level 6 是綜合性價比最高點:體積減少 42%,無視覺損失,CPU 開銷可控。Level 0 無壓縮反而增大,僅用於特殊無損需求。生產環境建議封裝優化函數,根據場景動態選擇等級,並積極遷移至 WebP。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved