CGBitmapContextCreate无效的数据字节/行

时间:2015-10-19 13:34:58

标签: ios avfoundation swift2

我想使用Apple开发者页面中的一个示例。 Apple Dev Pages on AVFoundation

现在,我使用了imageFromSampleBuffer:sampleBuffer方法,正如文档所解释的那样。我在Swift写作,所以我尽可能地从Obj-C转换到Swift 2。

我忍不住收到有关invalid data bytes/row: should be at least 7680 for 8 integer bits/component, 3 components, kCGImageAlphaPremultipledFirstCGBitmapContextCreateImage: invalid context 0x0.

的错误消息
func imageFromSampleBuffer(sampleBuffer: CMSampleBufferRef) -> UIImage {
    let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
    CVPixelBufferLockBaseAddress(imageBuffer!, 0)
    let baseAddress = CVPixelBufferGetBaseAddress(imageBuffer!)
    let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer!)
    let width = CVPixelBufferGetWidth(imageBuffer!)
    let height = CVPixelBufferGetHeight(imageBuffer!)
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let context = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, CGImageAlphaInfo.PremultipliedFirst.rawValue)
    let qImage = CGBitmapContextCreateImage(context)
    CVPixelBufferUnlockBaseAddress(imageBuffer!, 0)
    let image = UIImage(CGImage: qImage!)
    return(image)
  }

这就是我称之为该方法的方式:

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
    print("Delegate called")
    let image = imageFromSampleBuffer(sampleBuffer)
    print(image)
  }

我完全不知道如何继续。

1 个答案:

答案 0 :(得分:1)

  1. https://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_context/dq_context.html#//apple_ref/doc/uid/TP30001066-CH203-BCIBHHBB
  2. 上查看CGBitmapContextCreate的可接受参数列表
  3. 检查捕获的缓冲区是否为8位/分量RGB,而不是其他格式。
  4. 检查输入缓冲区是否缺少alpha分量。那你应该使用kCGImageAlphaNone。