【问题标题】:Unable to convert CIImage to UIImage in Swift 3.0无法在 Swift 3.0 中将 CIImage 转换为 UIImage
【发布时间】:2016-12-02 18:49:14
【问题描述】:

我正在使用以下代码制作图像表单QR Code

  func createQRFromString(str: String) -> CIImage? {
        let stringData = str.dataUsingEncoding(NSUTF8StringEncoding)

        let filter = CIFilter(name: "CIQRCodeGenerator")

        filter?.setValue(stringData, forKey: "inputMessage")

        filter?.setValue("H", forKey: "inputCorrectionLevel")

        return filter?.outputImage
    }

然后我添加到UIImageView 像这样:

    if let img = createQRFromString(strQRData) {
        let somImage = UIImage(CIImage: img, scale: 1.0, orientation: UIImageOrientation.Down)
        imgviewQRcode.image = somImage
    }

现在我需要将其保存到 JPEGPNG 文件中。但是当我这样做时,我的应用程序崩溃了:

    @IBAction func btnSave(sender: AnyObject) {

    //        // Define the specific path, image name
    let documentsDirectoryURL = try! NSFileManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true)
    // create a name for your image
    let fileURL = documentsDirectoryURL.URLByAppendingPathComponent("image.jpg")

    if let image = imgviewQRcode.image // imgviewQRcode is UIImageView
    {

        if let path = fileURL?.path
        {
            if !NSFileManager.defaultManager().fileExistsAtPath(fileURL!.path!)
            {
                if UIImageJPEGRepresentation(image, 1.0)!.writeToFile(path, atomically: true)
                {
                    print("file saved")
                }

            }//Checking existing file

        }//Checking path

    }//CHecking image

}

崩溃点

  UIImageJPEGRepresentation(image, 1.0)!.writeToFile(path, atomically: true)

原因

fatal error: unexpectedly found nil while unwrapping an Optional value

调试测试:

【问题讨论】:

    标签: ios swift uiimage swift3 ciimage


    【解决方案1】:
    func convert(cmage:CIImage) -> UIImage
    {       
        let context:CIContext = CIContext.init(options: nil)
        let cgImage:CGImage = context.createCGImage(cmage, from: cmage.extent)!        
        let image:UIImage = UIImage.init(cgImage: cgImage)        
        return image
    }
    

    使用此函数将 CIImage 转换为 UIImage 。它有效。

    【讨论】:

    • @Shenona 我应该在这个方法中传递什么
    • 此方法需要 CIImage 。根据帖子,您无法将 CIImage 转换为 UIImage 。此方法具有需要 CIImage 并返回 UIImage 的参数。
    • @Shemona 为什么这个方法没有释放内存?
    【解决方案2】:

    我的最终代码

       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: 3, y: 3)
                
                if let output = filter.outputImage?.transformed(by: transform) {
                    let context:CIContext = CIContext.init(options: nil)
                    let cgImage:CGImage = context.createCGImage(output, from: output.extent)!
                    let image:UIImage = UIImage.init(cgImage: cgImage)
                    return image
                }
            }
            
            return nil
        }

    【讨论】:

      【解决方案3】:
       func convert(image:CIImage) -> UIImage
       {           
          let image:UIImage = UIImage.init(ciImage: image)        
          return image
       }
      

      也许,这在以前是不可用的,但现在可以直接从 CIImage 创建 UIImages。

      【讨论】:

      • 很有趣,但由于某种原因,当我使用它而不是 context.createCGImage(myCIImage, from:rect)
      • 我也没有通过 UIImage(ciImage:) 得到任何输出,而我确实从 context.createCGImage() 得到了一些东西
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 2012-01-15
      • 2018-12-24
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多