iOS - UIImageView - how to handle UIImage image orientation
Solution 1:
If I understand, what you want to do is disregard the orientation of the UIImage? If so then you could do this:
UIImage *originalImage = [... whatever ...];
UIImage *imageToDisplay =
[UIImage imageWithCGImage:[originalImage CGImage]
scale:[originalImage scale]
orientation: UIImageOrientationUp];
So you're creating a new UIImage with the same pixel data as the original (referenced via its CGImage property) but you're specifying an orientation that doesn't rotate the data.
Solution 2:
You can completely avoid manually doing the transforms and scaling yourself, as suggested by an0 in this answer here:
- (UIImage *)normalizedImage {
if (self.imageOrientation == UIImageOrientationUp) return self;
UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
[self drawInRect:(CGRect){0, 0, self.size}];
UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return normalizedImage;
}
The documentation for the UIImage methods size and drawInRect explicitly states that they take into account orientation.
Solution 3:
Swift 3.1
func fixImageOrientation(_ image: UIImage)->UIImage {
UIGraphicsBeginImageContext(image.size)
image.draw(at: .zero)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage ?? image
}
Solution 4:
This method first checks the current orientation of UIImage and then it changes the orientation in a clockwise way and return UIImage.You can show this image as
self.imageView.image = rotateImage(currentUIImage)
func rotateImage(image:UIImage)->UIImage
{
var rotatedImage = UIImage();
switch image.imageOrientation
{
case UIImageOrientation.Right:
rotatedImage = UIImage(CGImage:image.CGImage!, scale: 1, orientation:UIImageOrientation.Down);
case UIImageOrientation.Down:
rotatedImage = UIImage(CGImage:image.CGImage!, scale: 1, orientation:UIImageOrientation.Left);
case UIImageOrientation.Left:
rotatedImage = UIImage(CGImage:image.CGImage!, scale: 1, orientation:UIImageOrientation.Up);
default:
rotatedImage = UIImage(CGImage:image.CGImage!, scale: 1, orientation:UIImageOrientation.Right);
}
return rotatedImage;
}
Swift 4 version
extension UIImage {
func rotate() -> UIImage {
var rotatedImage = UIImage()
guard let cgImage = cgImage else {
print("could not rotate image")
return self
}
switch imageOrientation {
case .right:
rotatedImage = UIImage(cgImage: cgImage, scale: scale, orientation: .down)
case .down:
rotatedImage = UIImage(cgImage: cgImage, scale: scale, orientation: .left)
case .left:
rotatedImage = UIImage(cgImage: cgImage, scale: scale, orientation: .up)
default:
rotatedImage = UIImage(cgImage: cgImage, scale: scale, orientation: .right)
}
return rotatedImage
}
}