Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Saving image and then loading it in Swift (iOS)

I am saving an image using 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 } 

New info:

Saving file does not work properly ("[-] ERROR SAVING FILE" is printed)--

            // 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")         } 

Why doesn't the saveImage function save the image? Access rights?

Older info:

The debug info says:

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

Then I retrieve this location using

fileInDocumentsDirectory("tempImage") 

The result is correct.

Then I am loading the file using this path

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

The path is correct, but the message is "missing image at..". Is the file somehow inaccessible or not stored? What can be a reason for this behavior?

I am testing this code on iphone 4 with ios 7 and iphone 5 with ios 7 simulator.

Edit: 1. The fileInDocumentsDirectory function

func fileInDocumentsDirectory(filename: String) -> String {      let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]     let fileURL = documentsURL.URLByAppendingPathComponent(filename).absoluteString     return fileURL         } 
like image 671
tesgoe Avatar asked May 20 '16 10:05

tesgoe


People also ask

How do I save a file in UIImage?

If you've generated an image using Core Graphics, or perhaps rendered part of your layout, you might want to save that out as either a PNG or a JPEG. Both are easy thanks to two methods: pngData() and jpegData() , both of which convert a UIImage into a Data instance you can write out.

How do I save an image in Userdefaults?

It is, but it isn't possible to store an image as is in the user's defaults database. The defaults system only supports strings, numbers, Date objects, and Data objects. This means that you need to convert the image to a Data object before you can store it in the user's defaults database.


2 Answers

This function will save an image in the documents folder:

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     } } 

To use:

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

This function will get that image:

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 } 

To use:

if let image = getSavedImage(named: "fileName") {     // do something with image } 
like image 101
Bobby Avatar answered Oct 13 '22 00:10

Bobby


iOS 13+ Swift 5.1

iOS 12 introduced some API Changes.

func saveImage(imageName: String, image: UIImage) {    guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }      let fileName = imageName     let fileURL = documentsDirectory.appendingPathComponent(fileName)     guard let data = image.jpegData(compressionQuality: 1) else { return }      //Checks if file exists, removes it if so.     if FileManager.default.fileExists(atPath: fileURL.path) {         do {             try FileManager.default.removeItem(atPath: fileURL.path)             print("Removed old image")          } catch let removeError {             print("couldn't remove file at path", removeError)         }      }      do {         try data.write(to: fileURL)     } catch let error {         print("error saving file with error", error)      }  }    func loadImageFromDiskWith(fileName: String) -> UIImage? {    let documentDirectory = FileManager.SearchPathDirectory.documentDirectory      let userDomainMask = FileManager.SearchPathDomainMask.userDomainMask     let paths = NSSearchPathForDirectoriesInDomains(documentDirectory, userDomainMask, true)      if let dirPath = paths.first {         let imageUrl = URL(fileURLWithPath: dirPath).appendingPathComponent(fileName)         let image = UIImage(contentsOfFile: imageUrl.path)         return image      }      return nil } 
like image 24
Sam Bing Avatar answered Oct 13 '22 01:10

Sam Bing