使用FFMPEG 壓縮png圖片 與tinypng壓縮結果對比


Tinypng  https://tinypng.com/ 一個在線png壓縮工具

FFmpeg https://ffmpeg.org/download.html  

原圖 903 kb

Tinypng壓縮過的 96KB

 

目標就是用FFmpeg做到近似Tinypng的處理效果

首先是判斷顏色格式 這里我提前做好了准備 原圖的rgb24 輸出是 pal8 也就是輸入 24位 輸出256色

如果不清楚 可以用下面的命令來輸出一個log看一眼

ffprobe -hide_banner -v quiet -print_format json -show_format -show_streams in.png > in.log

in.log文件中 "pix_fmt": "pal8", 這個就是對應的色彩

 

直接轉換 顆粒感很厚重 而且體積也不小 123 KB

ffmpeg -hide_banner -i in.png -pix_fmt pal8 out_1.png

 

效果看起來很差,於是我想到了降噪 

ffmpeg -hide_banner -i in.png -pix_fmt pal8  -vf dctdnoiz=4.5 -y out_2.png

2D DCT降噪 但好像沒什么效果  看來原因並不是這樣的 124 KB

我嘗試調整了多種降噪和dither參數 但是效果都很慘 這里就不細說了

看起來問題並不是出在內容上面,應該是思路有錯誤 

后來友人提醒:

我看了下圖像信息
不會是因爲調色板吧?
統計一下,第一張圖用到了256色
第二張衹有133
那麽就是第一張圖用了調色板來映射256色
而第二張就是老老實實地按照原本的256色來
其實gif就是這樣的
通過調色板來映射256色,所以能勉強達到一個能接受的效果 

 好吧 看來需要優化一下調色板 

ffmpeg -i in.png -vf palettegen=max_colors=256:stats_mode=single -y out_3.png

這里的輸出結果是一個調色板 並不是完整圖像 由於這是單張靜圖所以mode使用的是single

這個參數有幾種具體區別可以看文檔 http://ffmpeg.org/ffmpeg-all.html#palettegen-1

再用優化過的調色板去轉換 得到結果 116 KB

ffmpeg -i in.png -i out_3.png -lavfi "[0][1:v] paletteuse" -pix_fmt pal8 -y out_4.png

 

至此,效果上已經可以接受了但是體積還差10KB的差距,我還是搞不清楚差距在哪里。

如果有人知道希望可以指導一下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM