2016-04-14 11 views
1

私はUICollectionViewを持っており、各アイテムは正方形の画像を表示しています。 各画像は大きなファイル(> 3MB)で、アプリがこのビューにジャンプしようとするたびに表示されます。それは2〜3秒遅れます。 大きなファイルからサムネイルを作成して、各コレクションアイテムに適用しようとしています。しかし、それは時間を節約できないようです。uiimageからサムネイルを生成する効果的な方法

有効な方法はありますか?直接のImageIOを使用して:

フォローは私が圧縮された画像ファイルからサムネイルを作成するための方法で構築さがありますサムネイルに

-(UIImage*)resizedImageToSize:(CGSize)dstSize{ 
CGImageRef imgRef = self.CGImage; 
// the below values are regardless of orientation : for UIImages from Camera, width>height (landscape) 
CGSize srcSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); // not equivalent to self.size (which is dependant on the imageOrientation)! 

/* Don't resize if we already meet the required destination size. */ 
if (CGSizeEqualToSize(srcSize, dstSize)) { 
    return self; 
} 

CGFloat scaleRatio = dstSize.width/srcSize.width; 
UIImageOrientation orient = self.imageOrientation; 
CGAffineTransform transform = CGAffineTransformIdentity; 
switch(orient) { 

    case UIImageOrientationUp: //EXIF = 1 
     transform = CGAffineTransformIdentity; 
     break; 

    case UIImageOrientationUpMirrored: //EXIF = 2 
     transform = CGAffineTransformMakeTranslation(srcSize.width, 0.0); 
     transform = CGAffineTransformScale(transform, -1.0, 1.0); 
     break; 

    case UIImageOrientationDown: //EXIF = 3 
     transform = CGAffineTransformMakeTranslation(srcSize.width, srcSize.height); 
     transform = CGAffineTransformRotate(transform, M_PI); 
     break; 

    case UIImageOrientationDownMirrored: //EXIF = 4 
     transform = CGAffineTransformMakeTranslation(0.0, srcSize.height); 
     transform = CGAffineTransformScale(transform, 1.0, -1.0); 
     break; 

    case UIImageOrientationLeftMirrored: //EXIF = 5 
     dstSize = CGSizeMake(dstSize.height, dstSize.width); 
     transform = CGAffineTransformMakeTranslation(srcSize.height, srcSize.width); 
     transform = CGAffineTransformScale(transform, -1.0, 1.0); 
     transform = CGAffineTransformRotate(transform, 3.0 * M_PI_2); 
     break; 

    case UIImageOrientationLeft: //EXIF = 6 
     dstSize = CGSizeMake(dstSize.height, dstSize.width); 
     transform = CGAffineTransformMakeTranslation(0.0, srcSize.width); 
     transform = CGAffineTransformRotate(transform, 3.0 * M_PI_2); 
     break; 

    case UIImageOrientationRightMirrored: //EXIF = 7 
     dstSize = CGSizeMake(dstSize.height, dstSize.width); 
     transform = CGAffineTransformMakeScale(-1.0, 1.0); 
     transform = CGAffineTransformRotate(transform, M_PI_2); 
     break; 

    case UIImageOrientationRight: //EXIF = 8 
     dstSize = CGSizeMake(dstSize.height, dstSize.width); 
     transform = CGAffineTransformMakeTranslation(srcSize.height, 0.0); 
     transform = CGAffineTransformRotate(transform, M_PI_2); 
     break; 

    default: 
     [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"]; 

} 

///////////////////////////////////////////////////////////////////////////// 
// The actual resize: draw the image on a new context, applying a transform matrix 
UIGraphicsBeginImageContextWithOptions(dstSize, NO, self.scale); 

CGContextRef context = UIGraphicsGetCurrentContext(); 

if (!context) { 
    return nil; 
} 

if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { 
    CGContextScaleCTM(context, -scaleRatio, scaleRatio); 
    CGContextTranslateCTM(context, -srcSize.height, 0); 
} else { 
    CGContextScaleCTM(context, scaleRatio, -scaleRatio); 
    CGContextTranslateCTM(context, 0, -srcSize.height); 
} 

CGContextConcatCTM(context, transform); 

// we use srcSize (and not dstSize) as the size to specify is in user space (and we use the CTM to apply a scaleRatio) 
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, srcSize.width, srcSize.height), imgRef); 
UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return resizedImage; 

}

+0

あなたが最初の場所でからソースUIImagesを得るのです:

はここで仕事をしていません方法は?彼らはファイルやネットワークから読み込まれていますか? –

+0

@NikolaiRuheローカルファイルから読みます – user418751

答えて

0

を作成するために使用する方法です。イメージをより小さなビットマップのコンテキストにレンダリングするのと比較して、稲妻は高速です。

+ (UIImage *)thumbnailWithContentsOfURL:(NSURL *)URL maxPixelSize:(CGFloat)maxPixelSize 
{ 
    CGImageSourceRef imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)URL, NULL); 
    NSAssert(imageSource != NULL, @"cannot create image source"); 

    NSDictionary *imageOptions = @{ 
     (NSString const *)kCGImageSourceCreateThumbnailFromImageIfAbsent : (NSNumber const *)kCFBooleanTrue, 
     (NSString const *)kCGImageSourceThumbnailMaxPixelSize   : @(maxPixelSize), 
     (NSString const *)kCGImageSourceCreateThumbnailWithTransform  : (NSNumber const *)kCFBooleanTrue 
    }; 
    CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, (__bridge CFDictionaryRef)imageOptions); 
    CFRelease(imageSource); 

    UIImage *result = [[UIImage alloc] initWithCGImage:thumbnail]; 
    CGImageRelease(thumbnail); 

    return result; 
} 
関連する問題