2017-06-14 4 views
1

J'ai un GIF dans mon projet et je veux obtenir toutes les images de GIF dans un tableau. J'utilise ceci pour créer une imageview et animer à mon aise.Comment faire pour obtenir des images à partir d'un fichier GIF du projet

- (UIImageView *)createImageViewWith:(NSData *)data frame:(CGRect)rect bAnimate:(BOOL)flag withAnimation:(BOOL)shouldAnimate { 
    CGImageSourceRef srcImage = CGImageSourceCreateWithData((__bridge CFTypeRef) data, nil); 
    if (!srcImage) { 
     NSLog(@"loading image failed"); 
    } 

    size_t imgCount = CGImageSourceGetCount(srcImage); 
    NSTimeInterval totalDuration = 0; 
    NSNumber *frameDuration; 
    NSMutableArray *arrayImages; 

    arrayImages = [[NSMutableArray alloc] init]; 
    for (NSInteger i = 0; i < imgCount; i ++) { 
     CGImageRef cgImg = CGImageSourceCreateImageAtIndex(srcImage, i, nil); 
     if (!cgImg) { 
      NSLog(@"loading %ldth image failed from the source", (long)i); 
      continue; 
     } 

     UIImage *img = [self scaledImage:[UIImage imageWithCGImage:cgImg] size:rect.size]; 
     [arrayImages addObject:img]; 

     NSDictionary *property = CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(srcImage, i, nil)); 
     NSDictionary *gifDict = property[(__bridge id) kCGImagePropertyGIFDictionary]; 

     frameDuration = gifDict[(__bridge id) kCGImagePropertyGIFUnclampedDelayTime]; 
     if (!frameDuration) { 
      frameDuration = gifDict[(__bridge id) kCGImagePropertyGIFDelayTime]; 
     } 

     totalDuration += frameDuration.floatValue; 

     CGImageRelease(cgImg); 
    } 

    if (srcImage != nil) { 
     CFRelease(srcImage); 
    } 

    UIImageView *imgView = [[UIImageView alloc] initWithFrame:rect]; 
    imgView.image = arrayImages.firstObject; 
    imgView.autoresizingMask = 0B11111; 
    imgView.userInteractionEnabled = YES; 

    imgView.animationImages = arrayImages; 
    imgView.animationDuration = totalDuration; 
    imgView.animationRepeatCount = (flag == YES? 0 : 1); 
    if (shouldAnimate) { 
     [imgView startAnimating]; 
    } 

    return imgView; 
} 

Ce code prend beaucoup de temps pour obtenir les images et obtenir un imageview utilisable final. Par exemple, ce code prend environ 4 secondes pour charger un gif d'environ 120 images qui s'animent complètement en 4-5 secondes.

Existe-t-il un autre moyen d'extraire les images? Merci.

Répondre

1

Existe-t-il un autre moyen d'extraire les images?

Oui.

Vous pouvez essayer un décodeur GIF tiers. Par exemple, This one n'est rien de plus qu'un en-tête C/ObjC. Il suffit de l'inclure dans votre projet, de définir un rappel de l'éditeur d'image et d'appeler la fonction de décodage.

+0

OK merci je vais l'essayer un jour :) –