我正在尝试制作一个简单的图像查看器,用于查看ALAssetRepresentation的全分辨率图像。事实证明它并不那么简单。
我的第一个方法是在UIScrollView中创建一个大的UIImageView。虽然这确实有效,但速度很慢。
使用“照片”应用时,触摸图像时会立即打开较大的版本。首先,绘制的图像分辨率非常低。但很快,出现了更高分辨率的图像。此外,如果我放大,图像的分辨率会先降低,然后分辨率会增加。
我查看了WWDC 2010主题演讲#104,其中描述了Photos.app的工作原理。但我该如何实现呢?在主题演讲中,该演示使用了预先平铺的图像,这是我无法从ALAssetRepresentation中获得的。我试过加载全分辨率版本并只使用CATiledLayer绘制它,虽然缩放et.c并不慢,但绘制瓷砖时速度太慢。
Photos.app是否在某处或所发生的事情中缓存所有图像的较低分辨率版本?关于做什么的一些指示会有所帮助。
答案 0 :(得分:0)
是的,Photos.app正在缓存较低分辨率的图像。好消息是你也可以获得那些缓存版本。您可能已经知道ALAssetRepresentation的fullScreenImage属性和ALAsset的缩略图属性。这些应该更快加载。
我在高分辨率图像中发现的是,加载它可能需要1-2秒,所以我猜测只是在背景中加载高分辨率图像可能会对你有所帮助。 / p>
那么,如何加载图像的低分辨率版本,然后当你有i时切换到高分辨率版本。它可能有点复杂,但希望这可以让你开始。由于您正在使用AssetsLibrary,因此您将不得不使用iOS 4,这是个好消息,因为您可以使用块和GCD / libdispatch轻松完成此操作。我很高兴你正在观看WWDC视频 - 查看有关GCD的大量信息的会议206和211。
基本思想是你要在主线程上显示较低分辨率版本,然后要求后台线程加载全分辨率图像,然后告诉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
});
});
}