1

ALAssetRepresentation のフル解像度の画像を表示するための単純な画像ビューアを作成しようとしています。それほど単純ではないことがわかりました。

私の最初のアプローチは、UIScrollView 内に大きな UIImageView を作成することでした。これはうまくいきましたが、非常に遅かったです。

写真アプリを使用しているときに画像をタップすると、大きなバージョンがすぐに開きます。最初は、非常に低解像度の画像が描かれています。しかしすぐに、より解像度の高い画像が表示されます。また、ズームインすると、画像の解像度が最初に低くなり、次に解像度が高くなります。

WWDC 2010 基調講演 #104 をチェックしました。そこでは、Photos.app のしくみについて説明されています。しかし、これをどのように実装すればよいのでしょうか? 基調講演では、デモは事前にタイル化された画像を使用しています。これは、ALAssetRepresentation から取得することはできません。フル解像度バージョンをロードして CATiledLayer を使用して描画しようとしましたが、ズームなどは遅くありませんが、タイルを描画するときは遅すぎます。

Photos.app はすべての画像の低解像度バージョンをどこかにキャッシュしていますか、それとも何が起こっているのでしょうか? 何をすべきかについてのいくつかの指針が役立ちます。

4

1 に答える 1

0

はい、Photos.app は低解像度の画像をキャッシュしています。良いニュースは、これらのキャッシュされたバージョンも取得できることです。ALAssetRepresentation の fullScreenImage プロパティと ALAsset のサムネイル プロパティについては、おそらく既にご存じでしょう。それらはロードがはるかに速くなるはずです。

私が高解像度画像で見つけたのは、それをロードするだけで1〜2秒かかる可能性があるということです.バックグラウンドで高解像度画像をロードするだけでうまくいくかもしれません.

では、画像の低解像度バージョンをロードしてから、i がある場合に高解像度バージョンに切り替える方法を教えてください。少し複雑かもしれませんが、うまくいけば、これで始められるはずです。AssetsLibrary を使用しているため、iOS 4 を使用する必要があります。これは、ブロックと GCD/libdispatch を使用してかなり簡単に実行できるため、朗報です。WWDC ビデオをご覧いただきありがとうございます。セッション 206 と 211 をチェックして、GCD に関する多くの有益な情報を入手してください。

基本的な考え方は、メイン スレッドで低解像度バージョンを表示し、バックグラウンド スレッドにフル解像度の画像をロードするように要求し、CATiledLayer にフル解像度の画像に切り替えるように指示するというものです。

- (void)displayAsset:(ALAssetRepresentation *)asset {
  UIImage *lowresImage = [UIImage imageWithCGImage:asset.fullScreenImage
                               orientation:asset.orientation scale:asset.scale];
  // Add code here to display the lowresImage

  dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
    ^ {
      // Load the full resolution image from the asset
      UIImage *highresImage = [UIImage imageWithCGImage:asset.fullResolutionImage
                                   orientation:asset.orientation
                                   scale:asset.scale];

      // Once done, tell the main thread to display the tiles
      dispatch_async( dispatch_get_main_queue(),
        ^ {
          // Code to swap out the lowresImage for highresImage
        });
    });

}
于 2011-01-15T19:07:01.243 に答える