将UIImage转换为CIImage返回nil

时间:2017-08-15 03:38:27

标签: swift uiimage ciimage

我尝试将UIImage从imageView转换为CIImage以进行过滤。但是,我无法让CIImage获得值。

以最简单的形式,这就是我正在尝试的内容:

let ciInput = CIImage(image: imageView.image!)

但是ciInput总是为零。 我也试过

let ciInput = CIImage(cgImage: imageView.image!.cgImage)

但也返回nil。

(imageView.image不是零,但imageView.image!.cgImageimageView.image!.ciImage都是零)

我需要将UIImageimageView转换为有效的CIImage。感谢任何帮助,谢谢!

编辑:这是完整的功能代码

func makeWhiteTransparent(imageView: UIImageView) {

    let invertFilter = CIFilter(name: "CIColorInvert")
    let ciContext = CIContext(options: nil)

    let ciInput = CIImage(image: imageView.image!) //This is nil
    invertFilter?.setValue(ciInput, forKey: "inputImage")

    let ciOutput = invertFilter?.outputImage
    let cgImage = ciContext.createCGImage(ciOutput!, from: (ciOutput?.extent)!)

    imageView.image = UIImage(cgImage: cgImage!)
}

运行此函数时,我在最后一行收到致命的解包nil错误。使用调试器,我发现ciInput是nil,它不应该是。

编辑2: 调用makeWhiteTransparent之前,imageView上的图像是使用此函数生成的QR码:

func generateQRCode(from string: String) -> UIImage? {
    let data = string.data(using: String.Encoding.ascii)

    if let filter = CIFilter(name: "CIQRCodeGenerator") {
        filter.setValue(data, forKey: "inputMessage")

        let transform = CGAffineTransform(scaleX: 12, y: 12)

        if let output = filter.outputImage?.applying(transform) {
            return UIImage(ciImage: output)
        }
    }

    return nil
}

1 个答案:

答案 0 :(得分:2)

所以问题出在我的二维码生成中。代码从CIImage返回了一个UIImage而没有正确使用CGContext来返回UIImage。以下是修正问题的修正QR码功能。

func generateQRCode(from string: String) -> UIImage? {
    let data = string.data(using: String.Encoding.ascii)

    if let filter = CIFilter(name: "CIQRCodeGenerator") {
        filter.setValue(data, forKey: "inputMessage")

        let transform = CGAffineTransform(scaleX: 12, y: 12)

        if let output = filter.outputImage?.applying(transform) {
            let context = CIContext()
            let cgImage = context.createCGImage(output, from: output.extent)
            return UIImage(cgImage: cgImage!)
        }
    }

    return nil
}