How to select a portion of an image, crop, and save it using Swift?

Sriram picture Sriram · Jul 6, 2015 · Viewed 33.5k times · Source

I am trying to create an iOS app using Swift to capture images and let the user save a selected portion of the image. In many cam based apps, I noticed that a rectangular frame is offered to let the users choose the desired portion. This involves either sliding the edges of the rectangle or moving the corners to fit the required area.

Could you please guide me on how to implement that moveable rectangle and how to save only that piece of the image?

Answer

Paulo picture Paulo · Jan 9, 2017

Using Swift 3

Image cropping can be done using CGImages from CoreGraphics.

Get the CGImage version of a UIImage like this:

// cgImage is an attribute of UIImage
let cgImage = image.cgImage

CGImage objects have a method cropping(to: CGRect) that does the cropping:

let croppedCGImage: CGImage = cgImage.cropping(to: toRect)

Finally, convert back from CGImage to UIImage:

let uiImage = UIImage(cgImage: croppedCGImage)

Example function:

func cropImage(image: UIImage, toRect: CGRect) -> UIImage? {
    // Cropping is available trhough CGGraphics
    let cgImage :CGImage! = image.cgImage
    let croppedCGImage: CGImage! = cgImage.cropping(to: toRect)

    return UIImage(cgImage: croppedCGImage)
}

The CGRect attribute of cropping defines the 'crop rectangle' inside the image that will be cropped.