代码之家  ›  专栏  ›  技术社区  ›  Chewie The Chorkie

如何在Swift中压缩GIF?

  •  1
  • Chewie The Chorkie  · 技术社区  · 6 年前

    我的gif生成器功能降低了分辨率并最小化了一系列照片中的帧,但我没有任何东西可以减少颜色数量或使其有损。我将如何在Swift 4中执行此操作?

        func generateGif(photos: [UIImage], filename: String) -> Bool {
    
            let documentsDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
            let path = documentsDirectoryPath.appending(filename)
            let fileProperties = [kCGImagePropertyGIFDictionary as String: [kCGImagePropertyGIFLoopCount as String: 0]]
            let gifProperties = [kCGImagePropertyGIFDictionary as String: [kCGImagePropertyGIFDelayTime as String: 0.1]] // actual speed is 0.2
            let cfURL = URL(fileURLWithPath: path) as CFURL
            if let destination = CGImageDestinationCreateWithURL(cfURL, kUTTypeGIF, photos.count, nil) {
    
                CGImageDestinationSetProperties(destination, fileProperties as CFDictionary?)
    
                var inc:Int = 0
    
                for _ in 0..<15 { // actual photos.count is 31
    
                    let photo = photos[inc]
    
                    var width:CGFloat = photo.size.width
                    var height:CGFloat = photo.size.height
    
                    let maxWidthHeight:CGFloat = 500
    
                    if(photo.size.width > maxWidthHeight || photo.size.height > maxWidthHeight){ // gif beyond max width or height
    
                        if(photo.size.width > photo.size.height){
    
                            width = maxWidthHeight
    
                            let percentChange = width / photo.size.width
                            height = photo.size.height * percentChange
    
                        }else{
    
                            height = maxWidthHeight
    
                            let percentChange = height / photo.size.height
                            width = photo.size.width * percentChange
    
                        }
    
                        print("w:\(width) h:\(height) inc:\(inc)")
    
                    }
    
                    let smallerPhoto = imageWithImage(image:photo, scaledToSize:CGSize(width:width, height:height))
                    CGImageDestinationAddImage(destination, smallerPhoto.cgImage!, gifProperties as CFDictionary?)
    
                    inc+=2 // skipping ahead incrementation for less frames
                }
    
    // here it's saving to a photo album when it's done and reporting the filesize
                CustomPhotoAlbum.sharedInstance.savePhoto(URL: URL(fileURLWithPath: path), completion: {
    
                    var fileSize : UInt64
    
                    do {
                        let attr = try FileManager.default.attributesOfItem(atPath: path)
                        fileSize = attr[FileAttributeKey.size] as! UInt64
                        print("gif is \(fileSize/1000000) megabytes")
                    } catch {
                        print("Error: \(error)")
                    }
    
                })
    
                return CGImageDestinationFinalize(destination)
            }
    
    
            return false
        }
    

    任何宽度或高度超过500的文件都会返回大约11MB的文件。我想它可能要小得多。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Manuel    6 年前

    退房 giflossy 基于 gifsicle 在…上 github . 它能做你想要的,甚至更多。它是用C编写的,但您可以从中获得一些灵感,并将相关部分移植到swift。

    推荐文章