0

imageviewで高解像度の画像を表示したい。これが私がすることです

  1. バックグラウンドでUIImageを用意する
  2. ファイルがロードされたら、メインスレッドに切り替えます
  3. 画像を表示する [ UIImageView の setImage: を使用して]

問題は、3 番目のステップにラグがあることです。数秒かかり、ファイルがロードされます。大きな画像の場合、メモリ警告とクラッシュが発生します。それで、ブラウザが行うように、上から下に画像を描画できる方法はありますか?また、画像の品質を維持する必要があります。

私の要件を達成する方法はありますか?前もって感謝します

4

3 に答える 3

1

大きな画像の場合、メモリ警告とクラッシュが発生します。

画像を一度にメモリにロードして表示しようとすると、デバイスの「ハード」(メモリ関連) 制限に達しているようです。

それで、ブラウザが行うように、上から下に画像を描画できる方法はありますか?

メモリ ヒットを発生させずに非常に大きな画像を描画する方法を提供する CATiledLayer を試してみてください。

ここでは、それに関するチュートリアルを見つけることができます。

PhotoScrollerNetworkプロジェクトもご覧ください。

  • 非常に高速なタイル レンダリング - Apple のコード (ファイル システムで png ファイルを使用) より視覚的にはるかに高速

  • 単一の jpeg ファイルまたは URL を指定すると、このコードがすべてのタイリングをすばやく簡単に実行します。

于 2013-04-23T07:01:28.960 に答える
1

UIImage実際に要求されるまで、基になる画像データをデコードしません。これは、画像ビューに割り当てたときにメインスレッドで発生します。そのため、バックグラウンド スレッドで画像を読み込もうとしているにもかかわらず、作業が遅れており、実際にはメイン スレッドで発生しています。

この問題の回避策は非常にハックであり、通常、新しいグラフィックス コンテキストにイメージを書き込んでデコードを強制し、そこからCGImageReforを作成UIImageします。これはすべてバックグラウンド スレッドで行われます。新しいイメージをメイン スレッドに送信するときには、すべてのデコードが既に行われているため、遅延は発生しません。この質問には、この手法を示すいくつかの回答があります。

上から下に画像を描画することは、Apple が提供する標準 API では不可能です (私の知る限り)。重要な作業となる独自のストリーミング イメージ デコーダーを作成する必要があります。

于 2013-04-23T06:57:58.243 に答える
1

次のことに役立つSDWebImageフレームワークを使用できます。

1.非同期画像ダウンローダー

2.自動画像キャッシュ。

3.重複を避ける。

これはhttps://github.com/rs/SDWebImageからダウンロードできます。

メモリ警告については、バックグラウンドで実行されているすべてのアプリケーションからのメモリの効率的な使用が原因であるアプリケーションだけが原因ではないため、バックグラウンドで実行されているアプリケーションを停止してみてください。

于 2013-04-23T06:58:57.160 に答える