Swift - Write Image from URL to Local File

42,689

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()

Share:
42,689
Tyler
Author by

Tyler

Updated on April 14, 2020

Comments

  • Tyler
    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
    Tyler over 9 years
    Thanks for the response! However, whenever I try to build with that code I receive the error: Use of unresolved identifier 'UIImageJPEGRepresentation'
  • kurtn718
    kurtn718 over 9 years
    That 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
    Tyler over 9 years
    Thanks for the update! Although I do understand a bit further, a swift version would really help me out. Thanks!
  • Gargo
    Gargo over 6 years
    String doesn't have stringByAppendingPathComponent
  • moonvader
    moonvader over 6 years
    great answer - please consider to add info about image deletion
  • jamryu
    jamryu over 5 years
    I am trying to use UIImagePNGRepresentation() function but Xcode does not recognize it for some reason. I am using Swift 4.2.
  • Karthi Rasu
    Karthi Rasu about 4 years
    try pngData() PNG is changed