“致命错误:在解包可选值时意外发现nil”在Swift ios中使用vImageBuffer_initWithCGImage时

我正在使用Swift iOS8并尝试将UIImage转换为vImage_Buffer以使用Accelerate.framework执行操作。 我正在尝试使用vImageBuffer_initWithCGImage进行转换,这是我尝试过的代码:

func initvImageBufferwithUIImage (image:UIImage)-> vImage_Buffer{ var CGImg:CGImageRef = sunset.CGImage var inProvider:CGDataProviderRef = CGImageGetDataProvider(CGImg) var inBitmapData:CFDataRef = CGDataProviderCopyData(inProvider) var buffer:vImage_Buffer! var format:vImage_CGImageFormat = vImage_CGImageFormat(bitsPerComponent: 8, bitsPerPixel: 32, colorSpace: nil, bitmapInfo: CGBitmapInfo.ByteOrderDefault, version: 0, decode: nil, renderingIntent: kCGRenderingIntentDefault) vImageBuffer_InitWithCGImage(&buffer!, &format, nil , sunset.CGImage, 0) return buffer 

没有编译错误,我尝试运行它我在vImageBuffer_InitWithCGImage行上得到“致命错误:在解包一个Optional值时意外发现nil”。 我不确定为什么会发生这种情况,因为缓冲区和第三个参数都是backgroundColor都是不安全的并且根据文档应该接受NULL,对于UnsafeMutablePointer来说,它在swift中是nil(如果我错了,请纠正我)。

编辑:好吧我至少理解为什么现在它发生了。 因为我发送unwrapped&buffer!。 但我无法发送和缓冲,因为它说“vImage_buffer!与vImage_buffer不同”。

我尝试使用声明缓冲区作为vImage_buffer的所有组合? 但我无法使其成功。 我基本上只需要分配缓冲区参数将其传递给init函数,但我不知道如何…。 请帮忙

我不知道vImage是什么。 但是从apple doc中,vImage_Buffer是一个结构体,在将它解析为vImageBuffer_InitWithCGImage之前应该有一个体,该函数将填充该结构的字段。 你的代码真正的问题是。

 var buffer:vImage_Buffer! 

在上面创建一个可选的默认值为nil。 打开时,报告为零。 因为IT是零。 您应该创建一个空结构并将其传递给该函数。 尝试下面一个。

  var buffer:vImage_Buffer = vImage_Buffer() ........ vImageBuffer_InitWithCGImage(&buffer, &format, nil , sunset.CGImage, 0) ........ 

只需在调用之前创建一个虚拟的vImage_Buffer对象:

 var buf = vImage_Buffer(data: nil, height: 0, width: 0, rowBytes: 0) 

然后打电话:

 vImageBuffer_InitWithCGImage(&buffer, ... ) 

和vImage将正确填写所有结构字段。

好的,所以我没有找到一种方法来完成我想要的东西,并且使用vImageBuffer_initWithCGImage但是感谢好人们,我通过CGImage手动初始化vImage_Buffer半做了一个解决方法。 多数民众赞成我的function如何:

  func initvImageBufferwithUIImage (image:UIImage)-> vImage_Buffer{ var CGImgRef:CGImageRef = image.CGImage var inProvider:CGDataProviderRef = CGImageGetDataProvider(CGImgRef) var inBitmapData:CFDataRef = CGDataProviderCopyData(inProvider) var buffer:vImage_Buffer = vImage_Buffer(data: &inBitmapData, height: CGImageGetHeight(CGImgRef), width: CGImageGetWidth(CGImgRef), rowBytes: CGImageGetBytesPerRow(CGImgRef)) return buffer }