2016-12-02 19 views
5

我在進行圖像形式QR Code無法通過使用下面的代碼CIImage轉換成UIImage的斯威夫特3.0

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 

調試測試:

enter image description here

回答

24
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。有用 。

+0

@Shenona我應該怎麼傳遞這種方法 – Dalvik

+0

此方法需要CIImage。根據該帖子,您無法將CIImage轉換爲UIImage。此方法具有需要CIImage並返回UIImage的參數。 – Shemona

0

我的最終代碼

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 
 
    }