从函数获取 UIImage

Get UIImage from function

我编写了一个将滤镜应用于照片的函数。为什么函数总是 returns nil?

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
}

在这种情况下,您永远不会输入 if。也许 filter.value returns nil 或者它不是 CIImage 它 returns。像那样提取它并在 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!)
}

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

当您在 iOS 中使用 coreImage 时。您必须考虑 coreImage 类 例如 CIFilter, CIContext, CIVector, and CIColor 并且输入图像应该是 CIImage它保存图像数据。它可以从 UIImage 创建。

注意:你没有提到你的过滤器定义或自定义过滤器,你 using.From 你的代码,我可以看到你试图改变 contrast 输入 image.So,我正在使用 CIColorControls 过滤器测试代码以调整对比度。

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
}

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

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

输出: