"unexpectedly found nil while unwrapping an Optional value" 在 captureOutput 函数中

"unexpectedly found nil while unwrapping an Optional value" inside captureOutput function

我有一个功能可以旋转 UIImages 上的色调,该功能可以从同一 class 中的其他功能工作,但是在 captureOutput 功能(与 AVCaptureVideoDataOutput 一起使用)中,相同的图像对象使我的应用程序崩溃 "unexpectedly found nil while unwrapping an Optional value"。我的调用方式看起来没有什么不同,所以它可能与 captureOutput 函数及其允许的功能有关?

viewControllerclass声明之外:

var image:UIImage? = nil
var imageSource:UIImage? = nil
var imageView:UIImageView? = nil;
var hueDeg:CGFloat = 0.00

函数:

func rotateHue(with source: UIImage, rotatedByHue deltaHueRadians: CGFloat) -> UIImage {
    // Create a Core Image version of the image.
    let sourceCore = CIImage(cgImage: (source.cgImage)!) // crashes here
    // Apply a CIHueAdjust filter
    let hueAdjust = CIFilter(name: "CIHueAdjust")
    hueAdjust?.setDefaults()
    hueAdjust?.setValue(sourceCore, forKey: "inputImage")
    hueAdjust?.setValue(deltaHueRadians, forKey: "inputAngle")
    let resultCore = hueAdjust?.value(forKey: "outputImage") as? CIImage
    // Convert the filter output back into a UIImage.
    let context = CIContext(options: nil)
    let resultRef = context.createCGImage(resultCore!, from: (resultCore?.extent)!)
    let result = UIImage(cgImage: resultRef!)
    //CGImageRelease(resultRef)
    return result
}

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection){
    let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
    let cameraImage = CIImage(cvPixelBuffer: pixelBuffer!)

    image = UIImage(ciImage: cameraImage)

    image = rotateHue(with:image!, rotatedByHue:hueDeg) 

    DispatchQueue.main.async(){

        imageView!.image = image
    }

}

这是我从中调用 rotateHue 的另一个函数,它没有崩溃。这是一个由定时器调用的函数:

@objc func cycleHue(){
    hueDeg += 0.2;
    image = imageSource
    image = rotateHue(with:image!, rotatedByHue:hueDeg)
    imageView!.image = UIImage(cgImage: (image?.cgImage)!, scale: 1.0, orientation: UIImageOrientation.right)
}

UIImagecgImage 属性 的文档是这样说的:

If the UIImage object was initialized using a CIImage object, the value of the property is NULL.

因为这个值可以是 nil,所以你不应该使用 force-unwrap (!) 运算符,否则你会遇到崩溃,正如你所看到的。相反,我们需要测试值可能是 nil.

的条件

幸运的是,使 cgImage 成为 nil 的条件显然是使用 CIImage 初始化的。既然看起来 CIImage 是你想要的 无论如何 ,那么你想要做的事情的正确方法是:

  1. 调用 UIImageciImage 属性,如果你得到一个非零值,使用它。
  2. 如果 ciImagenil,则返回调用 cgImage 并从中生成 CIImage 如果它不是 nil
  3. 如果cgImage 恰好为nil,那么奇怪的事情发生了;在这种情况下,您可以抛出错误或以其他方式优雅地退出。