2013-04-06 2 views
2

Я разрабатываю приложение с галереей. Все изображения находятся на диске устройства (каталог документов), но я не могу отобразить его плавно.Плохая производительность с UIImageView (для локальных изображений)

Поскольку некоторые изображения большие (2000px * 2000px), я загружаю их в фоновый поток, уменьшаю их и отображаю на главной теме.

Вот мое расширение UIImageView:

@implementation UIImageView (BackgroundResize) 

- (void)localImageFromPath: (NSString *) path scaledTo: (CGSize) size { 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); 
    dispatch_async(queue, ^{ 
     //Load image 
     NSData * imgData = [[NSData alloc] initWithContentsOfFile:path]; 
     UIImage * original = [[[UIImage alloc] initWithData:imgData] autorelease]; 
     [imgData release]; 
     CGSize imgSize = original.size; 
     float widthScale = size.width/imgSize.width; 
     float heightScale = size.height/imgSize.height; 
     float scaleFactor = widthScale; 
     if (heightScale < scaleFactor) { 
      scaleFactor = heightScale; 
     } 
     UIImage * result = nil; 
     //Scale if necessary 
     if (scaleFactor < 1.0) { 
      result = [[UIImage alloc] initWithCGImage:original.CGImage scale:1/scaleFactor orientation:original.imageOrientation]; 
     } else { 
      result = [original retain]; 
     } 
     NSLog(@"Image prepeared on backgroud thread, update ui image on main.."); 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"Begin updating image on main thread"); 
      self.image = result; 
      [result release]; 
      [[NSNotificationCenter defaultCenter] postNotificationName:NTF_IMG_LOADED object:self]; 
      NSLog(@"Updated"); 
     }); 

    }); 
    dispatch_release(queue); 

} 
@end 

В консоли вывода все кажется идеальным, все строки отладки отображаются менее чем за 1 сек (6 очень больших изображений), но интерфейс блокируется, и отображаются изображения с задержкой в ​​10 секунд.

Каков правильный подход для отображения больших локальных изображений на iOS?

App построен для iOS5 + ..

Спасибо,

+0

Почему вы выпускаете 'результат'? Вы проверяли, когда поступит уведомление? –

+0

Мы не используем ARC, результат - несколько строк выше сохраненных/выделенных, поэтому я должен его освободить. Уведомление приходит немедленно, за 10 секунд до фактического отображения изображения. – miham

ответ

2

Вы на самом деле не изменение размера изображения. Параметр scale - -initWithCGImage:scale: устанавливает отношение пикселей изображения к координатам экрана; он ничего не делает с основным изображением. Вы должны нарисовать изображение до CGContext, чтобы сжать его:

//Load image 
    UIImage * original = [[[UIImage alloc] initWithContentsOfFile:path] autorelease]; 

    CGSize imgSize = original.size; 
    float widthScale = size.width/imgSize.width; 
    float heightScale = size.height/imgSize.height; 
    float scaleFactor = widthScale; 
    if (heightScale < scaleFactor) { 
     scaleFactor = heightScale; 
    } 

    UIImage * result = nil; 
    //Scale if necessary 
    if (scaleFactor < 1.0) { 
     CGSize newSize = CGSizeMake(floorf(imgSize.width * scaleFactor), 
            floorf(imgSize.height * scaleFactor)); 
     UIGraphicsBeginImageContextWithOptions(newSize, NO, 0); 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
     [original drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
     result = UIGraphicsGetImageFromCurrentImageContext(); 
     [result retain]; 
     UIGraphicsEndImageContext(); 
    } else { 
     result = [original retain]; 
    } 
+0

Спасибо, ты меня спасешь :) – miham

Смежные вопросы