无法将CIImage转换为Swift 3.0中的UIImage
我正在使用以下代码来制作图像格式的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 }
现在我需要将其保存为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)
原因
fatal error: unexpectedly found nil while unwrapping an Optional value
debuggingtesting:
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 }
使用此function将CIImage转换为UIImage。 有用 。
我的最终代码
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 }