extension UIImage { func fixedOrientation() -> UIImage { if imageOrientation == UIImageOrientation.Up { return self } var transform: CGAffineTransform = CGAffineTransformIdentity switch imageOrientation { case UIImageOrientation.Down, UIImageOrientation.DownMirrored: transform = CGAffineTransformTranslate(transform, size.width, size.height) transform = CGAffineTransformRotate(transform, CGFloat(M_PI)) break case UIImageOrientation.Left, UIImageOrientation.LeftMirrored: transform = CGAffineTransformTranslate(transform, size.width, 0) transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2)) break case UIImageOrientation.Right, UIImageOrientation.RightMirrored: transform = CGAffineTransformTranslate(transform, 0, size.height) transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2)) break case UIImageOrientation.Up, UIImageOrientation.UpMirrored: break } switch imageOrientation { case UIImageOrientation.UpMirrored, UIImageOrientation.DownMirrored: CGAffineTransformTranslate(transform, size.width, 0) CGAffineTransformScale(transform, -1, 1) break case UIImageOrientation.LeftMirrored, UIImageOrientation.RightMirrored: CGAffineTransformTranslate(transform, size.height, 0) CGAffineTransformScale(transform, -1, 1) case UIImageOrientation.Up, UIImageOrientation.Down, UIImageOrientation.Left, UIImageOrientation.Right: break } let ctx: CGContextRef = CGBitmapContextCreate(nil, Int(size.width), Int(size.height), CGImageGetBitsPerComponent(CGImage), 0, CGImageGetColorSpace(CGImage), CGImageAlphaInfo.PremultipliedLast.rawValue)! CGContextConcatCTM(ctx, transform) switch imageOrientation { case UIImageOrientation.Left, UIImageOrientation.LeftMirrored, UIImageOrientation.Right, UIImageOrientation.RightMirrored: CGContextDrawImage(ctx, CGRectMake(0, 0, size.height, size.width), CGImage) break default: CGContextDrawImage(ctx, CGRectMake(0, 0, size.width, size.height), CGImage) break } let cgImage: CGImageRef = CGBitmapContextCreateImage(ctx)! return UIImage(CGImage: cgImage) } }