我需要对动画GIF
的各个帧进行一些处理,因此我需要能够分割动画GIF
,进行一些处理并将其重新合并为{{1} }}
我知道如何从单独的GIF
创建动画gif,但我不知道如何将UIImages
的帧拆分为单独的GIF
。
有人可以共享一些可以执行此操作的代码吗?
答案 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)