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 }
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?
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 }
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.
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.
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 }
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 }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With