/ swift

How to rotate an UIImage using Swift

Recently I've been working on a photo sharing application, Vimg.co, and I needed to rotate a UIImage that was captured with the user's camera.

I've tried a number of options, and none of them really work. After searching for a while, I stumbled upon some code that actually worked, and I modified it a bit to fit my needs.

Here's the code you need:


import UIKit

extension UIImage {
    public func imageRotatedByDegrees(degrees: CGFloat, flip: Bool) -> UIImage {
        let radiansToDegrees: (CGFloat) -> CGFloat = {
            return $0 * (180.0 / CGFloat(M_PI))
        let degreesToRadians: (CGFloat) -> CGFloat = {
            return $0 / 180.0 * CGFloat(M_PI)
        // calculate the size of the rotated view's containing box for our drawing space
        let rotatedViewBox = UIView(frame: CGRect(origin: CGPointZero, size: size))
        let t = CGAffineTransformMakeRotation(degreesToRadians(degrees));
        rotatedViewBox.transform = t
        let rotatedSize = rotatedViewBox.frame.size
        // Create the bitmap context
        let bitmap = UIGraphicsGetCurrentContext()
        // Move the origin to the middle of the image so we will rotate and scale around the center.
        CGContextTranslateCTM(bitmap, rotatedSize.width / 2.0, rotatedSize.height / 2.0);
        //   // Rotate the image context
        CGContextRotateCTM(bitmap, degreesToRadians(degrees));
        // Now, draw the rotated/scaled image into the context
        var yFlip: CGFloat
            yFlip = CGFloat(-1.0)
        } else {
            yFlip = CGFloat(1.0)
        CGContextScaleCTM(bitmap, yFlip, -1.0)
        CGContextDrawImage(bitmap, CGRectMake(-size.width / 2, -size.height / 2, size.width, size.height), CGImage)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        return newImage

To use it, simply call the function on an existing UIImage:

rotatedPhoto = rotatedPhoto?.imageRotatedByDegrees(90, flip: false)

The flip parameter will flip the image horizontally. You can leave it as false if you just want a simple rotation.

Rui Gomes

Rui Gomes

Web Developer, Internet Marketing enthusiast and Student@FEUP. That pretty much sums it up.

Read More