2016-10-28 1 views
4

Dies ist ein Objective-Verfahren, das GIF-Bild erzeugt:GIF-Bild erzeugt auf iOS10 keine Schleifen mehr ewig auf Browser

@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 

Ausführen dieses Verfahrens auf iOS9 funktioniert gut, GIF Schleifen erzeugt immer auf Browser:

enter image description here

die gleiche Methode auf iOS10 schlägt fehl, GIF erzeugt nicht mehr Schleifen immer auf Browsern, es spielen nur einmal:

enter image description here

Außerdem kann durch diese Antwort inspiriert: https://stackoverflow.com/a/38082881/448662 ich einen Hex-Vergleich der beiden GIFs hat in beiden iOS9 und iOS10 erzeugt wird, scheint es, dass ein Segment (Netscape-Anwendungserweiterung) fehlt in der iOS10 GIF erzeugt, diese könnte der Grund sein, warum es keine Schleife gibt, aber ich kann mir nicht sicher sein.

Kurz gesagt, wie können wir GIF-Bild (mit ObjectiveC) generieren, die für immer im Browser endlos Schleifen?

enter image description here

+0

Soweit ich weiß, es ist alles auf dem Attribut imageview animationRepeat abhängt. –

+0

Ich brauche die generierte GIF-Schleife im Browser korrekt (das auf iOS generierte Bild wird auf den Server hochgeladen und dann auf der Website gerendert). Bearbeitete meine Frage, um das zu klären. – mkto

+0

@mkto Das Fehlen des 'NETSCAPE'-Erweiterungsbefehls ist das Problem. Wenn Sie eine ** Erweiterung der Anwendung ** vor dem ersten Frame mit Ihrer API hinzufügen können (tut mir leid, nicht auf IOS Code, so weiß ich nicht, wenn möglich) dann tun Sie es einfach. Wenn nicht, benutze entweder einen anderen Encoder lib oder injiziere den Chunk auf dir selbst (vorzugsweise im Speicher), alles was du brauchst um es zu kodieren hast du in meiner Antwort, die du verlinkt hast (in den Unterlinks ist auch der C++ Code um den richtigen Platz zu finden dafür). – Spektre

Antwort

3

fand ich die Lösung auf einer kürzlich auf dieser Repo GitHub begehen: https://github.com/NSRare/NSGIF/pull/23/files?diff=split

Grundsätzlich ruft CGImageDestinationSetProperties vor CGImageDestinationAddImage das Problem auf iOS10 löst.

Dies ist der Arbeitscode:

@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; 
} 
Verwandte Themen