"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)
}
UIImage
的 cgImage
属性 的文档是这样说的:
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
是你想要的 无论如何 ,那么你想要做的事情的正确方法是:
- 调用
UIImage
的 ciImage
属性,如果你得到一个非零值,使用它。
- 如果
ciImage
是 nil
,则返回调用 cgImage
并从中生成 CIImage
如果它不是 nil
。
- 如果
cgImage
也恰好为nil,那么奇怪的事情发生了;在这种情况下,您可以抛出错误或以其他方式优雅地退出。
我有一个功能可以旋转 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)
}
UIImage
的 cgImage
属性 的文档是这样说的:
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
是你想要的 无论如何 ,那么你想要做的事情的正确方法是:
- 调用
UIImage
的ciImage
属性,如果你得到一个非零值,使用它。 - 如果
ciImage
是nil
,则返回调用cgImage
并从中生成CIImage
如果它不是nil
。 - 如果
cgImage
也恰好为nil,那么奇怪的事情发生了;在这种情况下,您可以抛出错误或以其他方式优雅地退出。