之前做过一个关于gif的app,一直没有来得及记录,现在记录一下学习的过程.
制作gif是基于ImageIO.framework,所以要先添加这个库
gif分解图片
1. <span style="font-size:18px;">
2.
3. - (void)viewDidLoad
4. {
5. super viewDidLoad];
6.
7. NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"test101" ofType:@"gif"]];
8.
9. //通过data获取image的数据源
10. NULL);
11.
12. //获取帧数
13. size_t count = CGImageSourceGetCount(source);
14.
15. array];
16. for (size_t i = 0; i < count; i++)
17. {
18. //获取图像
19. NULL);
20.
21. //生成image
22. UIImage *image = [UIImage imageWithCGImage:imageRef scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];
23.
24. addObject:image];
25.
26. CGImageRelease(imageRef);
27. }
28. CFRelease(source);
29.
30. int i = 0;
31. for (UIImage *img in tmpArray) {
32. //写文件
33. NSData *imageData = UIImagePNGRepresentation(img);
34.
35. NSString *pathNum = [[self backPath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%d.png",i]];
36. writeToFile:pathNum atomically:NO];
37. i++;
38. }
39.
40. }
41.
42. //返回保存图片的路径
43. -(NSString *)backPath{
44. NSFileManager *fileManager = [NSFileManager defaultManager];
45.
46. NSString *path = [UniversalMethod backDocumentDirectoryPath];
47.
48. NSString *imageDirectory = [path stringByAppendingPathComponent:@"Normal"];
49.
50. createDirectoryAtPath:imageDirectory withIntermediateDirectories:YES attributes:nil error:nil];
51. return imageDirectory;
52. }
53. </span>
gif的制作
制作gif需要依赖MobileCoreServices.framework
1. //gif的制作
2.
3. //获取源数据image
4. NSMutableArray *imgs = [[NSMutableArray alloc]initWithObjects:[UIImage imageNamed:@"bear_1"],[UIImage imageNamed:@"bear_2"], nil nil];
5.
6. //图像目标
7. CGImageDestinationRef destination;
8.
9. //创建输出路径
10. NSArray *document = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
11. NSString *documentStr = [document objectAtIndex:0];
12. NSFileManager *fileManager = [NSFileManager defaultManager];
13. NSString *textDirectory = [documentStr stringByAppendingPathComponent:@"gif"];
14. createDirectoryAtPath:textDirectory withIntermediateDirectories:YES attributes:nil error:nil];
15. NSString *path = [textDirectory stringByAppendingPathComponent:@"test101.gif"];
16.
17.
18. @"%@",path);
19.
20. //创建CFURL对象
21. /*
22. CFURLCreateWithFileSystemPath(CFAllocatorRef allocator, CFStringRef filePath, CFURLPathStyle pathStyle, Boolean isDirectory)
23.
24. allocator : 分配器,通常使用kCFAllocatorDefault
25. filePath : 路径
26. pathStyle : 路径风格,我们就填写kCFURLPOSIXPathStyle 更多请打问号自己进去帮助看
27. isDirectory : 一个布尔值,用于指定是否filePath被当作一个目录路径解决时相对路径组件
28. */
29. CFURLRef url = CFURLCreateWithFileSystemPath (
30. kCFAllocatorDefault,
31. (CFStringRef)path,
32. kCFURLPOSIXPathStyle,
33. false);
34.
35. //通过一个url返回图像目标
36. .count, NULL);
37.
38. //设置gif的信息,播放间隔时间,基本数据,和delay时间
39. NSDictionary *frameProperties = [NSDictionary
40. dictionaryWithObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:0.3], (NSString *)kCGImagePropertyGIFDelayTime, nil nil]
41. forKey:(NSString *)kCGImagePropertyGIFDictionary];
42.
43. //设置gif信息
44. NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:2];
45.
46. setObject:[NSNumber numberWithBool:YES] forKey:(NSString*)kCGImagePropertyGIFHasGlobalColorMap];
47.
48. setObject:(NSString *)kCGImagePropertyColorModelRGB forKey:(NSString *)kCGImagePropertyColorModel];
49.
50. setObject:[NSNumber numberWithInt:8] forKey:(NSString*)kCGImagePropertyDepth];
51.
52. setObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount];
53. NSDictionary *gifProperties = [NSDictionary dictionaryWithObject:dict
54. forKey:(NSString *)kCGImagePropertyGIFDictionary];
55. //合成gif
56. for (UIImage* dImg in imgs)
57. {
58. .CGImage, (__bridge CFDictionaryRef)frameProperties);
59. }
60. CGImageDestinationSetProperties(destination, (__bridge CFDictionaryRef)gifProperties);
61. CGImageDestinationFinalize(destination);
62. CFRelease(destination);
源码:GIF制作
参考文章:iOS:GIF图片的预览以及生成
iOS由ImageIO.framework实现gif的系统解码 -
VicStudio CGImageSource对图像数据读取任务的抽象