保存图像然后加载到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目录中创建一个目录才能存储文件。