Swift - Write Image from URL to Local File
Solution 1
The following code would write a UIImage
in the Application Documents directory under the filename 'filename.jpg'
var image = .... // However you create/get a UIImage
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let destinationPath = documentsPath.stringByAppendingPathComponent("filename.jpg")
UIImageJPEGRepresentation(image,1.0).writeToFile(destinationPath, atomically: true)
Solution 2
In Swift 3:
Write
do {
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentsURL.appendingPathComponent("\(fileName).png")
if let pngImageData = UIImagePNGRepresentation(image) {
try pngImageData.write(to: fileURL, options: .atomic)
}
} catch { }
Read
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let filePath = documentsURL.appendingPathComponent("\(fileName).png").path
if FileManager.default.fileExists(atPath: filePath) {
return UIImage(contentsOfFile: filePath)
}
Solution 3
In swift 2.0, stringByAppendingPathComponent is unavailable, so the answer changes a bit. Here is what I've done to write a UIImage out to disk.
documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first!
if let image = UIImage(data: someNSDataRepresentingAnImage) {
let fileURL = documentsURL.URLByAppendingPathComponent(fileName+".png")
if let pngImageData = UIImagePNGRepresentation(image) {
pngImageData.writeToURL(fileURL, atomically: false)
}
}
Solution 4
UIImagePNGRepresentaton() function had been deprecated. try image.pngData()
Tyler
Updated on April 14, 2020Comments
-
Tyler about 4 years
I've been learning swift rather quickly, and I'm trying to develop an OS X application that downloads images.
I've been able to parse the JSON I'm looking for into an array of URLs as follows:
func didReceiveAPIResults(results: NSArray) { println(results) for link in results { let stringLink = link as String //Check to make sure that the string is actually pointing to a file if stringLink.lowercaseString.rangeOfString(".jpg") != nil {2 //Convert string to url var imgURL: NSURL = NSURL(string: stringLink)! //Download an NSData representation of the image from URL var request: NSURLRequest = NSURLRequest(URL: imgURL) var urlConnection: NSURLConnection = NSURLConnection(request: request, delegate: self)! //Make request to download URL NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: { (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in if !(error? != nil) { //set image to requested resource var image = NSImage(data: data) } else { //If request fails... println("error: \(error.localizedDescription)") } }) } } }
So at this point I have my images defined as "image", but what I'm failing to grasp here is how to save these files to my local directory.
Any help on this matter would be greatly appreciated!
Thanks,
tvick47
-
Tyler over 9 yearsThanks for the response! However, whenever I try to build with that code I receive the error:
Use of unresolved identifier 'UIImageJPEGRepresentation'
-
kurtn718 over 9 yearsThat function exists on iOS. Here's how to do it using Mac APIs in Objective-C. Will post Swift version stackoverflow.com/questions/3038820/…
-
Tyler over 9 yearsThanks for the update! Although I do understand a bit further, a swift version would really help me out. Thanks!
-
Gargo over 6 yearsString doesn't have
stringByAppendingPathComponent
-
moonvader over 6 yearsgreat answer - please consider to add info about image deletion
-
jamryu over 5 yearsI am trying to use UIImagePNGRepresentation() function but Xcode does not recognize it for some reason. I am using Swift 4.2.
-
Karthi Rasu about 4 yearstry pngData() PNG is changed