-
-
Save akisute/1141953 to your computer and use it in GitHub Desktop.
#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); | |
} |
You are a life saver! thank you! I was wondering if it is possible to increase the speed of animation.
@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?
-
(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/1141953int 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);
}
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?
made an adaptation for swift 2 and NSImage: https://gist.github.com/ScottBuchanan/c63129cc2c5bb824fbac21c2d389ed22
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
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 :(