2009-04-29 14 views
9

私はカメラのロールから画像をつかんで、それをしばらく使っているだけでなく、iPhoneにPNG形式でディスクに保存しています。恐らくメモリ不足のために私は奇妙なクラッシュを受けています。jpgまたはpng for UIImage - より効率的ですか?

PNGまたはJPGとして保存すると違いがありますか(JPGの場合、品質を低下させるためにノートを選択したとします)具体的には:

  • 私がPNG形式で保存したディスクをリロードした後、UIImageによって使用されるメモリが増えていますか?
  • PNGとして保存する行為は、保存プロセス中に過度に多くのメモリを消費する可能性がありますか?

私はUIImageがフォーマット中立表現であると仮定していましたが、それは問題ではありませんが、検証する必要があると思いました。

答えて

10

私は編集中のイメージの中間バージョンを保存する必要があるストア上のアプリケーションを持っています。元のバージョンでは、PNG形式を使用して保存し、JPEGを複数回読み込んで保存することによる品質の低下を防ぎました。

いつか2.2ソフトウェアリリースの前後でAppleはPNGコードに変更を導入しました。その結果、一部の画像からPNGデータを保存するのに何倍も時間がかかるようになりました。終了時に画像を保存しようとすると、アプリケーションがタイムアウトしてしまったため、JPEG形式で保存するように変更する必要がありました。

また、PNG形式で保存するとUIImageの「向き」情報が保持されないため、内蔵のカメラで縦向きに撮影された画像が保存された後に回転して表示されるため、問題が発生します。それをリロードしてください。

0

ハードなデータはありませんが、AppleがiPhone OSのどこにでもPNGを使用しているようだから、PNGが好ましいと思われます。

しかし、既にPNGを書くためのコードが用意されていれば、それを変更してJPEGを書き込むのは難しくありませんか?両方の方法を試してみて、どれがうまくいくかを見てください。

5

あなたが扱っている画像の種類によって異なります。あなたが写真画像を扱っているなら、JPEGはPNGよりもずっと小さく、人の目で見ることができるような細部の紛失はありません。

逆に、GUI要素や大きなソリッドカラーブロックの画像などの写真以外の画像を扱う場合、PNGとJPEGのサイズは同等ですが、PNGは無損失で保存されますが、JPEGは損失があり、非常に目に見えるアーチファクトを有する。 が実際にの単純な画像(一定の色の非常に大きなブロックなど)を持つ場合、PNGはJPEGよりもはるかに小さくなり、圧縮のアーチファクトはありません。

イメージをPNGまたはJPEGとして保存すると、一時的なメモリが大量に消費されることはありません。イメージはメモリに格納されているときは通常、メモリに圧縮されて格納されています。そのため、イメージをレンダリングするたびに解凍するのではなく、非常にすばやく描画できます。圧縮されていないイメージのサイズと比べて、圧縮するのに必要な余分な一時的なストレージの量は非常に少ないです。圧縮されていないイメージをメモリに収めることができれば、圧縮中に使用されているメモリについて心配する必要はありません。

もちろん、不揮発性ストレージ内のファイルシステムにイメージを書き込んでメモリ内イメージを解放すると、圧縮イメージがどれくらい大きくなっても問題はありません主記憶装置はもはや存在しない。圧縮されたイメージのサイズは、使用しているフラッシュストレージの容量にのみ影響しますが、それは問題になる可能性がありますが、アプリがメモリ不足になる可能性はありません。

+0

これは意味があります。 iPhoneで撮影した写真を保存すると、奇妙な問題が発生しますが、比較的単純なベクトル画像のPNGを使用すると、かなり大きな画像でも問題はありませんでした。 –

24

私はおそらくメモリのうちに、奇妙なクラッシュを取得しています


、あなたがあればRIGHT NOWと最初の数字をやっているSTOPそれが実際にクラッシュの原因です。それ以外の場合は、クラッシュの本当の原因を無視して存在しないメモリ問題を修正し、間違った問題をここで追いかけている可能性が非常に高いです。クラッシュを修正したい場合は、の原因を突き止めることから始めてから始めます。 「おそらく」何が起こったのかをフォローアップすることは、無駄な時間と労力のためのレシピです。

+2

これ以上は同意できません。あなたがクラッシュした場合、ただの束を投げ捨てることはできません。 – rpetrich

0

可能な限りPNGを使用してください。コンパイルの一環として、XCodeはすべてのPNGファイルをユーティリティ(pngcrush)で圧縮して最適化します。

0
  1. 私はPNGとしてそれを保存した場合、私は ディスクからそれをリロードした後、その後、UIImageが使用するより多くのメモリのですか? =>同じ解像度と同じチャンネル数を持つ2つの画像からインポートすると、同じメモリサイズになります。 (RGBAなど)
  2. PNGとして保存する行為は、保存プロセス中に一時的に多くのメモリを使い果たしますか? =>いいえ、ディスクメモリにのみ影響します。
関連する問題