I need to change the color of a gif programatically. The original gif is white on clear background, and I want to make it change color through code.
I've tried the answer in this thread, but that causes the gif to freeze on the first frame. Here's some of the code I'm working with.
class MyViewController: UIViewController {
@IBOutlet weak var myImageView: UIImageView?
override func viewDidLoad() {
myImageView?.image = UIImage.gif(name: "my_gif")
myImageView?.image = myImageView?.image?.maskWithColor(color: UIColor.red)
// This creates a red, but still version of the gif
}
}
extension UIImage {
func maskWithColor(color: UIColor) -> UIImage? {
let maskImage = cgImage!
let width = size.width
let height = size.height
let bounds = CGRect(x: 0, y: 0, width: width, height: height)
let colorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
let context = CGContext(data: nil, width: Int(width), height: Int(height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)!
context.clip(to: bounds, mask: maskImage)
context.setFillColor(color.cgColor)
context.fill(bounds)
if let cgImage = context.makeImage() {
let coloredImage = UIImage(cgImage: cgImage)
return coloredImage
} else {
return nil
}
}
}
I'm currently using different gif files for each color I need as a workaround, but that sounds awfully inefficient. Any ideas?
Thanks in advance!