亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS開發中實現顯示gif圖片的方法

2020-07-26 03:33:44
字體:
來源:轉載
供稿:網友

我們知道Gif是由一陣陣畫面組成的,而且每一幀畫面播放的時??赡軙幌嗟?,觀察上面兩個例子,發現他們都沒有對Gif中每一幀的顯示時常做處理,這樣的結果就是整個Gif中每一幀畫面都是以固定的速度向前播放,很顯然這并不總會符合需求。
 
  于是自己寫一個解析Gif的工具類,解決每一幀畫面并遵循每一幀所對應的顯示時間進行播放。
 
  程序的思路如下:
 
  1、首先使用ImageIO庫中的CGImageSource家在Gif文件。
 
  2、通過CGImageSource獲取到Gif文件中的總的幀數,以及每一幀的顯示時間。
 
  3、通過CAKeyframeAnimation來完成Gif動畫的播放。
 
  下面直接上我寫的解析和播放Gif的工具類的代碼:
 

復制代碼 代碼如下:

//
//  SvGifView.h
//  SvGifSample
//
//  Created by maple on 3/28/13.
//  Copyright (c) 2013 smileEvday. All rights reserved.
//


#import <UIKit/UIKit.h>

@interface SvGifView : UIView


/*
 * @brief desingated initializer
 */
- (id)initWithCenter:(CGPoint)center fileURL:(NSURL*)fileURL;

/*
 * @brief start Gif Animation
 */
- (void)startGif;

/*
 * @brief stop Gif Animation
 */
- (void)stopGif;

/*
 * @brief get frames image(CGImageRef) in Gif
 */
+ (NSArray*)framesInGif:(NSURL*)fileURL;


@end


//
//  SvGifView.m
//  SvGifSample
//
//  Created by maple on 3/28/13.
//  Copyright (c) 2013 smileEvday. All rights reserved.
//

#import "SvGifView.h"
#import <ImageIO/ImageIO.h>
#import <QuartzCore/CoreAnimation.h>

/*
 * @brief resolving gif information
 */
void getFrameInfo(CFURLRef url, NSMutableArray *frames, NSMutableArray *delayTimes, CGFloat *totalTime,CGFloat *gifWidth, CGFloat *gifHeight)
{
    CGImageSourceRef gifSource = CGImageSourceCreateWithURL(url, NULL);
   
    // get frame count
    size_t frameCount = CGImageSourceGetCount(gifSource);
    for (size_t i = 0; i < frameCount; ++i) {
        // get each frame
        CGImageRef frame = CGImageSourceCreateImageAtIndex(gifSource, i, NULL);
        [frames addObject:(id)frame];
        CGImageRelease(frame);
       
        // get gif info with each frame
        NSDictionary *dict = (NSDictionary*)CGImageSourceCopyPropertiesAtIndex(gifSource, i, NULL);
        NSLog(@"kCGImagePropertyGIFDictionary %@", [dict valueForKey:(NSString*)kCGImagePropertyGIFDictionary]);
       
        // get gif size
        if (gifWidth != NULL && gifHeight != NULL) {
            *gifWidth = [[dict valueForKey:(NSString*)kCGImagePropertyPixelWidth] floatValue];
            *gifHeight = [[dict valueForKey:(NSString*)kCGImagePropertyPixelHeight] floatValue];
        }
       
        // kCGImagePropertyGIFDictionary中kCGImagePropertyGIFDelayTime,kCGImagePropertyGIFUnclampedDelayTime值是一樣的
        NSDictionary *gifDict = [dict valueForKey:(NSString*)kCGImagePropertyGIFDictionary];
        [delayTimes addObject:[gifDict valueForKey:(NSString*)kCGImagePropertyGIFDelayTime]];
       
        if (totalTime) {
            *totalTime = *totalTime + [[gifDict valueForKey:(NSString*)kCGImagePropertyGIFDelayTime] floatValue];
        }
    }
}

@interface SvGifView() {
    NSMutableArray *_frames;
    NSMutableArray *_frameDelayTimes;
   
    CGFloat _totalTime;         // seconds
    CGFloat _width;
    CGFloat _height;
}

@end

@implementation SvGifView


- (id)initWithCenter:(CGPoint)center fileURL:(NSURL*)fileURL;
{
    self = [super initWithFrame:CGRectZero];
    if (self) {
       
        _frames = [[NSMutableArray alloc] init];
        _frameDelayTimes = [[NSMutableArray alloc] init];
       
        _width = 0;
        _height = 0;
       
        if (fileURL) {
            getFrameInfo((CFURLRef)fileURL, _frames, _frameDelayTimes, &_totalTime, &_width, &_height);
        }
       
        self.frame = CGRectMake(0, 0, _width, _height);
        self.center = center;
    }
   
    return self;
}

