iOS图片优化方案

大应用一般都有瘦身需求,瘦身的好处显而易见。某大厂的应用在 iOS8 的机器上 install size 居然达到250M,对用户太不友好了。瘦身一般分为资源瘦身和可执行文件瘦身,网上找来一张瘦身思维导图如下,本文讲述iOS图片的几种优化方案。

thinBrainMap

1.PNG 压缩

iOS 项目中一般使用 PNG 图片,相对于 JPG 来说,它最大的优势在于支持完整的透明通道。射鸡狮一般提供2x,3x图片,如果对视觉要求不高,可以只使用2x图片,在5.5英寸的plus上会放大2x图片1.5倍。优化 PNG 图片尺寸一般是用 tinypng ,不过每次只能压缩20张图片,可以使用我之前写的脚本 tinypng python 批量压缩,也可以使用 Mac 客户端 TinyPNG4Mac ,需要在其网站上注册一个API Key,免费。

2.通过字符串里的编码来表示矢量图

ASCIImage

replacing-photoshop-with-nsstring

3.使用IconFont

每个 IconFont 只是一小段文本,文件大小要比图片形式的 Icon 小一个数量级。国内比较好的矢量图标库有:阿里巴巴矢量图标库,国外有Font Awesome。

FontAwesomeKit

using-icon-font-in-ios

zai-ios-zhong-shi-yong-icon-font

4.使用WebP

Google推的方案,无损压缩后的 Webp 比 PNG 文件少了 45% 的文件大小,即使 PNG 文件经过其他压缩工具压缩之后,Webp 还是可以减少 28% 的文件大小。SDWebImage实现了加载WebP图片的功能,但是没做缓存功能,可以自行用NScache 缓存解码后的图片。UIImage+WebP.m

webp

5.使用PDF矢量图

使用 PDF 矢量图不一定能达到瘦身的目的(iOS9以下铁定悲剧),更多的是减少了文件方便管理资源,也让射鸡狮更省事。使用矢量图编译打包后在 IPA 内是一个 Assets.car 文件,有工具可以解压出里面的图片,可以发现其实是 pdf 转成了1x 2x 3x 3套图片。iOS9 后苹果提供了 App Thinning 方案(App Slicing、on-demand resources以及Bitcode),但是App Store 是可以随时关闭这个服务的。有办法把 Assets.car 文件里面的图片搞出来,如下。

iOS-Images-Extractor

ThemeEngine

acextract

iOS-Asset-Extractor

6.使用BPG

BPG 是目前已知最优秀的有损压缩格式,作者是大名鼎鼎的FFMpeg开发者。BPG 编码时间长,解码效率要差JPEG好几倍,目前在移动端表现还不太好,据我所知个别大厂在少量试用,或许有对源码做优化吧。

最后推荐一款查找重复资源的工具 fdupes

fdupes

更多参考

iOS中的SVG与iconFont详解

WebP 探寻之路

移动端图片格式调研

Analysing Assets.car file in IOS