方案 | 效果 | 部署方式 | 说明 | 支持功能 | 收费/免费 |
TinyPng | JPG:10 PNG:10 | Maven引入 | 1. 网站在线压缩免费,单张,手工; 2. API接入,申请appid,每天50张免费,后续收费,实际是到远端rest调用 | 裁剪、压缩、水印等 | 每月500张免费; 500-10000:0.009$/张 >10000:0.002$/张 |
JDeli | JPG:10 PNG:9 | Maven引入 | 本地SDK,直接调用,对PNG实际是用quant算法进行优化 | 裁剪、压缩、水印等 | 收费 |
Thumbnailator | JPG:9 Png:1 | Maven引入 | 本地SDK,JPG压缩可以做到60%以上,可以控制压缩后分辨率是否变化 PNG不对位深做优化,压缩率一般20%以下甚至负优化 | 裁剪、压缩、水印等 | 免费 |
OpenViewer | PNG:9 JPG:1 | Maven引入 | 1. 6.6.14版本中的image包,是抠了JDeli的代码,其它版本都没有,所以实际是收费软件的压缩效果; 2. 压缩后分辨率不变,降低位深方式降低PNG的存储空间 | 裁剪、压缩、水印等 | 免费 |
ImgProxy | NA | java私有化部署,http访问 | 主要是在图床上,resize会修改图片分辨率;怀疑网宿的resize功能应该是用的这个 不修改分辨率压缩效果一般 | 裁剪 | 免费 |
OpenCV | JPG:10 PNG:10 | JNI调用 | JNI调用,需要每台部署主机都安装opencv库 | 裁剪、压缩、水印等 | 免费 |
Pngquant | PNG:9 | JNI调用 | JNI调用,需要每台部署主机安装pngquant | 压缩 | 免费 |
Aspose | JPG:9 PNG:1 | Maven引入 | 类似thumbnailator,不过对有透明度的PNG压缩后会有黑底 | 裁剪、压缩、水印等 | 免费 |
考虑本次使用场景主要是尽量在保持分辨率的场景下减少图片存储空间,所以最终方案:
jpg使用thumbnailator压缩
png使用OpenViewer压缩
附:png压缩对比(0%说明是负优化,代码中对负优化的不压缩)
原始大小 | thumbnalator | OpenViewerFX | tinypng | thumbnalator节省 | OpenViewerFX节省 | TinyPng节省 |
2,168,352 | 2,085,019 | 672,035 | 559,541 | 3.84% | 69.01% | 74.20% |
2,181,431 | 2,181,431 | 594,118 | 520,370 | 0.00% | 72.76% | 76.15% |
1,417,911 | 1,290,266 | 523,687 | 446,200 | 9.00% | 63.07% | 68.53% |
1,253,352 | 1,110,166 | 441,109 | 447,969 | 11.42% | 64.81% | 64.26% |
865,274 | 765,531 | 219,903 | 198,021 | 11.53% | 74.59% | 77.11% |
834,557 | 780,779 | 265,746 | 230,452 | 6.44% | 68.16% | 72.39% |
494,425 | 494,425 | 129,102 | 137,757 | 0.00% | 73.89% | 72.14% |
84,612 | 84,612 | 26,110 | 24,128 | 0.00% | 69.14% | 71.48% |
82,193 | 67,519 | 28,490 | 28,260 | 17.85% | 65.34% | 65.62% |
3,853 | 3,853 | 2,242 | 1,436 | 0.00% | 41.81% | 62.73% |