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

Posted

技术标签:

【中文标题】“致命错误:在 Swift ios 中使用 vImageBuffer_initWithCGImage 时在展开可选值时意外发现 nil”【英文标题】:"fatal error: unexpectedly found nil while unwrapping an Optional value" while using vImageBuffer_initWithCGImage in Swift ios 【发布时间】:2014-11-05 11:21:47 【问题描述】:

我正在使用 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 的行上出现“致命错误:在展开可选值时意外发现 nil”。 我不确定为什么会发生这种情况,因为缓冲区和第三个参数(即 backgroundColor)都是不安全的,并且根据文档应该接受 NULL,对于 UnsafeMutablePointer(如果我错了,请纠正我)。

编辑: 好的,我至少明白为什么现在发生了。因为我发送未包装的 &buffer!。但我不能发送 &buffer,因为它说“vImage_buffer!与 vImage_buffer 不同”。

我尝试了各种将缓冲区声明为 vImage_buffer 的组合?但我无法让它发挥作用。我基本上只需要分配缓冲区参数以将其传递给 init 函数,但我不知道如何...。请帮忙

【问题讨论】:

【参考方案1】:

我不知道 vImage 是什么。但是从苹果文档来看,vImage_Buffer 是一个结构,在将其解析为 vImageBuffer_InitWithCGImage 之前它应该有一个主体,并且该函数将填充该结构的字段。 您的代码的真正问题是。

var buffer:vImage_Buffer!

上面创建了一个可选的,其默认值为 nil。当展开时,它报告为零。因为它是零。您应该创建一个空结构并将其传递给函数。尝试跟随一个。

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

【讨论】:

感谢硕的回复。不幸的是,vImage_buffer 没有简单的构造函数。你需要初始化它。但你给了我正确的方向 vImage 在这里需要一个未初始化的 vImage_Buffer。只有它的存储需要存在。【参考方案2】:

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

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

然后调用:

vImageBuffer_InitWithCGImage(&buffer, ... )

vImage 会为您正确填写所有结构字段。

【讨论】:

【参考方案3】:

好的,所以我没有找到一种方法来完全按照我的意愿使用 vImageBuffer_initWithCGImage,但多亏了这里的好人,我通过 CGImage 手动初始化 vImage_Buffer 做了一个解决方法。这就是我的函数的样子:

    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


【讨论】:

以上是关于“致命错误:在 Swift ios 中使用 vImageBuffer_initWithCGImage 时在展开可选值时意外发现 nil”的主要内容,如果未能解决你的问题,请参考以下文章