2014-02-17 49 views
0

我正在使用GIF查看器,但我遇到了縮略圖圖像的問題。它們不是動畫,但是當我將巨大的gif設置爲imageView時,它仍然需要大量時間和接口滯後。如何將GIF圖像轉換爲輕量級UIImage?

這裏是我的方法,我是如何做到這一點:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView 
       cellForItemAtIndexPath:(NSIndexPath *)indexPath 
    { 
     MyCell *myCell = [collectionView 
             dequeueReusableCellWithReuseIdentifier:@"Cell" 
             forIndexPath:indexPath]; 
     UIImage *image; 

     NSData *data = [NSData dataWithContentsOfURL:self.dataSource[indexPath.row]]; 
     image = [UIImage imageWithData:data]; 

     myCell.myImageView.image = image; 

     return myCell; 
    } 

網址是局部的,因爲我已經在這裏找到了瓶頸,設置巨大的GIF(每個幾兆字節)的UIImage的是昂貴的,需要時間。

如何對此進行優化? 我想從我的圖片GIF數據創建輕量級縮略圖非動畫圖像。我如何去做這件事?

編輯: 其實我已經實現緩存來存儲它們,但這不是理想的解決方案,因爲我必須偶爾清除緩存內存警告。我的問題仍然有效。這裏是我的代碼現在:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView 
       cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MyCell *myCell = [collectionView 
            dequeueReusableCellWithReuseIdentifier:@"Cell" 
            forIndexPath:indexPath]; 
    UIImage *image; 

    if ([self.cache objectForKey:self.dataSource[indexPath.row]]) { 

     image = [UIImage imageWithData:[self.cache objectForKey:self.dataSource[indexPath.row]]]; 

    } else { 

     NSData *data = [NSData dataWithContentsOfURL:self.dataSource[indexPath.row]]; 
     image = [UIImage imageWithData:data]; 
    } 

    myCell.myImageView.image = image; 

    return myCell; 
} 
+0

爲什麼不使用[這個班級](https://github.com/arturogutierrez/Animated-GIF-iPhone) – Coder404

+0

@ Coder404我已經有GIF動畫庫。我在細節屏幕上以動畫視圖展示它們。對於我需要的屏幕,集合視圖,我希望它們不是動畫和輕量級的。 – Dvole

回答

3

爲了快速顯示縮略圖,你需要時,它被下載到創建圖像的縮略圖,並將它緩存到磁盤上。在動畫GIF的情況下,您可能只想抓住第一幀,將其縮小到只有幾個千字節,將其緩存到磁盤,然後顯示它。像這樣的東西(未經測試的代碼):

NSData *imageData = ...; // wherever you get your image data 
UIImage *originalImage = [UIImage imageWithData:imageData]; 
CGSize originalSize = originalImage.size; 
CGSize scaleFactor = 0.25f; // whatever scale you want 
CGSize newSize = CGSizeMake(originalSize.width * scaleFactor, originalSize.height * scaleFactor); 

UIGraphicsBeginImageContext(newSize); 
CGRect newFrame = CGRectZero; 
newFrame.size = newSize; 
[originalImage drawInRect:newFrame]; 

UIImage *shrunkImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
NSData *pngDataToBeCached = UIImagePNGRepresentation(shrunkImage); 

加載生成的PNG應該非常快。將它們保存到緩存文件夾中,以確保它們不會備份到iTunes中。另外請記住,縮放和緩存圖像的過程可能發生在後臺線程上,以避免阻塞UI。

相關問題