2011-10-22 65 views
0

我正在编写一个应用程序,它是UIImagePicker的克隆,但使用了资源库。当用户选择一张照片时,图片加载需要一点时间。我注意到,当我使用与我正在开发的功能相同的照片应用程序时,图像加载速度更快。我听说这个网站上的另一位响应者提到以下内容以模仿照片应用程序的功能:如何加速使用资源库加载图像?

“首先加载缩略图图像(最好使用dispatch_async) - 这应该非常快速完成后,像上面所做的那样加载全屏图像,这就是苹果在Photo App中所做的,以提供流畅的用户体验。“

有没有人有任何代码示例如何可以完成?我不太确定我是否明白他的意思。

另外这里是我的代码针对我使用加载的图像(我传递该图像作为一个参数传递给另一个视图控制器):

myImage = [UIImage imageWithCGImage:[[myAsset defaultRepresentation] fullScreenImage]]; 
+0

您是否已经加载了每张图片的缩略图以便在图像选取器副本中显示? – huesforalice

+0

@huesforalice是的,但我不确定它是如何将它转换得更快或更平滑一些,如果我之后做了全屏图像。 –

回答

4

ALAsset有两个方法获得缩略图:

- (CGImageRef)thumbnail 
- (CGImageRef)aspectRatioThumbnail 

我敢打赌,他们比获取全屏大小版本的资产要快。

另外,您可以使用异步操作来包装它们。一定要更新主线程中的用户界面。大致如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    /* obtain the image here */ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     /* update screen here */ 
    }); 
    [pool drain]; 
}); 

如果您需要获取视频的缩略图,您应该使用AVAssetImageGenerator。它有一种方法来异步获取它们。

寻找苹果示例代码(AVEditDemo和其他可能与资产库一起工作的代码)。

+0

谢谢!对你的解决方案有几个问题。 1)如果我使用aspectRatioThumbnail,然后放大图像,结果是sme,就像我使用fullscreenimage并缩小它。 IE,它是否产生相同的质量? 2)你为什么说加载它在一个线程中,这是否可以在加载时发生窗口转换?如何在窗口过渡发生时加载,我会以某种方式将该块用作上面代码行中的参数,并让它以某种方式返回图像? –

+0

不,你应该使用屏幕尺寸来显示全屏,否则它会看起来质量差,模糊。关于图片加载,你可以有一个单独的线程在后台加载缩略图和图像,然后,一旦它获得数据,更新主线程中的屏幕。这不容易用三句话来解释;搜索苹果样本或github中的示例。 – djromero