GIF图的完美拆解合成显示

Posted Ven519

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GIF图的完美拆解合成显示相关的知识,希望对你有一定的参考价值。

最近由于项目需要,需要先把gif图拆解开,然后在每一张图片上添加一些图片和文字,最后再合成gif文件;写了一个工具类可以每一帧画面并遵循每一帧所对应的显示时间进行播放,并且可以用多张图片指定每一帧播放时间来合成gif图。下面是使用方法和工具类:(需要添加framework : ImageIO、QuartzCore、MobileCoreServices

[cpp]  view plain  copy
  1. NSDate *date = [NSDate date];  
  2. //读取本地GIF图中每一帧图像的信息  
  3. NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"demo" withExtension:@"gif"];  
  4. NSDictionary *dic = [GifView getGifInfo:fileUrl];  
  5.   
  6. NSMutableArray *imageArray = [NSMutableArray array];  
  7. //在gif图的每一帧上面添加一段文字  
  8. for(int index=0;index<[dic[@"images"] count];index++)  
  9.   
  10.     //绘制view 已GIf图中的某一帧为背景并在view上添加文字  
  11.     UIView *tempView = [[UIView alloc] initWithFrame:CGRectFromString(dic[@"bounds"])];  
  12.     tempView.backgroundColor = [UIColor colorWithPatternImage:dic[@"images"][index]];  
  13.     UILabel *tempLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 10, 80, 20)];  
  14.     tempLabel.text = @"GIF测试";  
  15.     tempLabel.textColor = [UIColor redColor];  
  16.     tempLabel.backgroundColor = [UIColor clearColor];  
  17.     tempLabel.font = [UIFont boldSystemFontOfSize:20];  
  18.     [tempView addSubview:tempLabel];  
  19.   
  20.     //将UIView转换为UIImage  
  21.     UIGraphicsBeginImageContextWithOptions(tempView.bounds.size, NO, tempView.layer.contentsScale);  
  22.     [tempView.layer renderInContext:UIGraphicsGetCurrentContext()];  
  23.     UIImage *image = UIGraphicsGetImageFromCurrentImageContext();  
  24.     [imageArray addObject:image];  
  25.     UIGraphicsEndImageContext();  
  26.   
  27. //生成GIF图 -- loopCount 为0表示无限播放  
  28. NSString *path = [GifView exportGifImages:[imageArray copy] delays:dic[@"delays"] loopCount:0];  
  29.   
  30. //在页面上展示合成之后的GIF图  
  31. GifView *gifView = [[GifView alloc] initWithCenter:self.view.center fileURL:[NSURL fileURLWithPath:path]];  
  32. [self.view addSubview:gifView];  
  33. NSLog(@"合成GIF图用时:%f秒",[[NSDate date] timeIntervalSinceDate:date]);  



//GifView.h

[cpp]  view plain  copy
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface GifView : UIView  
  4.   
  5. /* 
  6.  * @brief desingated initializer 
  7.  */  
  8. - (id)initWithCenter:(CGPoint)center fileURL:(NSURL*)fileURL;  
  9. - (void)initFileURL:(NSURL*)fileURL;  
  10.   
  11. /* 
  12.  * @brief start Gif Animation 
  13.  */  
  14. - (void)startGif;  
  15. - (void)startGifAnimation;  
  16.   
  17. /* 
  18.  * @brief stop Gif Animation 
  19.  */  
  20. - (void)stopGif;  
  21.   
  22. /* 
  23.  * @brief get frames image(CGImageRef) in Gif 
  24.  */  
  25. + (NSDictionary *)getGifInfo:(NSURL *)fileURL;  
  26. + (NSString *)exportGifImages:(NSArray *)images delays:(NSArray *)delays loopCount:(NSUInteger)loopCount;  
  27.   
  28. @end  


//GifView.m

[cpp]  view plain  copy
  1. //  
  2. //  GifView.m  
  3. //  
  4. //  Created by marujun on 13-11-7.  
  5. //  Copyright (c) 2013年 极致. All rights reserved.  
  6. //  
  7.   
  8. #import "GifView.h"  
  9. #import <ImageIO/ImageIO.h>  
  10. #import <QuartzCore/QuartzCore.h>  
  11. #import <MobileCoreServices/MobileCoreServices.h>  
  12.   
  13.   
  14. @interface GifView()   
  15.     NSMutableArray *_frames;  
  16.     NSMutableArray *_frameDelayTimes;  
  17.   
  18.     CGPoint frameCenter;  
  19.     CADisplayLink *displayLink;  
  20.     int frameIndex;  
  21.     double frameDelay;  
  22.   
  23.     NSUInteger _loopCount;  
  24.     NSUInteger _currentLoop;  
  25.     CGFloat _totalTime;         // seconds  
  26.     CGFloat _width;  
  27.     CGFloat _height;  
  28.   
  29.   
  30. @end  
  31.   
  32. @implementation GifView  
  33.   
  34.   
  35. - (id)initWithCenter:(CGPoint)center fileURL:(NSURL*)fileURL;  
  36.   
  37.     self = [super initWithFrame:CGRectZero];  
  38.     if (self)   
  39.   
  40.         _frames = [[NSMutableArray alloc] init];  
  41.         _frameDelayTimes = [[NSMutableArray alloc] init];  
  42.   
  43.         _width = 0;  
  44.         _height = 0;  
  45.         frameCenter = center;  
  46.         [self initFileURL:fileURL];  
  47. 完美解决android显示gif

    用MATLAB将照片合成视频或者GIF图片以及Photoshop制作GIF图片

    将两个动画情节组合成一个 GIF/MP4

    imagemagick minimagick

    数商云:拆解合成橡胶行业产业链,供应链或成突围利器

    怎么把几张图片合成为一张GIF格式的图片?