// Convert UIImage to CVPixelBuffer import UIKit extension UIImage { func toCVPixelBuffer() -> CVPixelBuffer? { var buffer: CVPixelBuffer? let width = Int(size.width) let height = Int(size.height) let dict = [ kCVPixelBufferCGImageCompatibilityKey: kCFBooleanTrue, kCVPixelBufferCGBitmapContextCompatibilityKey: kCFBooleanTrue ] as CFDictionary guard CVPixelBufferCreate(kCFAllocatorDefault, width, height, kCVPixelFormatType_32ARGB, dict, &buffer) == kCVReturnSuccess, let buffer = buffer, CVPixelBufferLockBaseAddress(buffer, CVPixelBufferLockFlags(rawValue: 0)) == kCVReturnSuccess, let context = CGContext(data: CVPixelBufferGetBaseAddress(buffer), width: width, height: height, bitsPerComponent: 8, bytesPerRow: CVPixelBufferGetBytesPerRow(buffer), space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: CGImageAlphaInfo.noneSkipFirst.rawValue) else { return nil } context.translateBy(x: 0, y: size.height) context.scaleBy(x: 1, y: -1) UIGraphicsPushContext(context) draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height)) UIGraphicsPopContext() return CVPixelBufferUnlockBaseAddress(buffer, CVPixelBufferLockFlags(rawValue: 0)) == kCVReturnSuccess ? buffer : nil } }