読者です 読者をやめる 読者になる 読者になる

shobylogy

叩けシンプルの杖

iOSアプリの画像を最適化してアプリの容量を減らす

iOS

最近アプリの容量が増えてきたので、容量を減らすべく画像の最適化を行いました。 調べて出てくる情報がどれも古かったため、今だとどうしたらいいかを書いておきます。

以下の情報はXcode 7.2.1環境を想定しています。

概要

  • Asset Catalog を使う
  • ASSETCATALOG_COMPILER_OPTIMIZATIONspaceにする
  • ImageOptimで画像を最適化する
  • PDFではなくPNGを使う
  • PNGではなくJPEGを使う

Asset Catalogを使う

Asset Catalogに入っていない画像をAsset Catalogに入れると容量が減ります。 Asset Catalogに入れるとSlicingが有効になり、デバイスごとに必要な画像のみが配布されるバイナリに含まれるようになるためです。

developer.apple.com

ASSETCATALOG_COMPILER_OPTIMIZATIONspaceにする

Build SettingsのAsset Catalog Compiler > Optimization にあります。

このsettingをspaceにすると、コンパイル後のasset catalogのサイズを最適化してくれるようです。 (timeだと画像の読み込み時間を高速化してくれるようですが、体感ではあまり違いを感じませんでした)

ImageOptimで画像を最適化する

ImageOptimというアプリケーションを使うと画像の最適化ができます。 最適化の設定は最高レベルの「クレイジー」にしておくと良いと思います。

f:id:shoby:20160316164213p:plain

このアプリケーションは、内部ではPNGOUTPngcrushなどのツールを組み合わせて、最も容量が減った方式を採用してくれるようです。*1

注意点として、ImageOptimにより画像を最適化した場合、ASSETCATALOG_COMPILER_OPTIMIZATIONspaceではなく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の方が容量が減る場合があります。

developer.apple.com

まとめ

Asset Catalogに入っていない画像をAsset Catalogに入れるとSlicingが効いて容量が減ります。 また、ASSETCATALOG_COMPILER_OPTIMIZATIONspaceにするとAsset Catalogのコンパイル時に容量が減ることがあります。 ImageOptimで画像を最適化したり、画像フォーマットを変更して、画像ファイル自体を最適化すると容量が減る場合があります。

*1:いつの間にかZopfliにも対応してました

*2:実際にビルド後のcarファイルを解析してみたのですがtimeでもspaceでも再度最適化がかけられてファイルの容量が変化していました

*3:PDFとはなんだったのか…