从函数中获取UIImage

我写了一个函数来将filter应用到照片上。 为什么函数总是返回零?

func getImage() -> UIImage? { let openGLContext = EAGLContext(api: .openGLES2) let context = CIContext(eaglContext: openGLContext!) let coreImage = UIImage(cgImage: image.cgImage!) filter.setValue(coreImage, forKey: kCIInputImageKey) filter.setValue(1, forKey: kCIInputContrastKey) if let outputImage = filter.value(forKey: kCIOutputImageKey) as? CIImage { let output = context.createCGImage(outputImage, from: outputImage.extent) return UIImage(cgImage: output!) } return nil } 

iOS使用coreImage ,必须考虑coreImage类,例如CIFilter , CIContext , CIVector和CIColor ,input图像应该是包含图像数据的CIImage 。 它可以从UIImage创build。

注意:您没有提及您使用的filter定义或自定义filter。从代码中,我可以看到您尝试更改input图像的contrast 。因此,我使用CIColorControlsfilter来testing代码以调整对比度。

 func getImage(inputImage: UIImage) -> UIImage? { let openGLContext = EAGLContext(api: .openGLES2) let context = CIContext(eaglContext: openGLContext!) let filter = CIFilter(name: "CIColorControls") let coreImage = CIImage(image: filterImage.image!) filter?.setValue(coreImage, forKey: kCIInputImageKey) filter?.setValue(5, forKey: kCIInputContrastKey) if let outputImage = filter?.value(forKey: kCIOutputImageKey) as? CIImage { let output = context.createCGImage(outputImage, from: outputImage.extent) return UIImage(cgImage: output!) } return nil } 

你可以像下面这样调用上面的func。

 filterImage.image = getImage(inputImage: filterImage.image!) 

输出:

在这里输入图像说明

在这种情况下,你永远不会input。 也许filter.value返回零或它不是它返回的CIImage。 像这样解压缩,并在if处设置断点或在以下位置添加打印:

 let value = filter.value(forKey: kCIOutputImageKey) if let outputImage = value as? CIImage { let output = context.createCGImage(outputImage, from: outputImage.extent) return UIImage(cgImage: output!) } 

如果您需要更多信息,您必须共享filter定义和使用代码。