+ (NSArray*)framesInGif:(NSURL *)fileURL
{
    NSMutableArray *frames = [NSMutableArray arrayWithCapacity:3];
    NSMutableArray *delays = [NSMutableArray arrayWithCapacity:3];
   
    getFrameInfo((CFURLRef)fileURL, frames, delays, NULL, NULL, NULL);
   
    return frames;
}

- (void)startGif
{
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
   
    NSMutableArray *times = [NSMutableArray arrayWithCapacity:3];
    CGFloat currentTime = 0;
    int count = _frameDelayTimes.count;
    for (int i = 0; i < count; ++i) {
        [times addObject:[NSNumber numberWithFloat:(currentTime / _totalTime)]];
        currentTime += [[_frameDelayTimes objectAtIndex:i] floatValue];
    }
    [animation setKeyTimes:times];
   
    NSMutableArray *images = [NSMutableArray arrayWithCapacity:3];
    for (int i = 0; i < count; ++i) {
        [images addObject:[_frames objectAtIndex:i]];
    }
   
    [animation setValues:images];
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
    animation.duration = _totalTime;
    animation.delegate = self;
    animation.repeatCount = 5;
   
    [self.layer addAnimation:animation forKey:@"gifAnimation"];
}

- (void)stopGif
{
    [self.layer removeAllAnimations];
}

// remove contents when animation end
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    self.layer.contents = nil;
}

// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}


@end


  代碼很短也比較容易,就不一一解釋了。最開始的那個C函數主要就是用來解析Gif的,之所以用C函數是因為我要返回多個信息,而Objective-c只能返回一個參數,而且Objective-c和C語言可以很方便的混合編程。

另外再介紹兩種使用UIImageView的方法:

1. 使用UIWebView播放

