Encoding and Decoding Images as Data in UserDefaults in SUSI iOS
In this blog post, I will be explaining how to encode and decode images and save them in UserDefaults so that the image persists even if it is removed from the Photos app. It happens a number of times that images are removed from the gallery by the users which results in the app loosing the image. So, to avoid this, we save the image by encoding it in a data object and save it inside UserDefaults. In SUSI iOS app we simply select an image from the image picker, encode it and save it in UserDefaults. To set the image, we simply fetch the image data from the UserDefaults and decode it to an image.
There are two ways we can do the encoding and decoding process:
- Using Data object
- Using Base64 string
For the scope of this tutorial, we will use the Data object.
Implementation Steps
- To use the image picker, we need to add permissions to `Info.plist` file.
<key>NSLocationWhenInUseUsageDescription</key> <string>Susi is requesting to get your current location</string> <key>NSPhotoLibraryUsageDescription</key> <string>Susi needs to request your gallery access to select wallpaper</string>
- Select image from gallery
First, we present an alert which gives an option to select the image from the gallery.
// Show wallpaper options to set wallpaper or clear wallpaper func showWallpaperOptions() { let imageDialog = UIAlertController(title: ControllerConstants.wallpaperOptionsTitle, message: nil, preferredStyle: UIAlertControllerStyle.alert) imageDialog.addAction(UIAlertAction(title: ControllerConstants.wallpaperOptionsPickAction, style: .default, handler: { (_: UIAlertAction!) in imageDialog.dismiss(animated: true, completion: nil) self.showImagePicker() })) imageDialog.addAction(UIAlertAction(title: ControllerConstants.wallpaperOptionsNoWallpaperAction, style: .default, handler: { (_: UIAlertAction!) in imageDialog.dismiss(animated: true, completion: nil) self.removeWallpaperFromUserDefaults() })) imageDialog.addAction(UIAlertAction(title: ControllerConstants.dialogCancelAction, style: .cancel, handler: { (_: UIAlertAction!) in imageDialog.dismiss(animated: true, completion: nil) })) self.present(imageDialog, animated: true, completion: nil) }
Here, we create and UIAlertController with three options to select, one which presents the image picker controller, the second one removes the background wallpaper and the third dismisses the alert.
- Set the image as background view
// Callback when image is selected from gallery func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { dismiss(animated: true, completion: nil) let chosenImage = info[UIImagePickerControllerOriginalImage] as? UIImage if let image = chosenImage { setBackgroundImage(image: image) } }
We use the `didFinishPickingMediaWithInfo` delegate method to set the image as background. First we get the image using the the `info` dictionary using the `UIImagePickerControllerOriginalImage` key.
- Save the image in UserDefaults (encoding)
// Save image selected by user to user defaults func saveWallpaperInUserDefaults(image: UIImage!) { let imageData = UIImageJPEGRepresentation(image!, 1.0) let defaults = UserDefaults.standard defaults.set(imageData, forKey: userDefaultsWallpaperKey) }
We first convert the image to a data object using the `UIImageJPEGRepresentation` method followed by saving the data object in UserDefaults with the key `wallpaper`.
- Decode the data object back to UIImage
Now whenever we need to decode the image, we simply get the data object from the UserDefaults and use it to display the image.
// Check if user defaults have an image data saved else return nil/Any func getWallpaperFromUserDefaults() -> Any? { let defaults = UserDefaults.standard return defaults.object(forKey: userDefaultsWallpaperKey) }
Below is the output when an image is selected and displayed as a background.
Resources:
- Apple docs on UIImagePickerController : discusses the usage and various method of UIImagePickerController
- Apple docs on UserDefaults: discusses usage of UserDefaults
- Choosing images using UIImagePickerController: tutorial discussing how to choose images with UIImagePickerController
- Stackoverflow Answer on how to encode and decode images
You must be logged in to post a comment.