iPhone開発でPNGまたはJPGを使用する場合


98

たくさんの画像をスライドショーで表示するアプリがあります。これらの画像はバンドルの一部になるため、アプリで配布されます。

画像はすべて写真または写真などです。

画像フォーマットとしてPNGを使用する方が好ましいと読みましたが、JPGバージョンの方がはるかに小さいことがわかり、むしろそれを使用したいと思います。

使用するフォーマットとその場合のガイドラインはありますか?


元の画像がすべてJPG形式であるということを付け加えておきます。
マーベリック

回答:


140

PNGはピクセルパーフェクト(非可逆)であり、表示するために追加のCPUエネルギーをほとんど必要としません。ただし、大きなPNGは、圧縮された画像フォーマットよりもストレージからの読み取りに時間がかかるため、表示に時間がかかる場合があります。

JPGは保存するには小さくなりますが、損失が多く(量は圧縮レベルに依存します)、それらを表示するには、はるかに複雑なデコードアルゴリズムが必要です。しかし、通常の写真では、通常の圧縮と画質で十分です。

写真や大きなものにはJPGを使用し、小さなものやPNGは「ピクセルパーフェクト」(小さなアイコンなど)に表示したり、合成された透明オーバーレイの一部として表示するように設計したりします。


1
JPEG、PNG、iPNGのデコードパフォーマンスに関するデータはまだ見ていません。必要なI / Oが減少するため、より圧縮されたフォーマットの方が良い場合があります。iPhoneのフラッシュドライブがどれほど速いかわかりません。そして、私はPNGの解凍が「ごくわずか」のエネルギーを必要とするとは絶対に言いません。Other.artworkファイルは生のビットマップデータのように見えます。これは、PNG解凍のCPU /メモリオーバーヘッドが、一般的に使用されるUIコンポーネントに対して多すぎるためと考えられます。
tc。

2
私の現在のプロジェクトでは、透明性の要件のため、非常に大きなpngファイルがあります。ディスクIOは、jpegのデコードに費やされた時間を大幅に上回ります。PNGも別のアルゴリズムを使用して圧縮されることに注意してください。
ジョン

2
画像のパフォーマンスを最大化しようとする人のために、補足のヒントを1つ追加します。十分に圧縮されたJPGがある場合は、生のJPGデータを事前にNSDataオブジェクトに(おそらく配列またはディクショナリに)ロードし、表示したいときにUIImage:imageFromDataを使用してJPGを構築できます。JPGデータは、ビットマップイメージデータよりも10〜100倍小さくできますが、(比較的遅い)IO部分を早期に妨げることができます。この方法でキャッシュ/プリロードするデータの量に注意してください。
Nigel Flack、2013年

2
比較時間に関するデータを見つけました:cocoanetics.com/2012/09/…png を使用する方がjpgよりも高速ではないようです;)
MaciejKozieł14年

20

Appleは、iPhoneアプリバンドルに含まれているPNG画像を最適化します。実際、iPhoneはカラーバイトがハードウェア用に最適化された特別なエンコーディングを使用しています。XCodeは、プロジェクトをビルドするときにこの特別なエンコーディングを処理します。そのため、iPhoneでPNGを使用することには、サイズに関する考慮事項以外の追加の利点があります。このため、インターフェースの一部として表示されるすべての画像(テーブルビュー、ラベルなど)にはPNGを使用することをお勧めします。

写真のようなフルスクリーン画像を表示することに関しては、それらは非可逆であり、視覚的品質は画像をデコードする際のリソースの使用は言うまでもなくJPGよりも優れているため、PNGを使用してもメリットを享受できます。ファイルサイズの実際の利点を確認するために、JPGの品質を下げる必要がある場合がありますが、最適でない画像を表示しています。

ファイルサイズは確かに要因ですが、画像フォーマットを選択する際には、他にも考慮すべき点があります。


5
私のベンチマークでは、 Xcodeの最適化によって実際にファイルが遅くなりました。おそらく、CPUではなくディスクI / Oがボトルネックになっているためです。
Kornel 2012年

1
「AppleはiPhoneアプリバンドルに含まれるPNG画像を最適化します」-これは、動的にダウンロードされるPNGが最適化されていないことを意味しますか?
ロバート

1
いいえ、動的にダウンロードされたPNGは最適化されていません。最適化は基本的に、バイト順をRGBAからBGRAに交換するだけです。これは、iPhoneグラフィックチップが内部で使用するものです。詳細はこちら:graphicsoptimization.com/blog/
p=259

11

