`

IPHONE GIF 播放的方式

    博客分类:
  • ios
 
阅读更多

转 http://blog.csdn.net/zltianhen/article/details/6841466

1.UIWebView 播放(无法控制周期)

.h

 

  1. @interface webViewController : UIViewController {  
  2.     IBOutlet UIWebView *WebView;  
  3.     IBOutlet UINavigationBar *Nav;  
  4. }  
  5. @property (nonatomic, retain) IBOutlet UIWebView *WebView;  
  6. @end  

.m

 

 

  1. - (void)viewDidLoad {  
  2.     [super viewDidLoad];  
  3.     [WebView setOpaque:NO];  
  4.     [WebView setBackgroundColor:[UIColor clearColor]];  
  5.     Nav.topItem.title=@"Welcome";  
  6.     Nav.topItem.leftBarButtonItem=nil;    
  7.     NSString* gifFileName = @"j_0002.gif";  
  8.     NSMutableString* htmlStr = [NSMutableString string];  
  9.     [htmlStr appendString:@"Hello Honey"];  
  10.     [htmlStr appendString:@"<p><img src=\""];  
  11.     [htmlStr appendFormat:@"%@",gifFileName];  
  12.     [htmlStr appendString:@"\" alt=\"picture\"/>"];  
  13.     [WebView loadHTMLString:htmlStr baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];  
  14. }  

2.glgif提供的开源代码实现(目前无法控制周期,需要自己再研究)

 

 

3.使用UIView的animation接口实现(GIF需要整理出每张图片)

动画可以用UIImageView,把动画的每一帧做成图片,转换成UIImage保存在animationImages数组中,调用- (void)startAnimating;就能看到动画

 

4.把GIF的通过GIF的格式转换成每张图片,通过UIView的animation的接口实现(GIF的格式貌似还是有问题,有部分图片的背景有问题)

 

  1. - (NSMutableArray*)getImgArrayByName:(NSString*)name  
  2. {  
  3.     //happybaby20  
  4.     NSURL *threeUrl =[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"crad"   
  5.                                                                             ofType:@"gif"]];  
  6.     NSData* data = [[NSData alloc]initWithContentsOfURL:threeUrl];  
  7.     NSMutableArray* array = nil;  
  8. //  long word = ::SizeofResource(handle,hrsrc);  
  9. //  char* lpBy = (char*)LoadResource(handle,hrsrc);  
  10.     DWORD word = data.length;  
  11.     BYTE* lpBy = (BYTE*)data.bytes;  
  12.     //每张图保存的指针 需要释放  
  13.     BYTE* pByte[100] = {0};  
  14.     //每张图的大小  
  15.     DWORD nu[100] = {0};  
  16.     //图片数量  
  17.     int num = 0;  
  18.     DWORD firstLocation = 0;  
  19.     for(DWORD j=0;j<word;j++)  
  20.     {  
  21.         if(lpBy[j]==0x2c)  
  22.         {  
  23.             if(lpBy[j-1]==0x00)  
  24.             {                 
  25.                 if(num==0)  
  26.                 {  
  27.                     firstLocation = j;  
  28.                 }  
  29.                   
  30.                 if (num== 10)  
  31.                 {  
  32.                     int sdf=nu[num];  
  33.                     int sdfadf=0;  
  34.                 }  
  35.                   
  36.                 PGifImage nowImage = (PGifImage)&lpBy[j+1];  
  37.                   
  38.                 if(nowImage->Flag.a==0)  
  39.                 {  
  40.                     DWORD number = 1+sizeof(GifImage);  
  41.                     while(lpBy[j+number]!=0)  
  42.                     {  
  43.                         number = number+(DWORD)lpBy[j+number]+1;  
  44.                     }  
  45.                     number++;  
  46.                     pByte[num] = new BYTE[number];  
  47.                     memset(pByte[num],0,number);  
  48.                     for(DWORD n=0;n<number;n++)  
  49.                     {  
  50.                         *(BYTE*)(pByte[num]+n) = lpBy[j+n];  
  51.                     }  
  52.                     nu[num] = number;  
  53.                     j = j+number-1;  
  54.                     num++;  
  55.                 }  
  56.                 else  
  57.                 {  
  58.                     //int number = 1+ sizeof(GifImage) + 3*(int)floor(pow(2.0f,nowImage->Flag.d));  
  59.                       
  60.                     DWORD number = 1+sizeof(GifImage)+1+3*(int)floor(pow(2.0f,nowImage->Flag.d));  
  61.                     while(lpBy[j+number] != 0)  
  62.                     {  
  63.                         number = number+lpBy[j+number];  
  64.                     }  
  65.                     pByte[num] = new BYTE[number];  
  66.                     memset(pByte[num],0,number);  
  67.                     for(int n=0;n<number;n++)  
  68.                     {  
  69.                         *(BYTE*)(pByte[num]+n) = lpBy[j+n];  
  70.                     }  
  71.                     nu[num] = number;  
  72.                     j = j+number-1;  
  73.                     num++;  
  74.                 }  
  75.                   
  76.   
  77.             }  
  78.         }  
  79.     }  
  80.   
  81.     NSArray *userPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  82.     NSString *documentDirectory = [userPaths objectAtIndex:0];  
  83.       
  84.     //数量上  
  85.     if (num>0)  
  86.     {  
  87.         array = [[NSMutableArray alloc] initWithCapacity:num];  
  88.     }  
  89.     for (int k=0; k<num; k++)  
  90.     {  
  91.         for(DWORD n=0;n<nu[k];n++)  
  92.         {  
  93.             lpBy[firstLocation+n] = *(BYTE*)(pByte[k]+n);  
  94.         }  
  95.           
  96.         NSData* imgbuf = [[NSData alloc] initWithBytes:lpBy length:nu[k] + firstLocation];  
  97.   
  98.         if (imgbuf)  
  99.         {  
  100.   
  101.             UIImage* img = [[UIImage alloc]initWithData:imgbuf];  
  102.               
  103.             NSData* imgdd = UIImagePNGRepresentation(img);  
  104.               
  105.             [imgdd writeToFile:[NSString stringWithFormat:@"%@/sdf%d.png",documentDirectory,k] atomically:NO];  
  106.               
  107.             if (img)  
  108.             {  
  109.                 [array addObject:img];  
  110.             }  
  111.               
  112.             [img release];  
  113.         }  
  114.         [imgbuf release];  
  115.           
  116.         delete pByte[k];  
  117.         pByte[k] = NULL;  
  118.     }  
  119.   
  120.     return array;  
  121. }  


5.QuartzCore播放 比较完美的方案

 

  1. #import <UIKit/UIKit.h>  
  2. #import <ImageIO/ImageIO.h>  
  3. #import <MobileCoreServices/MobileCoreServices.h>  
  4.   
  5. @interface GifView : UIView {  
  6.     CGImageSourceRef gif;  
  7.     NSDictionary *gifProperties;  
  8.     size_t index;  
  9.     size_t count;  
  10.     NSTimer *timer;  
  11. }  
  12. - (id)initWithFrame:(CGRect)frame filePath:(NSString *)_filePath;  
  13. @end  

.m

 

 

  1. #import "GifView.h"  
  2. #import <QuartzCore/QuartzCore.h>  
  3.   
  4. @implementation GifView  
  5.   
  6.   
  7. - (id)initWithFrame:(CGRect)frame filePath:(NSString *)_filePath{  
  8.       
  9.     self = [super initWithFrame:frame];  
  10.     if (self) {  
  11.   
  12.         gifProperties = [[NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount]  
  13.                                                      forKey:(NSString *)kCGImagePropertyGIFDictionary] retain];  
  14.         gif = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:_filePath], (CFDictionaryRef)gifProperties);  
  15.         count =CGImageSourceGetCount(gif);  
  16.         timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(play) userInfo:nil repeats:YES];  
  17.         [timer fire];  
  18.     }  
  19.     return self;  
  20. }  
  21. -(void)play  
  22. {  
  23.     index ++;  
  24.     index = index%count;  
  25.     CGImageRef ref = CGImageSourceCreateImageAtIndex(gif, index, (CFDictionaryRef)gifProperties);  
  26.     self.layer.contents = (id)ref;  
  27. }  
  28. -(void)removeFromSuperview  
  29. {  
  30.     NSLog(@"removeFromSuperview");  
  31.     [timer invalidate];  
  32.     timer = nil;  
  33.     [super removeFromSuperview];  
  34. }  
  35. - (void)dealloc {  
  36.         NSLog(@"dealloc");  
  37.     CFRelease(gif);  
  38.     [gifProperties release];  
  39.     [super dealloc];  
  40. }  
  41.   
  42.   
  43. @end  

DEMO

 

 

  1. GifView *gifview = [[GifView alloc] initWithFrame:CGRectMake(0, 0, 200, 200) filePath:[[NSBundle mainBundle] pathForResource:@"test.gif" ofType:nil]];  
  2.     [self.view addSubview:gifview];  


 

 

分享到:
评论

相关推荐

    iPhone_GIF

    iPhone 通过 OpenGL es 播放 GIF 动画图片, 请欣赏, 请欣赏, 请欣赏, 请欣赏

    美图GIF iPhone版 v1.2.7正式版.zip

    “美图GIF-效果最好的GIF相机”是一款简单易用的GIF制作软件,可以拍摄超好玩的...【美图GIF iPhone版 1.2.6 更新信息】 1、新增“伦敦奥运”场景特效,运动卖萌两不误! 2、新增“画中画”场景特效,留住经典瞬间!

    Iphone开发代码实现gif

    使用openGL编写的实现png合成gif动画

    Gif-Object-c

    Object-c iphone 可以在View上产生动画, 下载解压后,运行在模拟器里,可以产生动画效果, 在View上绘一个ImageView一样,但可以实现动画效果

    Object-c生成Gif动画并且显示

    该Demo能够使用Object-c来生成GIF动画文件,并且生成的动画文件能够播放!代码不多但是效率很高 生成的GIF文件在Docment文件下,可以去看下 这个Demo可以根据各位的需求修改

    (0118)-iOS/iPhone/iPAD/iPod源代码-图像(Image)-GIF Image View

    显示gif图片。ios本身的UIImageView不支持gif图片,这个例子较好地解决了在ios中显示gif图片的问题。 注意:请在Mac下解压使用

    手机QQ空间 v4.0.5.1 iPhone版.zip

    Gif动画录制,鲜活再现 支持视频播放,同时加入Gif动画录制功能! 奇闻趣事轻松记录,精彩瞬间不再错过,让表达更给力。  个性滤镜,多图上传 精心挑选多款滤镜,总有一款适合你,让照片更加动人! 同时支持多图...

    poco相机 iphone v1.1.1

    5、手摇拼图、自由拼图、图片拼接、图中拼图等多种拼图方式满足您对多图片处理的各类需求,让你的微博分享更有吸引力! 6、一键多平台分享:可将照片一键分享到新浪微博、腾讯微博及POCO微博,内置@和#功能让分享...

    poco相机 iphone v1.1.2

    5、多种拼图方式:手摇拼图、自由拼图、图片拼接、图中拼图等满足您对多图片处理的各类需求,让你的微博分享更有吸引力! 6、一键多平台分享:可将照片一键分享到新浪微博、腾讯微博及POCO微博,内置@和#功能让分享...

    poco相机 iphone v1.7.2

    6、多种拼图方式:手摇拼图、自由拼图、图片拼接、图中拼图等满足您对多图片处理的各类需求,让你的微博分享更有吸引力! 7、网络备份云相册:内置网络备份功能,可将图片直接导入POCO图片社区提供的免费网络云相册...

    poco相机 iphone v1.5.1

    5、多种拼图方式:手摇拼图、自由拼图、图片拼接、图中拼图等满足您对多图片处理的各类需求,让你的微博分享更有吸引力! 6、一键多平台分享:可将照片一键分享到新浪微博、腾讯微博、POCO微博、人人网、QQ空间、...

    新浪微博 v4.0.0 iPhone版.zip

    支持查看原图、GIF动画、视频、音频,查看好友微博更新及分组微博筛选; 分享新鲜事儿 可以快速的分享文字、图片和地址位置信息,10种精美照片滤镜供你选择; 私信聊天 支持发送语音、表情、图片及位置信息,...

    POCO相机 iphone v1.6.2

    6、多种拼图方式:手摇拼图、自由拼图、图片拼接、图中拼图等满足您对多图片处理的各类需求,让你的微博分享更有吸引力! 7、网络备份云相册:内置网络备份功能,可将图片直接导入POCO图片社区提供的免费网络云相册...

    POCO相机 v1.8.0 for iphone

    6、多种拼图方式:手摇拼图、自由拼图、图片拼接、图中拼图等满足您对多图片处理的各类需求,让你的微博分享更有吸引力! 7、网络备份云相册:内置网络备份功能,可将图片直接导入POCO图片社区提供的免费网络云相册...

    长按删除摆动动态gif图片

    本代码包含对gridview的常见操作长按出现删除按钮、能被删除图标抖动、系统图标不抖动、添加gif动态图片效果

    swift-模仿iPhone本地通知自定义写了一个本地通知动画

    模仿iPhone本地通知,自定义写了一个本地通知动画

    poco相机 iphone v1.7.0

    6、多种拼图方式:手摇拼图、自由拼图、图片拼接、图中拼图等满足您对多图片处理的各类需求,让你的微博分享更有吸引力! 7、网络备份云相册:内置网络备份功能,可将图片直接导入POCO图片社区提供的免费网络云相册...

    POCO相机 iphone v1.6.1

    ● iPhone版上线一周内,相继荣登大陆/港澳台/新马泰等华语国家及地区free apps排行榜第一!成为苹果商店最热门的摄影类APP之一! 屡次成为苹果商店热门产品推荐。 POCO相机,功能强大使用简单且尊重摄影人的拍摄...

    poco相机 iphone v1.6.0

    ● iPhone版上线一周内,相继荣登大陆/港澳台/新马泰等华语国家及地区free apps排行榜第一!成为苹果商店最热门的摄影类APP之一! 屡次成为苹果商店热门产品推荐。 POCO相机,功能强大使用简单且尊重摄影人的拍摄...

    poco相机 iphone v1.5.0

    ● iPhone版上线一周内,相继荣登大陆/港澳台/新马泰等华语国家及地区free apps排行榜第一!成为苹果商店最热门的摄影类APP之一! 屡次成为苹果商店热门产品推荐。 POCO相机,功能强大使用简单且尊重摄影人的拍摄...

Global site tag (gtag.js) - Google Analytics