如何将动画GIF分割成UIImages数组?

时间:2014-02-28 17:50:56

标签: ios objective-c uiimage animated-gif

我需要对动画GIF的各个帧进行一些处理,因此我需要能够分割动画GIF,进行一些处理并将其重新合并为{{1} }}

我知道如何从单独的GIF创建动画gif,但我不知道如何将UIImages的帧拆分为单独的GIF

有人可以共享一些可以执行此操作的代码吗?

3 个答案:

答案 0 :(得分:12)

您可以使用Image I/O framework将动画GIF的帧加载为单个CGImage对象,然后将其包装在UIImage个对象中。

但是,您可以更轻松地使用my public domain UIImage+animatedGIF category将GIF加载到动画UIImage中,然后访问动画图像的images属性以获取各个框架。

答案 1 :(得分:2)

我想举一个例子,说明谁想要或需要看一个用Swift 4 for IOS编写的示例代码(如何在此问题中使用此框架):

static func getSequence(gifNamed: String) -> [UIImage]? {

    guard let bundleURL = Bundle.main
        .url(forResource: gifNamed, withExtension: "gif") else {
            print("This image named \"\(gifNamed)\" does not exist!")
            return nil
    }

    guard let imageData = try? Data(contentsOf: bundleURL) else {
        print("Cannot turn image named \"\(gifNamed)\" into NSData")
        return nil
    }

    let gifOptions = [
        kCGImageSourceShouldAllowFloat as String : true as NSNumber,
        kCGImageSourceCreateThumbnailWithTransform as String : true as NSNumber,
        kCGImageSourceCreateThumbnailFromImageAlways as String : true as NSNumber
        ] as CFDictionary

    guard let imageSource = CGImageSourceCreateWithData(imageData as CFData, gifOptions) else {
        debugPrint("Cannot create image source with data!")
        return nil
    }

    let framesCount = CGImageSourceGetCount(imageSource)
    var frameList = [UIImage]()

    for index in 0 ..< framesCount {

        if let cgImageRef = CGImageSourceCreateImageAtIndex(imageSource, index, nil) {
            let uiImageRef = UIImage(cgImage: cgImageRef)
            frameList.append(uiImageRef)
        }

    }

    return frameList // Your gif frames is ready
}

快乐编码:)

答案 2 :(得分:1)

如果你喜欢Swift 3解决方案,你可以使用GifMagic https://github.com/onmyway133/GifMagic中的Decoder,它允许你访问gif中的单个帧,并获得额外的gif信息,如大小和延迟时间

let result = Decoder().decode(fileUrl: gifFileUrl)