1

我正在尝试制作一个简单的图像查看器来查看 ALAssetRepresentation 的全分辨率图像。事实证明,事情并没有那么简单。

我的第一种方法是在 UIScrollView 中制作一个大的 UIImageView。虽然这确实有效,但速度非常慢。

使用照片应用程序时,当您触摸图像时,较大的版本会立即打开。起初,正在绘制一个非常低分辨率的图像。但很快,出现了更高分辨率的图像。另外,如果我放大,图像首先是较低的分辨率,然后分辨率会增加。

我查看了 WWDC 2010 主题演讲 #104,其中描述了 Photos.app 的工作原理。但是我应该如何实现呢?在主题演讲中,演示使用了预先平铺的图像,这是我无法从 ALAssetRepresentation 中获得的。我试过只加载全分辨率版本并使用 CATiledLayer 绘制它,虽然缩放等并不慢,但绘制瓷砖时太慢了。

Photos.app 是否在某处缓存所有图像的低分辨率版本或发生了什么?一些关于做什么的指示会很有帮助。

4

1 回答 1

0

是的,Photos.app 正在缓存较低分辨率的图像。好消息是您也可以获得这些缓存版本。您可能已经知道 ALAssetRepresentation 的 fullScreenImage 属性和 ALAsset 的 thumbnail 属性。那些应该更快加载。

我发现高分辨率图像只是加载它可能需要 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 回答