最近アプリの容量が増えてきたので、容量を減らすべく画像の最適化を行いました。 調べて出てくる情報がどれも古かったため、今だとどうしたらいいかを書いておきます。
以下の情報はXcode 7.2.1環境を想定しています。
概要
- Asset Catalog を使う
ASSETCATALOG_COMPILER_OPTIMIZATION
をspace
にする- ImageOptimで画像を最適化する
- PDFではなくPNGを使う
- PNGではなくJPEGを使う
Asset Catalogを使う
Asset Catalogに入っていない画像をAsset Catalogに入れると容量が減ります。 Asset Catalogに入れるとSlicingが有効になり、デバイスごとに必要な画像のみが配布されるバイナリに含まれるようになるためです。
ASSETCATALOG_COMPILER_OPTIMIZATION
をspace
にする
Build SettingsのAsset Catalog Compiler > Optimization にあります。
このsettingをspace
にすると、コンパイル後のasset catalogのサイズを最適化してくれるようです。 (time
だと画像の読み込み時間を高速化してくれるようですが、体感ではあまり違いを感じませんでした)
ImageOptimで画像を最適化する
ImageOptimというアプリケーションを使うと画像の最適化ができます。 最適化の設定は最高レベルの「クレイジー」にしておくと良いと思います。
このアプリケーションは、内部ではPNGOUTやPngcrushなどのツールを組み合わせて、最も容量が減った方式を採用してくれるようです。*1
注意点として、ImageOptimにより画像を最適化した場合、ASSETCATALOG_COMPILER_OPTIMIZATION
をspace
ではなくtime
にした方が容量が減る場合があります。
Asset Catalogに含めた画像は、Xcodeでのビルド時に必ず最適化がかけられてしまうのですが*2、ImageOptimで最高レベルに最適化をした画像の場合、space
を指定した場合の圧縮だとtime
を指定した場合よりファイル容量が増大することもあるようです。
この辺りはファイルに寄ると思いますので実際にお試しください。
前は COMPRESS_PNG_FILES
があり、再圧縮を防止できたのですが、このオプションはデフォルトでは表示されなくなった上、Configurationファイルなどで指定してもAsset Catalogには適用されません。
PDFではなくPNGを使う
PDFではなくPNGを使う方が容量が減る場合があります。*3
体感として、アイコンのようなVector画像向きのファイルはPDFの方が容量が減りますが、スクリーンキャプチャや実写画像などのファイルはPDFではなくPNGの方が容量が減るように思えます。
PDFはビルド時、内部ではPNGとして書き出されているため、書き出しと最適化をXcodeに任せるのではなく、最初から最適化済みのPNGを入れておいた方が容量が減る場合があります。
PNGではなくJPEGを使う
Asset CatalogではPNGとPDFだけでなく、JPEGも扱うことができます スクリーンキャプチャや実写画像などのファイルは、PNGではなくJPEGの方が容量が減る場合があります。
まとめ
Asset Catalogに入っていない画像をAsset Catalogに入れるとSlicingが効いて容量が減ります。
また、ASSETCATALOG_COMPILER_OPTIMIZATION
をspace
にするとAsset Catalogのコンパイル時に容量が減ることがあります。
ImageOptimで画像を最適化したり、画像フォーマットを変更して、画像ファイル自体を最適化すると容量が減る場合があります。