保存图像然后加载到Swift(iOS)

我正在使用saveImage保存图像。

func saveImage (image: UIImage, path: String ) -> Bool{ let pngImageData = UIImagePNGRepresentation(image) //let jpgImageData = UIImageJPEGRepresentation(image, 1.0) // if you want to save as JPEG print("!!!saving image at: \(path)") let result = pngImageData!.writeToFile(path, atomically: true) return result } 

新信息:

保存文件无法正常工作(打印“[ – ] ERROR SAVING FILE”) –

  // save your image here into Document Directory let res = saveImage(tempImage, path: fileInDocumentsDirectory("abc.png")) if(res == true){ print ("[+] FILE SAVED") }else{ print ("[-] ERROR SAVING FILE") } 

为什么saveImage函数没有保存图像? 访问权?

旧信息:

调试信息说:

 !!!saving image at: file:///var/mobile/Applications/BDB992FB-E378-4719-B7B7-E9A364EEE54B/Documents/tempImage 

然后我使用检索此位置

 fileInDocumentsDirectory("tempImage") 

结果是正确的。

然后我使用此路径加载文件

  let image = UIImage(contentsOfFile: path) if image == nil { print("missing image at: \(path)") }else{ print("!!!IMAGE FOUND at: \(path)") } 

路径是正确的,但消息是“在…处丢失图像”。 文件是否以某种方式无法访问或未存储? 这种行为可能是什么原因?

我正在使用ios 7和带有ios 7模拟器的iphone 5在iphone 4上测试此代码。

编辑:1。fileInDocumentsDirectory函数

 func fileInDocumentsDirectory(filename: String) -> String { let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] let fileURL = documentsURL.URLByAppendingPathComponent(filename).absoluteString return fileURL } 

斯威夫特3

此function将图像保存在文档文件夹中:

 func saveImage(image: UIImage) -> Bool { guard let data = UIImageJPEGRepresentation(image, 1) ?? UIImagePNGRepresentation(image) else { return false } guard let directory = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) as NSURL else { return false } do { try data.write(to: directory.appendingPathComponent("fileName.png")!) return true } catch { print(error.localizedDescription) return false } } 

使用:

 let success = saveImage(image: UIImage(named: "image.png")!) 

这个函数将获得该图像:

 func getSavedImage(named: String) -> UIImage? { if let dir = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) { return UIImage(contentsOfFile: URL(fileURLWithPath: dir.absoluteString).appendingPathComponent(named).path) } return nil } 

使用:

 if let image = getSavedImage(named: "fileName") { // do something with image } 

您应该使用扩展名保存图像名称,以便您的路径应该像,

///var/mobile/Applications/BDB992FB-E378-4719-B7B7-E9A364EEE54B/Documents/tempImage.png

第二件事取代下线,

  let result = pngImageData!.writeToFile(path, atomically: true) 

  let result = pngImageData!.writeToFile(path, atomically: false) 

你需要将false设置为atomically参数。

primefaces:

如果为true,则将数据写入备份文件,然后 – 假设不发生错误 – 将备份文件重命名为path指定的名称; 否则,数据直接写入路径。

希望这会有所帮助:)

如果要从服务器加载图像,可以执行以下操作

  let url = URL(string: "http://sofzh.miximages.com/ios/iphone-4s-wallpapers-mobile-backgrounds-dark_2466f886de3472ef1fa968033f1da3e1_raw_1087fae1932cec8837695934b7eb1250_raw.jpg") URLSession.shared.dataTask(with: url!) { (data, response, error) in guard let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200, let mimeType = response?.mimeType, mimeType.hasPrefix("image"), let data = data, error == nil else { return } DispatchQueue.main.async() { () -> Void in let fileManager = FileManager.default let paths = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent("apple.jpg") print(paths) fileManager.createFile(atPath: paths as String, contents: data, attributes: nil) }}.resume() 

Ashish的评论有一个答案的线索。 如果您阅读UIImage(contentsOfFile:)上的文档,他们会说

path文件的路径。 此路径应包括标识图像数据类型的文件扩展名

imageNamed调用非常智能,可以尝试.png和.jpg扩展,但contentsOfFile调用需要包含扩展名的完整路径。

您必须在Documents目录中创建一个目录才能存储文件。