2016-07-12 17 views
2

Wie kann ich eine CGImage in eine CVPixelBuffer in swift konvertieren?swift - CGBild zu CVPixelBuffer

Ich bin mir einer Reihe von Fragen bewusst, die versuchen, das Gegenteil zu tun, und von einigen objektiven C Antworten, wie this one, aber ich konnte sie nicht dazu bringen, in swift zu arbeiten. Hier ist die nächste, die ich habe:

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!; 
} 

(dies nicht kompilieren, weil CVPixelBufferCreateWithBytes excepts ein UnsafeMutablePointer und CFDataGetBytePtr(dataFromImageDataProvider) ist ein UnsafePointer<UIint8>!)

+0

Wenn Sie wissen, wie dies in thi Objective-C, warum nicht schreiben zu tun s eine Methode _in_ Objective-C und mit den Dingen weitermachen? – matt

+0

Weil ich ein Projekt in Swift starte, und ich bin bereit, mir die Zeit zu nehmen, Dinge in diese Sprache zu bringen, und ich kenne auch Objective-C nicht (und bin auch nicht bereit, mehr zu lernen, was ich wirklich habe to) – Guig

+0

So ist die Frage, wie man einen UnsafePointer in einen UnsafeMutablePointer umwandelt? Weil das nicht sehr schwierig ist. – matt

Antwort

0

Sie müssen UnsafeMutablePointer verwenden, das zu tun, können Sie verwandeln CFData zu CFMutableData und UnsafeMutablePointer zum Beispiel erhält dann:

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