2011-10-22 107 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