2016-10-28 1 views
4

Ceci est une méthode ObjectiveC qui génère l'image GIF:Image GIF généré sur iOS10 ne boucles plus jamais sur le navigateur

@implementation NSArray (GIFImage) 

- (NSString*)GIFImageWithImageDuration:(CGFloat)GIFImageDuration 
{ 
    NSArray *images = self; 

    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"animated.gif"]; 
    CGImageDestinationRef destination = CGImageDestinationCreateWithURL((CFURLRef)[NSURL fileURLWithPath:path], 
                     kUTTypeGIF, 
                     images.count, 
                     NULL); 

    NSDictionary *frameProperties = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:GIFImageDuration] 
                            forKey:(NSString *)kCGImagePropertyGIFDelayTime] 
                   forKey:(NSString *)kCGImagePropertyGIFDictionary]; 


    NSDictionary *gifProperties = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount] 
                   forKey:(NSString *)kCGImagePropertyGIFDictionary]; 

    for (NSInteger index = 0; index < images.count; index++) 
    { 
     UIImage *image = (UIImage *)[images objectAtIndex:index]; 
     CGImageDestinationAddImage(destination, image.CGImage, (CFDictionaryRef)frameProperties); 
    } 

    CGImageDestinationSetProperties(destination, (CFDictionaryRef)gifProperties); 
    CGImageDestinationFinalize(destination); 
    CFRelease(destination); 
    NSLog(@"animated GIF file created at %@", path); 
    return path; 
} 

@end 

L'exécution de cette méthode sur iOS9 fonctionne bien, GIF généré boucles pour toujours sur les navigateurs:

enter image description here

l'exécution de la même méthode sur iOS10 échoue, GIF généré ne boucles plus jamais sur les navigateurs, il joue qu'une seule fois:

enter image description here

Par ailleurs, inspiré par cette réponse: https://stackoverflow.com/a/38082881/448662, je fait une comparaison hexagonale des deux GIFs générés dans les deux iOS9 et iOS10, il semble qu'un segment (extension de l'application Netscape) est manquant dans le iOS10 généré GIF, cette pourrait être la raison pour laquelle il ne boucle pas, mais je ne peux pas être sûr. En bref, comment pouvons-nous générer une image GIF (en utilisant ObjectiveC) qui boucle pour toujours sur le navigateur?

enter image description here

+0

Pour autant que je sais que tout dépend de l'attribut imageview de animationRepeat. –

+0

J'ai besoin que le GIF généré boucle correctement sur le navigateur (l'image générée sur iOS sera téléchargée sur le serveur puis rendue sur le site Web). Edité ma question pour clarifier ceci. – mkto

+0

@mkto Manquant la commande d'extension 'NETSCAPE' est le problème. Si vous pouvez ajouter un morceau ** extension d'application ** avant la première image avec votre API (désolé, ne codez pas sur IOS donc je ne sais pas si possible) alors faites-le. Si ce n'est pas utiliser un autre codeur lib ou injecter le morceau sur vous-même (de préférence en mémoire) tout ce dont vous avez besoin pour le coder vous avez dans ma réponse que vous avez lié (dans les sous-liens est aussi le code C++ pour trouver le bon endroit pour ça). – Spektre

Répondre

3

J'ai trouvé la solution sur une récente commit sur ce repo GitHub: https://github.com/NSRare/NSGIF/pull/23/files?diff=split

En fait, appeler CGImageDestinationSetProperties avant CGImageDestinationAddImage permet de résoudre le problème sur iOS10.

C'est le code de travail:

@implementation NSArray (GIFImage) 
- (NSString*)GIFImageWithImageDuration:(CGFloat)GIFImageDuration 
{ 
    NSArray *images = self; 

    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"animated.gif"]; 
    CGImageDestinationRef destination = CGImageDestinationCreateWithURL((CFURLRef)[NSURL fileURLWithPath:path], 
                     kUTTypeGIF, 
                     images.count, 
                     NULL); 

    NSDictionary *frameProperties = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:GIFImageDuration] 
                            forKey:(NSString *)kCGImagePropertyGIFDelayTime] 
                   forKey:(NSString *)kCGImagePropertyGIFDictionary]; 


    NSDictionary *gifProperties = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount] 
                   forKey:(NSString *)kCGImagePropertyGIFDictionary]; 

    CGImageDestinationSetProperties(destination, (CFDictionaryRef)gifProperties); 

    for (NSInteger index = 0; index < images.count; index++) 
    { 
     UIImage *image = (UIImage *)[images objectAtIndex:index]; 
     CGImageDestinationAddImage(destination, image.CGImage, (CFDictionaryRef)frameProperties); 
    } 

    CGImageDestinationFinalize(destination); 
    CFRelease(destination); 
    NSLog(@"animated GIF file created at %@", path); 
    return path; 
}