使用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的差距,我还是搞不清楚差距在哪里。
如果有人知道希望可以指导一下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构