diff --git a/fixImageOrientation.swift b/fixImageOrientation.swift index a58fbce..221b01a 100644 --- a/fixImageOrientation.swift +++ b/fixImageOrientation.swift @@ -4,58 +4,58 @@ import UIKit -func fixImageOrientation(src:UIImage)->UIImage { - - if src.imageOrientation == UIImageOrientation.Up { - return src + func fixImageOrientation(src:UIImage)->UIImage { + + if src.imageOrientation == UIImageOrientation.up { + return src + } + + var transform: CGAffineTransform = CGAffineTransform.identity + switch src.imageOrientation { + case UIImageOrientation.down, UIImageOrientation.downMirrored: + transform = transform.translatedBy(x: src.size.width, y: src.size.height) + transform = transform.rotated(by: CGFloat(M_PI)) + break + case UIImageOrientation.left, UIImageOrientation.leftMirrored: + transform = transform.translatedBy(x: src.size.width, y: 0) + transform = transform.rotated(by: CGFloat(M_PI_2)) + break + case UIImageOrientation.right, UIImageOrientation.rightMirrored: + transform = transform.translatedBy(x: 0, y: src.size.height) + transform = transform.rotated(by: CGFloat(-M_PI_2)) + break + case UIImageOrientation.up, UIImageOrientation.upMirrored: + break + } + + switch src.imageOrientation { + case UIImageOrientation.upMirrored, UIImageOrientation.downMirrored: + transform.translatedBy(x: src.size.width, y: 0) + transform.scaledBy(x: -1, y: 1) + break + case UIImageOrientation.leftMirrored, UIImageOrientation.rightMirrored: + transform.translatedBy(x: src.size.height, y: 0) + transform.scaledBy(x: -1, y: 1) + case UIImageOrientation.up, UIImageOrientation.down, UIImageOrientation.left, UIImageOrientation.right: + break + } + + let ctx:CGContext = CGContext(data: nil, width: Int(src.size.width), height: Int(src.size.height), bitsPerComponent: src.cgImage!.bitsPerComponent, bytesPerRow: 0, space: src.cgImage!.colorSpace!, bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)! + + ctx.concatenate(transform) + + + switch src.imageOrientation { + case UIImageOrientation.left, UIImageOrientation.leftMirrored, UIImageOrientation.right, UIImageOrientation.rightMirrored: + ctx.draw(src.cgImage!, in: CGRect(x: 0, y: 0, width: src.size.width, height: src.size.height)) + break + default: + ctx.draw(src.cgImage!, in: CGRect(x: 0, y: 0, width: src.size.width, height: src.size.height) ) + break + } + + let cgimg:CGImage = ctx.makeImage()! + let img:UIImage = UIImage(cgImage: cgimg) + + return img } - - var transform: CGAffineTransform = CGAffineTransformIdentity - - switch src.imageOrientation { - case UIImageOrientation.Down, UIImageOrientation.DownMirrored: - transform = CGAffineTransformTranslate(transform, src.size.width, src.size.height) - transform = CGAffineTransformRotate(transform, CGFloat(M_PI)) - break - case UIImageOrientation.Left, UIImageOrientation.LeftMirrored: - transform = CGAffineTransformTranslate(transform, src.size.width, 0) - transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2)) - break - case UIImageOrientation.Right, UIImageOrientation.RightMirrored: - transform = CGAffineTransformTranslate(transform, 0, src.size.height) - transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2)) - break - case UIImageOrientation.Up, UIImageOrientation.UpMirrored: - break - } - - switch src.imageOrientation { - case UIImageOrientation.UpMirrored, UIImageOrientation.DownMirrored: - CGAffineTransformTranslate(transform, src.size.width, 0) - CGAffineTransformScale(transform, -1, 1) - break - case UIImageOrientation.LeftMirrored, UIImageOrientation.RightMirrored: - CGAffineTransformTranslate(transform, src.size.height, 0) - CGAffineTransformScale(transform, -1, 1) - case UIImageOrientation.Up, UIImageOrientation.Down, UIImageOrientation.Left, UIImageOrientation.Right: - break - } - - let ctx:CGContextRef = CGBitmapContextCreate(nil, Int(src.size.width), Int(src.size.height), CGImageGetBitsPerComponent(src.CGImage), 0, CGImageGetColorSpace(src.CGImage), CGImageAlphaInfo.PremultipliedLast.rawValue)! - - CGContextConcatCTM(ctx, transform) - - switch src.imageOrientation { - case UIImageOrientation.Left, UIImageOrientation.LeftMirrored, UIImageOrientation.Right, UIImageOrientation.RightMirrored: - CGContextDrawImage(ctx, CGRectMake(0, 0, src.size.height, src.size.width), src.CGImage) - break - default: - CGContextDrawImage(ctx, CGRectMake(0, 0, src.size.width, src.size.height), src.CGImage) - break - } - - let cgimg:CGImageRef = CGBitmapContextCreateImage(ctx)! - let img:UIImage = UIImage(CGImage: cgimg) - - return img -} \ No newline at end of file