Resizing images picked from UIImagePickerController

There’s already a lot of stuff about image resizing on iOS already available on the web with each discussing about potential pros and cons of the technique. There is also a good post on NSHipster summarizing some of the best available image resizing techniques.

With iOS 8, Apple has given us PhotoKit, a modern framework for managing photos without diving into the low level details and more performant than AssetsLibrary. Let’s see how we can resize a simple image selected using the UIImagePickerController using PhotoKit.

imagePickerController.bk_didFinishPickingMediaBlock = {
    (controller imagePickerController: UIImagePickerController!, dictionary: [NSObject:AnyObject]!) -> Void in
    imagePickerController.dismissViewControllerAnimated(true, completion: nil)

    guard let assetURL = dictionary[UIImagePickerControllerReferenceURL] as? NSURL else {
        if let image = dictionary[UIImagePickerControllerOriginalImage] as? UIImage {
            // TODO Image taken from the camera. Resize using one of the techniques discussed on

    // Fetch Photos Asset and resize image
    let fetchResult = PHAsset.fetchAssetsWithALAssetURLs([assetURL], options: nil)
    let options = PHImageRequestOptions()
    options.synchronous = false
    options.resizeMode = .Fast
    options.deliveryMode = .HighQualityFormat

    guard let asset = fetchResult.firstObject as? PHAsset else {
        if let image = dictionary[UIImagePickerControllerOriginalImage] as? UIImage {
            // TODO Cannot find the associated PhotoKit asset. Resize using one of the techniques discussed on

    // Request resized image
    PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: CGSize(width: 1024, height: 1024), contentMode: .AspectFit, options: options, resultHandler: { (image, _) -> Void in
        // image is the resized image

The code is pretty straightforward. We fetch the PHAsset from the asset url of the image and then use the PHImageManager to get the resized image. There are a few options to control the scaling mode.

  • deliveryMode : Controls the requested image quality and delivery priority.
  • Opportunistic: Photos automatically provides one or more results in order to balance image quality and responsiveness. The resultHandler block more than once with different quality images as they become available.
  • HighQualityFormat: Photos provides only the highest-quality image available, regardless of how much time it takes to load.
  • FastFormat: Photos provides only a fast-loading image, possibly sacrificing image quality.
  • resizeMode: A mode that specifies how to resize the requested image.
  • None: Photos does not resize the image asset.
  • Fast: Photos efficiently resizes the image to a size similar to, or slightly larger than, the target size.
  • Exact: Photos resizes the image to match the target size exactly.
Published 29 Nov 2015

I build mobile and web applications. Full Stack, Rails, React, Typescript, Kotlin, Swift
Pulkit Goyal on Twitter