`

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_GIF"这个主题聚焦于如何在iPhone应用中利用OpenGL ES技术来播放GIF动画图片。OpenGL ES(OpenGL for Embedded Systems)是一种轻量级的图形库,广泛应用于移动设备,如iPhone,用于实现高质量的2D和3D图形...

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

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

    Iphone开发代码实现gif

    GIF是一种支持动画的图像格式,通过将一系列静态帧组合在一起,形成连续播放的效果。每个帧可以有各自的延迟时间,这决定了图像在屏幕上的显示时长。在OpenGLES中,我们将通过加载这些静态PNG帧,然后按照指定的顺序...

    Gif-Object-c

    在iOS开发中,UIImageView通常用于显示静态图片,但通过特定的技术和方法,我们也能让它播放GIF动画。这种技术通常涉及到解析GIF文件格式,提取其帧数据,并以适当的间隔逐帧显示,以模拟动画效果。 标签"Movie ...

    OpenGL gif

    使用OpenGL播放GIF涉及以下几个关键步骤: 1. **数据加载**:首先,你需要读取GIF文件的数据,解析其帧信息,包括每帧的图像数据、延迟时间和透明度信息。这通常需要使用第三方库,如libGIF或开源项目SDWebImage,...

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

    在标题"(0118)-iOS/iPhone/iPAD/iPod源代码-图像(Image)-GIF Image View"中提到的问题,就是如何在iOS应用中实现GIF图片的播放功能。描述中指出,这个示例提供了一个解决方案,使得在iOS设备上可以良好地...

    Android手机实现 iphone qq在线

    同时,这主要是一种娱乐方式,目的是为了让QQ好友看到你似乎是用iPhone在线,但实际操作可能因不同版本的QQ应用而略有差异。对于追求真实体验的用户,购买iPhone可能是更好的选择。在进行这类操作时,应尊重他人的...

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

    在iOS开发中,使用Object-C实现GIF动画的生成与显示是一项常见的需求。GIF(Graphics Interchange Format)是一种支持动态图像的文件格式,广泛应用于社交媒体、网站和应用程序中。以下将详细介绍如何利用Object-C来...

    iphone编程

    这种灵活的工作方式在现代软件开发中非常常见,特别是在远程工作或分布式团队协作中。 【标签】:“学习资料”暗示了压缩包中的内容可能是教学材料,如教程、示例代码、学习笔记、问题解答等,这些对于初学者或有...

    iPhone之UIImageView入门

    在iOS开发中,UIImageView是苹果提供的一个非常重要的UI组件,用于显示图像,无论是静态图片还是动态GIF。在本教程中,我们将深入探讨如何在iPhone应用中使用UIImageView进行图片的展示和基本操作。 首先,...

    iphone动画实现代码

    在iOS中,原生的UIImageView并不支持GIF的自动播放,因此我们需要自定义一个类来处理这个需求。`JSAnimatedImagesView`,正如文件名所示,是一个第三方库,由Javi Soto开发,它提供了对动态图像的支持。 实现`...

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

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

    iPhone界面元素规格说明

    在提供的0_13101149727kwn.gif文件中,可能展示了各种iPhone界面元素的示例或者具体的尺寸规格。通过分析这个文件,开发者和设计师可以更直观地理解这些规格在实际设计中的应用。 总之,理解并遵循iPhone界面元素的...

    长按删除摆动动态gif图片

    在iOS中,可以使用第三方库如FLAnimatedImage,它提供了高效的gif解析和播放功能,可以方便地在UIImageView中展示gif动态图片。 最后,关于“gridView”。在Android中,`GridView`是一种布局管理器,可以将数据集...

    不用苹果手机照样显示iphone qq在线怎么弄?.docx

    2. **提取并处理头像**:可以采用截图的方式,或者重新下载一个新的头像进行替换。 #### 图像处理步骤 1. **打开Photoshop**:启动图像编辑软件Photoshop,插入准备好的头像图片。 2. **添加iPhone图标**:选择之前...

    iPhone序列号查询

    "DIY.gif" 文件可能是教程或提示信息的动态图像,指导用户如何使用这个序列号查询工具,或者展示查询结果的示例。DIY,即“Do It Yourself”,意味着用户可以自行操作,无需专业知识。 "关于.txt" 文件通常包含软件...

    2-8DongHua2.zip_iphone_手机动态

    2. PNG或GIF序列:用于制作动态效果的图像帧。 3. Xcode项目文件:可能包含了iOS应用的源代码,用于实现动态效果。 4. JSON或XML配置文件:可能存储了动画效果的参数和配置。 5. Audio文件:可能包含开机动画的音效...

    poco相机 iphone v1.1.1

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

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

    这种自定义通知动画能够使应用程序的通知呈现方式更加个性化,提升用户体验。 首先,我们来看一下iPhone原生的本地通知。本地通知是iOS系统提供的一种机制,当应用不在前台运行时,仍可以向用户发送消息。这些通知...

    poco相机 iphone v1.1.2

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

Global site tag (gtag.js) - Google Analytics