復制代碼 代碼如下:

    // 設定位置和大小
    CGRect frame = CGRectMake(50,50,0,0);
    frame.size = [UIImage imageNamed:@"guzhang.gif"].size;
    // 讀取gif圖片數據
    NSData *gif = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"guzhang" ofType:@"gif"]];
    // view生成
    UIWebView *webView = [[UIWebView alloc] initWithFrame:frame];
    webView.userInteractionEnabled = NO;//用戶不可交互
    [webView loadData:gif MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
    [self.view addSubview:webView];
    [webView release];

2.將gif圖片分解成多張png圖片,使用UIImageView播放。
代碼如下:

復制代碼 代碼如下:

 UIImageView *gifImageView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    NSArray *gifArray = [NSArray arrayWithObjects:[UIImage imageNamed:@"1"],
                                                  [UIImage imageNamed:@"2"],
                                                  [UIImage imageNamed:@"3"],
                                                  [UIImage imageNamed:@"4"],
                                                  [UIImage imageNamed:@"5"],
                                                  [UIImage imageNamed:@"6"],
                                                  [UIImage imageNamed:@"7"],
                                                  [UIImage imageNamed:@"8"],
                                                  [UIImage imageNamed:@"9"],
                                                  [UIImage imageNamed:@"10"],
                                                  [UIImage imageNamed:@"11"],
                                                  [UIImage imageNamed:@"12"],
                                                  [UIImage imageNamed:@"13"],
                                                  [UIImage imageNamed:@"14"],
                                                  [UIImage imageNamed:@"15"],
                                                  [UIImage imageNamed:@"16"],
                                                  [UIImage imageNamed:@"17"],
                                                  [UIImage imageNamed:@"18"],
                                                  [UIImage imageNamed:@"19"],
                                                  [UIImage imageNamed:@"20"],
                                                  [UIImage imageNamed:@"21"],
                                                  [UIImage imageNamed:@"22"],nil];
    gifImageView.animationImages = gifArray; //動畫圖片數組
    gifImageView.animationDuration = 5; //執行一次完整動畫所需的時長
    gifImageView.animationRepeatCount = 1;  //動畫重復次數
    [gifImageView startAnimating];
    [self.view addSubview:gifImageView];
    [gifImageView release];

注意:這個方法,如果gif動畫每楨間的時間間隔不同,不能達到此效果。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩视频一区| 日韩av在线影视| 欧美性猛交丰臀xxxxx网站| 91av在线影院| 久久精品国产亚洲7777| 亚洲精选一区二区| 92福利视频午夜1000合集在线观看| 日韩精品在线看| 欧美日韩高清在线观看| 91啪国产在线| 91综合免费在线| 成人av在线亚洲| 色黄久久久久久| 久久亚洲国产成人| 精品久久久久久久大神国产| 久久精品色欧美aⅴ一区二区| 国产亚洲人成a一在线v站| 日韩**中文字幕毛片| 日韩在线免费视频| 91美女片黄在线观| 欧美高清不卡在线| 欧美亚洲视频在线观看| 久久久精品国产一区二区| 亚洲春色另类小说| 日韩成人av网址| 亚洲sss综合天堂久久| 久久久伊人欧美| 国产精品久在线观看| 国产大片精品免费永久看nba| 国产欧美在线视频| 久久天天躁夜夜躁狠狠躁2022| 91免费欧美精品| 中文字幕欧美专区| 日韩va亚洲va欧洲va国产| 国产亚洲精品久久久久动| 奇米影视亚洲狠狠色| 亚洲aa在线观看| 欧美午夜xxx| 最新69国产成人精品视频免费| 中文字幕欧美视频在线| 久久亚洲国产精品| 91综合免费在线| 亚洲丁香久久久| 97色在线播放视频| 亚洲视频在线观看| 日韩成人在线视频| 亚洲护士老师的毛茸茸最新章节| 另类美女黄大片| 亚洲免费中文字幕| 6080yy精品一区二区三区| 日韩精品久久久久久福利| 国产欧美欧洲在线观看| 久久久99久久精品女同性| 亚洲www在线观看| 久久天天躁狠狠躁夜夜躁2014| 97香蕉超级碰碰久久免费的优势| 91色精品视频在线| 欧美精品国产精品日韩精品| 亚洲第一福利视频| 亚洲综合一区二区不卡| 成人激情视频在线观看| 亚洲丁香婷深爱综合| 国产日本欧美在线观看| 夜夜嗨av一区二区三区四区| 国语自产偷拍精品视频偷| www.亚洲天堂| 国产日本欧美在线观看| 奇米影视亚洲狠狠色| 成人免费视频97| 久久久黄色av| 日韩电影第一页| 国产精品福利小视频| 欧美精品一区二区三区国产精品| 欧美一级淫片播放口| 久久夜精品va视频免费观看| 日韩电影免费观看中文字幕| 欧美在线一级视频| 欧美电影免费播放| 亚洲护士老师的毛茸茸最新章节| 97在线看免费观看视频在线观看| 精品久久久久久久久国产字幕| 欧美国产乱视频| 中文字幕在线亚洲| 91欧美精品成人综合在线观看| 亚洲一区免费网站| 成人中文字幕+乱码+中文字幕| 奇门遁甲1982国语版免费观看高清| 中文字幕日韩欧美在线| 中文字幕免费精品一区| 亚洲精品国产综合久久| 欧美一级淫片aaaaaaa视频| 久久深夜福利免费观看| 国产精品日韩欧美大师| 日韩欧美第一页| 国产欧美日韩免费看aⅴ视频| 日韩欧美在线视频日韩欧美在线视频| 疯狂做受xxxx高潮欧美日本| 国外成人在线视频| 91精品国产沙发| 欧美激情xxxx性bbbb| 久久久精品国产| 成人亚洲激情网| 国产欧美一区二区三区久久人妖| 亚洲第一福利网站| 亚洲欧美在线第一页| 欧美成人激情视频免费观看| 精品久久久久久中文字幕一区奶水| 亚洲第一精品电影| 中文字幕亚洲欧美在线| 色偷偷9999www| 久久久影视精品| 日韩在线免费视频观看| 91在线观看免费高清| 日韩精品极品在线观看播放免费视频| 国产精品久久久久久久9999| 中文字幕欧美精品日韩中文字幕| 色综合久综合久久综合久鬼88| 九九热r在线视频精品| 高清在线视频日韩欧美| 亚洲人成亚洲人成在线观看| 欧美黑人巨大精品一区二区| 欧美成人午夜视频| 午夜精品一区二区三区在线播放| 欧美三级欧美成人高清www| 国产盗摄xxxx视频xxx69| 久久在线免费视频| 隔壁老王国产在线精品| 国产suv精品一区二区三区88区| 国产精品久久久久久久久久东京| 欧美第一黄网免费网站| 国产91色在线|| 在线成人免费网站| 欧美激情影音先锋| 日韩在线观看你懂的| 国产不卡视频在线| 国产综合久久久久久| 92国产精品久久久久首页| 成人久久久久久久| 亚洲电影免费观看高清完整版| 国产一区二区在线免费| 日韩一区二区三区国产| 91香蕉亚洲精品| 久久综合久久八八| 91在线高清视频| 日韩美女激情视频| 青草热久免费精品视频| 精品久久久久久久久国产字幕| 精品国模在线视频| 欧美午夜精品久久久久久浪潮| 国产精品电影观看| 精品福利一区二区| 亚洲国产一区二区三区在线观看| 免费91麻豆精品国产自产在线观看| 亚洲国产精品久久精品怡红院| 国产精品久久久久aaaa九色| 亚洲综合在线播放| 黄色一区二区在线| 亚洲激情成人网| 国产视频观看一区| 久久人人爽亚洲精品天堂| 亚洲成在人线av| 日韩精品中文字幕有码专区| 精品福利在线看| 中文字幕久热精品在线视频|