title: Ways to compress GIFs in Swift?
body: <p>My gif generator function reduces the resolution and minimizes the frames from a series of photos, but I don't have anything to reduce the amount of colors or make it lossy. How would I go about doing this in Swift 4?</p>
  
  <pre><code>    func generateGif(photos: [UIImage], filename: String) -&gt; 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..&lt;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 &gt; maxWidthHeight || photo.size.height &gt; maxWidthHeight){ // gif beyond max width or height
  
                      if(photo.size.width &gt; 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
      }
  </code></pre>
  
  <p>Anything above 500 width or height returns a file that is around 11 megabytes. I imagine it could be far smaller. </p>