【问题标题】:swift - CGImage to CVPixelBufferswift - CGImage 到 CVPixelBuffer
【发布时间】:2016-11-14 01:49:42
【问题描述】:

如何快速将CGImage 转换为CVPixelBuffer

我知道一些试图做相反的问题,以及一些客观的 C 答案,例如 this one,但我无法让它们快速工作。这是我得到的最接近的:

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 中编写这个方法并继续进行操作?
  • 因为我正在用 Swift 开始一个项目,我愿意花时间用那种语言来做东西,而且我也不了解 Objective-C(我也不愿意了解更多,我真的必须)
  • 那么问题是如何将 UnsafePointer 变成 UnsafeMutablePointer?因为这不是很困难。

标签: swift cgimage cvpixelbuffer


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2019-01-03
    相关资源
    最近更新 更多