swift - CGImage 到 CVPixelBuffer

Gui*_*uig 5 cgimage swift cvpixelbuffer

如何快速将 a 转换CGImage为 a CVPixelBuffer?

我知道有很多问题试图做相反的事情,还有一些客观的 C 答案,比如这个,但我无法让它们迅速工作。这是我最接近的:

func pixelBufferFromCGImage(image: CGImage) -> CVPixelBuffer {
    var pxbuffer: CVPixelBuffer? = nil
    let options: NSDictionary = [:]

    let width =  image.width
    let height = image.height
    let bytesPerRow = image.bytesPerRow

    let dataFromImageDataProvider = image.dataProvider!.data
    let x = CFDataGetBytePtr(dataFromImageDataProvider)

    CVPixelBufferCreateWithBytes(
        kCFAllocatorDefault,
        width,
        height,
        kCVPixelFormatType_32ARGB,
        CFDataGetBytePtr(dataFromImageDataProvider),
        bytesPerRow,
        nil,
        nil,
        options,
        &pxbuffer
    )
    return pxbuffer!;
}
Run Code Online (Sandbox Code Playgroud)

(这不会编译,因为CVPixelBufferCreateWithBytesUnsafeMutablePointer 除外,并且CFDataGetBytePtr(dataFromImageDataProvider)是UnsafePointer<UIint8>!)

Car*_*rol 5

您需要使用 UnsafeMutablePointer,为此,您可以转换CFData为CFMutableData然后获取UnsafeMutablePointer例如:

let dataFromImageDataProvider = CFDataCreateMutableCopy(kCFAllocatorDefault, 0, image.dataProvider!.data)
let x = CFDataGetMutableBytePtr(dataFromImageDataProvider)
Run Code Online (Sandbox Code Playgroud)