2016-04-14 31 views
1

UICollectionView'ım var ve her öğe kare bir görüntüyü gösteriyor. Her bir resim büyük dosyadır (> 3MB) ve her seferinde uygulama bu görünüme atlamaya çalışır. 2-3 saniye gecikecek. Büyük dosyadan bir küçük resim oluşturmaya çalışıyorum, ardından her koleksiyon öğesine uygulanacağım. Ama zaman tasarrufu değil gibi görünüyor.uiimage'den küçük resim oluşturmanın etkili yolu

Etkili bir yolu var mı? doğrudan ImageIO kullanarak:

Takip ben thumbnail

-(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

ilk etapta kaynak UIImages alabilirim:

Burada iş yapan bir yöntem değil mi? Dosya veya ağdan okunuyor mu? –

+0

@NikolaiRuhe Yerel dosyadan okudum – user418751

cevap

0

sıkıştırılmış görüntü dosyalarından küçük oluşturmak için bir şekilde inşa var oluşturmak için kullanabileceğiniz bir yöntemdir. Görüntüyü daha küçük bir bitmap içeriğine dönüştürmekle karşılaştırıldığında hızlı yıldırım.

+ (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; 
} 
İlgili konular