Skip to content

Instantly share code, notes, and snippets.

@akisute
Created August 12, 2011 12:41
Show Gist options
  • Save akisute/1141953 to your computer and use it in GitHub Desktop.
Save akisute/1141953 to your computer and use it in GitHub Desktop.
Create an animated gif file from images in iOS
#import <UIKit/UIKit.h>
#import <ImageIO/ImageIO.h>
#import <MobileCoreServices/MobileCoreServices.h>
- (void)exportAnimatedGif
{
UIImage *shacho = [UIImage imageNamed:@"shacho.png"];
UIImage *bucho = [UIImage imageNamed:@"bucho.jpeg"];
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"animated.gif"];
CGImageDestinationRef destination = CGImageDestinationCreateWithURL((CFURLRef)[NSURL fileURLWithPath:path],
kUTTypeGIF,
2,
NULL);
NSDictionary *frameProperties = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:2] forKey:(NSString *)kCGImagePropertyGIFDelayTime]
forKey:(NSString *)kCGImagePropertyGIFDictionary];
NSDictionary *gifProperties = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount]
forKey:(NSString *)kCGImagePropertyGIFDictionary];
CGImageDestinationAddImage(destination, shacho.CGImage, (CFDictionaryRef)frameProperties);
CGImageDestinationAddImage(destination, bucho.CGImage, (CFDictionaryRef)frameProperties);
CGImageDestinationSetProperties(destination, (CFDictionaryRef)gifProperties);
CGImageDestinationFinalize(destination);
CFRelease(destination);
NSLog(@"animated GIF file created at %@", path);
}
@daniloster
Copy link

The second case is right, but the first not. In first case I've not got an error. The build is succeded, though not starts the ios simulator. there is no message error to both.

@akisute
Copy link
Author

akisute commented May 26, 2012

Hmm that's so weird. I can understand the case that the simulator tries to launch your app then immediately crashes, but if the simulator doesn't even start at all as you speak, I have completely no clue... I'm sorry :(

@rashidasgari
Copy link

You are a life saver! thank you! I was wondering if it is possible to increase the speed of animation.

@SeanDunford
Copy link

@akisute I know this is a pretty old post but when I save images like this they playback super duper slow. I have tried to use
[NSNumber numberWithFloat:0.0] forKey:(NSString *)kCGImagePropertyGIFDelayTime]
and
[NSNumber numberWithInt:0.0] forKey:(NSString *)kCGImagePropertyGIFDelayTime]

but the frames still play very very slow. Any thoughts?

@SeanDunford
Copy link

  • (void)exportAnimatedGif
    {
    //Completely in memory approach. Have to be careful with this as it *WILL crash the app and maybe phone if too much
    //is loaded into memory. source: https://gist.github.com/akisute/1141953

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

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

    for(int i = 1; i < [images count]; i ++){
    int j = [images count] - i;
    UIImage *img = [images objectAtIndex:j];
    CGImageDestinationAddImage(destination, img.CGImage, (__bridge CFDictionaryRef)frameProperties);
    }

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

@theSiberman
Copy link

Any luck with getting an acceptable frame rate? Mine is incredibly slow, and looping is dodgy as well? Is there a way to set dither settings etc?

@ScottBuchanan
Copy link

@sh0rt2020
Copy link

sh0rt2020 commented May 25, 2017

I have a problem with this piece of code, when I use this snippet to generate one gif with two static image, it works fine. But when I use ffmpeg to transform this gif to mp4, this mp4 file has a problem that one image is at beginning position and another is at the end. So when I loop this video, it acts strange.
this is my gif

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment