Swift - 将CGImage转换为CVPixelBuffer

7
我该如何在swift中将CGImage转换为CVPixelBuffer
我知道有许多试图进行相反操作的问题,也知道一些Objective-C的答案,例如这个,但我无法使它们在swift中工作。以下是我最接近的方法:
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!;
}

这个代码无法编译,因为CVPixelBufferCreateWithBytes需要是一个UnsafeMutablePointer类型的参数,而CFDataGetBytePtr(dataFromImageDataProvider)返回的是一个UnsafePointer<UIint8>!的类型。


如果你知道如何在Objective-C中完成这个任务,为什么不用Objective-C编写这个方法并继续进行呢? - matt
因为我要开始一个Swift项目,我愿意花时间学习这门语言,而且我不太了解Objective-C(也不想学得比必要的多)。 - Guig
那么问题是如何将UnsafePointer转换为UnsafeMutablePointer?因为这并不是很困难。 - matt
1个回答

4

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

let dataFromImageDataProvider = CFDataCreateMutableCopy(kCFAllocatorDefault, 0, image.dataProvider!.data)
let x = CFDataGetMutableBytePtr(dataFromImageDataProvider)

只是提一下,CVPixelBufferCreateWithBytes参数"CFDataGetBytePtr(dataFromImageDataProvider)"应该替换为"x"。 - manikal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接