import UIKit import MobileCoreServices public class GIFFromImages { public enum colorSpace { case rgb case gray } public func generateGifFromImages(images: [UIImage], fileURL: URL, colorSpace: colorSpace, delayTime: Double, loopCount: Int) { let gifGroup = DispatchGroup() var tempImages: [UIImage] = [] for image in images { gifGroup.enter() let imageWidth = 500 let imageHeight = 500 var imageColorSpace: CGColorSpace if colorSpace == .rgb { imageColorSpace = CGColorSpaceCreateDeviceRGB() } else { imageColorSpace = CGColorSpaceCreateDeviceGray() } let imageRect: CGRect = CGRect(x:0, y:0, width:imageWidth, height: imageHeight) let imageBitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.none.rawValue) let context = CGContext(data: nil, width: imageWidth, height: imageHeight, bitsPerComponent: 8, bytesPerRow: 0, space: imageColorSpace, bitmapInfo: imageBitmapInfo.rawValue) if let cgImg = image.cgImage { context?.draw(cgImg, in: imageRect) if let makeImg = context?.makeImage() { let imageRef = makeImg let newImage = UIImage(cgImage: imageRef) tempImages.append(newImage) gifGroup.leave() } } } gifGroup.notify(queue: .main) { let gifFileProperties: CFDictionary = [kCGImagePropertyGIFDictionary as String: [kCGImagePropertyGIFLoopCount as String: loopCount]] as CFDictionary let gifFrameProperties: CFDictionary = [kCGImagePropertyGIFDictionary as String: [kCGImagePropertyGIFDelayTime as String: delayTime]] as CFDictionary if let url = fileURL as CFURL? { if let destination = CGImageDestinationCreateWithURL(url, kUTTypeGIF, images.count, nil) { CGImageDestinationSetProperties(destination, gifFileProperties) for image in tempImages { if let cgImage = image.cgImage { CGImageDestinationAddImage(destination, cgImage, gifFrameProperties) } } if !CGImageDestinationFinalize(destination) { print("Failed to finalize the image destination") } } } } } public func makeFileURL(filename: String) -> URL { let gifDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] let gifFileURL = gifDirectory.appendingPathComponent(filename) return gifFileURL } }