Created
February 3, 2015 08:55
-
-
Save mushu8/0acd3631f7155424e62f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
extension UIImage { | |
func fixOrientation() -> UIImage { | |
// No-op if the orientation is already correct | |
if self.imageOrientation == .Up { return self } | |
// We need to calculate the proper transformation to make the image upright. | |
// We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. | |
var transform = CGAffineTransformIdentity | |
switch self.imageOrientation { | |
case .Down, .DownMirrored: | |
transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height) | |
transform = CGAffineTransformRotate(transform, CGFloat(M_PI)) | |
case .Left, .LeftMirrored: | |
transform = CGAffineTransformTranslate(transform, self.size.width, 0); | |
transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2)) | |
case .Right, .RightMirrored: | |
transform = CGAffineTransformTranslate(transform, 0, self.size.height); | |
transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2)) | |
default: | |
break | |
} | |
switch self.imageOrientation { | |
case .UpMirrored, .DownMirrored: | |
transform = CGAffineTransformTranslate(transform, self.size.width, 0) | |
transform = CGAffineTransformScale(transform, -1, 1) | |
case .LeftMirrored, .RightMirrored: | |
transform = CGAffineTransformTranslate(transform, self.size.height, 0) | |
transform = CGAffineTransformScale(transform, -1, 1) | |
default: | |
break | |
} | |
// Now we draw the underlying CGImage into a new context, applying the transform | |
// calculated above. | |
let ctx = CGBitmapContextCreate(nil, UInt(self.size.width), UInt(self.size.height), | |
CGImageGetBitsPerComponent(self.CGImage), 0, | |
CGImageGetColorSpace(self.CGImage), | |
CGImageGetBitmapInfo(self.CGImage)) | |
CGContextConcatCTM(ctx, transform) | |
switch self.imageOrientation { | |
case .Left, .LeftMirrored, .Right, .RightMirrored: | |
// Grr... | |
CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage) | |
default: | |
CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage) | |
} | |
// And now we just create a new UIImage from the drawing context | |
let cgimg = CGBitmapContextCreateImage(ctx) | |
let img = UIImage(CGImage: cgimg) | |
return img! | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment