2016-12-02 9 views
5

творю форму изображения QR Code используя следующий код:Невозможно преобразовать CIImage в UIImage в Swift 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 
    } 

Теперь мне нужно для сохранения этого файла JPEG или PNG. Но когда я делаю так, что мое приложение аварии:

@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) 

Reason

fatal error: unexpectedly found nil while unwrapping an Optional value 

Debug Тесты:

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 
 
    }