PNGについて考慮すべき重要なことが1つあります。XcodeビルドにPNGが含まれている場合は、iOS用に最適化されます。これはPNGクラッシュと呼ばれます。実行時にPNGがダウンロードされた場合、PNGは圧縮されません。押しつぶされたPNGは、100%JPGとほぼ同じように実行されます。低品質のJPGは、高品質のJPGよりも適切に実行されます。したがって、パフォーマンスの観点から、最も速いものから最も遅いものまで、低品質のJPG、高品質のJPG、PNGクラッシュ、PNGになります。

PNGをダウンロードする必要がある場合は、ダウンロード前にサーバー上のPNGを粉砕することを検討してください。

http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/


9

Cocoaneticsは素敵なiOSのパフォーマンスベンチマーク、公開ブログ で破砕することなく、様々な品質レベル、およびPNG画像のJPGのみのを。

彼の結論から:

絶対にアルファチャネルが必要な場合、またはPNGを使用する必要がある場合は、pngcrushツールをWebサーバーにインストールし、すべてのPNGを処理することをお勧めします。他のほとんどすべての場合、高品質のJPEGは、小さいファイルサイズ(つまり、高速転送)と高速圧縮およびレンダリングを組み合わせています。

PNGは、UI要素に使用する小さな画像に最適ですが、カタログや雑誌などのフルスクリーンアプリケーションに使用するのは妥当ではありません。そこでは、ソースマテリアルに応じて60〜80%の圧縮品質を選択します。

すべてを表示するという点では、キャッシュされた非圧縮バージョンのファイルが含まれているため、一度描画したUIImageインスタンスにハングアップする必要があります。そして、大きな画像が画面に表示されるのを視覚的に一時停止しない場合は、事前にいくつかの画像を強制的に解凍する必要があります。ただし、これらは大量のRAMを消費し、それを過度に実行するとアプリが終了する可能性があることに注意してください。NSCacheは、RAMが不足したときに自動的に画像を追い出すため、頻繁に使用される画像を配置するのに最適な場所です。

画像を解凍する必要があるかどうかを知る方法がないのは残念です。また、この影響について通知せずに、画像が非圧縮バージョンを追い出した可能性もあります。それはAppleのバグ報告サイトで調達するのに良いレーダーかもしれません。ただし、幸いなことに、画像がすでに解凍されている場合は、上記のように画像にアクセスするのに時間がかかりません。つまり、「ジャストインタイム」だけでなく、「ジャストインジャズ」も可能です。


まさに、JPEGMiniとImageOptimはJPEGを本当に小さくします!
electronix384128

7

少し解凍パフォーマンスデータを共有すると思いました...

私は360度ビューアーのプロトタイピングを行っています。これは、ユーザーがさまざまな角度から撮影した一連の写真を回転させて、オブジェクトをスムーズに回転できるような印象を与えるカルーセルです。

画像データをNSDataの配列にロードして、方程式からファイルI / Oを取り出しましたが、オンザフライでNSImageを作成しています。ほぼ最大フレームレート(約25 fps)でのテストとInstrumentsでの観察アプリは明らかにCPUに依存しており、CPU負荷が約10%増加し、約275 kbのpngと約75 kbのjpgを示しています。

はっきりとは言えませんが、CPUの制限は、一般的なプログラムの実行とすべてのデータのメモリ内での移動に起因していると思いますが、その画像の解凍はGPUで行われます。どちらの方法でも、JPGとPNGのパフォーマンス引数は、特にファイルサイズが小さい(したがって、少なくともチェーンの一部のメモリ内のオブジェクトのサイズが小さい)場合、JPGを優先するように見えます。

もちろん、すべての状況は異なります。テストに代わるものはありません...


2
GPUはPNGを解凍できません。使用するdeflate形式は、GPUが有効にする種類の並列化には適していません。色空間変換が含まれるため、JPGデコードは部分的にGPUで高速化できると思います。
Kornel 2012年

5

jpegsとpngを使用すると、アニメーションのパフォーマンスに大きな違いがあることがわかりました。たとえば、UIScrollViewに3つの画面サイズのjpegを並べて配置し、iPhone4で水平にスクロールすると、遅延が発生し、完全に不快なぎくしゃくしたアニメーションになります。同じ寸法の不透明なpngの場合、スクロールはスムーズです。画像が大きくても、jpegsは使用しません。


1

透過を使用したい場合は、PNG以外の選択肢はないと思います。ただし、背景がすでに不透明な場合は、JPGを使用できます。それが私が見ることができる唯一の違いです


3
これは、JPGとPNGのパフォーマンスに関する考慮事項には対応していません。
daveMac 2013年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.