美文网首页
iOS 合成及展示gif图片

iOS 合成及展示gif图片

作者: 丶若若 | 来源:发表于2017-05-03 09:46 被阅读391次

    合成

    //第一种

    //图像目标

    CGImageDestinationRef destination;

    //创建输出路径

    NSArray *document = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentStr = [document objectAtIndex:0];

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSString *textDirectory = [documentStr stringByAppendingPathComponent:@"gif"];

    [fileManager createDirectoryAtPath:textDirectory withIntermediateDirectories:YES attributes:nil error:nil];

    NSString *path = [textDirectory stringByAppendingPathComponent:@"test101.gif"];

    //创建CFURL对象

    /*

    CFURLCreateWithFileSystemPath(CFAllocatorRef allocator, CFStringRef filePath, CFURLPathStyle pathStyle, Boolean isDirectory)

    allocator : 分配器,通常使用kCFAllocatorDefault

    filePath : 路径

    pathStyle : 路径风格,我们就填写kCFURLPOSIXPathStyle 更多请打问号自己进去帮助看

    isDirectory : 一个布尔值,用于指定是否filePath被当作一个目录路径解决时相对路径组件

    */

    CFURLRef url = CFURLCreateWithFileSystemPath (

    kCFAllocatorDefault,

    (CFStringRef)path,

    kCFURLPOSIXPathStyle,

    false);

    //通过一个url返回图像目标

    destination = CGImageDestinationCreateWithURL(url, kUTTypeGIF, arr.count, NULL);

    //设置gif信息

    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:4];

    [dict setObject:[NSNumber numberWithBool:YES] forKey:(NSString*)kCGImagePropertyGIFHasGlobalColorMap];

    [dict setObject:(NSString *)kCGImagePropertyColorModelRGB forKey:(NSString *)kCGImagePropertyColorModel];

    [dict setObject:[NSNumber numberWithFloat:16] forKey:(NSString*)kCGImagePropertyDepth];

    [dict setObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCGImagePropertyGIFLoopCount];

    NSDictionary *gifProperties = [NSDictionary dictionaryWithObject:dict

    forKey:(NSString *)kCGImagePropertyGIFDictionary];

    //设置gif的信息,播放间隔时间,基本数据,和delay时间

    NSDictionary *frameProperties = [NSDictionary dictionaryWithObject:

    [NSMutableDictionary dictionaryWithObjectsAndKeys:

    [NSNumber numberWithFloat:0.45],

    (NSString *)kCGImagePropertyGIFDelayTime, nil]

    forKey:(NSString *)kCGImagePropertyGIFDictionary];

    //合成gif

    for (UIImage* dImg in arr)

    {

    CGImageDestinationAddImage(destination, dImg.CGImage, (__bridge CFDictionaryRef)frameProperties);

    }

    CGImageDestinationSetProperties(destination, (__bridge CFDictionaryRef)gifProperties);

    CGImageDestinationFinalize(destination);

    //第二种

    +(NSString *)exportGifImages:(NSArray*)images delays:(NSArray*)delays loopCount:(NSUInteger)loopCount 

    {

    NSString *fileName = [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"gif"];

    NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:fileName];

    CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:filePath],

    kUTTypeGIF, images.count, NULL);

    if(!loopCount){

    loopCount = 0;

    }

    NSDictionary *gifProperties = @{ (__bridge id)kCGImagePropertyGIFDictionary: @{

    (__bridge id)kCGImagePropertyGIFLoopCount: @(loopCount), // 0 means loop forever

    }

    };

    float delay = 0.1; //默认每一帧间隔0.1秒

    for(int i= 0 ; i <images.count ;i ++){

    UIImage *itemImage = images[i];

    if(delays && i<delays.count){

    delay = [delays[i] floatValue];

    }

    //每一帧对应的延迟时间

    NSDictionary *frameProperties = @{(__bridge id)kCGImagePropertyGIFDictionary: @{

    (__bridge id)kCGImagePropertyGIFDelayTime: @(delay), // a float (not double!) in seconds, rounded to centiseconds in the GIF data

    }

    };

    CGImageDestinationAddImage(destination,itemImage.CGImage, (__bridge CFDictionaryRef)frameProperties);

    }

    CGImageDestinationSetProperties(destination, (__bridge CFDictionaryRef)gifProperties);

    if (!CGImageDestinationFinalize(destination)) {

    NSLog(@"failed to finalize image destination");

    }

    CFRelease(destination);

    return filePath;

    }

    展示的三种方式

    //1. 第三方

    // 网络图片

    //  NSData *urlData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.chinagif.com/gif/part/boy/0045.gif"]];

    // 本地图片

    NSData *localData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"run" ofType:@"gif"]];

    GifView *dataView = [[GifView alloc] initWithFrame:CGRectMake(0, 0, 100, 100) data:localData];

    [self.view addSubview:dataView];

    [dataView release];

    // 或者

    GifView *pathView =[[GifView alloc] initWithFrame:CGRectMake(100, 0, 100, 100) filePath:[[NSBundle mainBundle] pathForResource:@"run" ofType:@"gif"]];

    [self.view addSubview:pathView];

    [pathView release];

    //2. webView

    NSString *path = [[NSBundle mainBundle] pathForResource:@"run" ofType:@"gif"];

    NSData *gifData = [NSData dataWithContentsOfFile:path];

    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 120, 100, 100)];

    webView.backgroundColor = [UIColor redColor];

    webView.scalesPageToFit = YES;

    [webView loadData:gifData MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];

    [self.view addSubview:webView];

    [webView release];

    //3. animationView

    UIImageView *gifImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 240, 100, 100)];

    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 = 999;  //动画重复次数

    [gifImageView startAnimating];

    [self.view addSubview:gifImageView];

    [gifImageView release];

    相关文章

      网友评论

          本文标题:iOS 合成及展示gif图片

          本文链接:https://www.haomeiwen.com/subject/qslktxtx.html