Tinypng https://tinypng.com/ 一個在線png壓縮工具html
FFmpeg https://ffmpeg.org/download.html json
原圖 903 kbide
Tinypng壓縮過的 96KB工具
目標就是用FFmpeg作到近似Tinypng的處理效果優化
首先是判斷顏色格式 這裏我提早作好了準備 原圖的rgb24 輸出是 pal8 也就是輸入 24位 輸出256色ui
若是不清楚 能夠用下面的命令來輸出一個log看一眼3d
ffprobe -hide_banner -v quiet -print_format json -show_format -show_streams in.png > in.logorm
in.log文件中 "pix_fmt": "pal8", 這個就是對應的色彩htm
直接轉換 顆粒感很厚重 並且體積也不小 123 KBblog
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的差距,我仍是搞不清楚差距在哪裏。
若是有人知道但願能夠指導一下