In some reasons, you might want to store an UIImage, that is generated using Core Graphics, or from device’s Photo Gallery via UIImagePickerController, to a local file as PNG or a JPEG format.

By using UIImagePNGRepresentation() or UIImageJPEGRepresentation(), UIImage will be converted into Data so you can write it to local file easily.

Here is an example of a helper function that store an UIImage to a PNG file:

1
2
3
4
5
6
7
8
9
10
11
12
public static func storeImageToDocumentDirectory(image: UIImage, fileName: String) -> URL? {
    guard let data = UIImagePNGRepresentation(image) else {
        return nil
    }
    let fileURL = self.fileURLInDocumentDirectory(fileName)
    do {
        try data.write(to: fileURL)
        return fileURL
    } catch {
        return nil
    }
}

In the upper code, there is a call to fileURLInDocumentDirectory().
In this example, I store a file to Document Directory. You can replace that funcion by your own function getting the file URL of the location you want to store a file.

1
2
3
4
5
6
public static var documentsDirectoryURL: URL {
    return FileManager.default.urls(for:.documentDirectory, in: .userDomainMask)[0]
}
public static func fileURLInDocumentDirectory(_ fileName: String) -> URL {
    return self.documentsDirectoryURL.appendingPathComponent(fileName)
}

If you want to store your image as a JPEG, just replacing UIImagePNGRepresentation() as UIImageJPEGRepresentation()

Here is the code:

1
2
3
4
5
6
7
8
9
10
11
12
public static func storeImageToDocumentDirectory(image: UIImage, fileName: String) -> URL? {
    guard let data = UIImageJPEGRepresentation(image, 0.5) else {
        return nil
    }
    let fileURL = self.fileURLInDocumentDirectory(fileName)
    do {
        try data.write(to: fileURL)
        return fileURL
    } catch {
        return nil
    }
}

0.5 is JPEG quality. You can change it from 1.0 to 0.0.