How to flip UIImage horizontally?

IosUiimageUiimageorientation

Ios Problem Overview


How to flip the UIImage horizontally, I found UIImageOrientationUpMirrored enumeration value in the UIImage class reference, how to make use of this property to flip UIImage.

Ios Solutions


Solution 1 - Ios

Objective-C

UIImage* sourceImage = [UIImage imageNamed:@"whatever.png"];

UIImage* flippedImage = [UIImage imageWithCGImage:sourceImage.CGImage 
                                            scale:sourceImage.scale
                                      orientation:UIImageOrientationUpMirrored];

Swift

let flippedImage = myImage.withHorizontallyFlippedOrientation()

Solution 2 - Ios

A very simple way you can achieve this is by creating a UIImageView instead of a UIImage and do the transform on UIImageView.

yourImageView.image =[UIImage imageNamed:@"whatever.png"];
yourImageView.transform = CGAffineTransform(scaleX: -1, y: 1); //Flipped

Hope this helps.

Solution 3 - Ios

Vertical flip is often required to initialise OpenGL texture using glTexImage2d(...). The above proposed tricks do not actually modify image data and will not work in this case. Here is a code to do the actual data flip inspired by https://stackoverflow.com/a/17909372

- (UIImage *)flipImage:(UIImage *)image
{
    UIGraphicsBeginImageContext(image.size);
    CGContextDrawImage(UIGraphicsGetCurrentContext(),CGRectMake(0.,0., image.size.width, image.size.height),image.CGImage);
    UIImage *i = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return i;
}

Solution 4 - Ios

I have tried with imageFlippedForRightToLeftLayoutDirection, and creating a new UIImage with diferent orientations but at least this is the only solution I found for flipping my image

let ciimage: CIImage = CIImage(CGImage: imagenInicial.CGImage!)
let rotada3 = ciimage.imageByApplyingTransform(CGAffineTransformMakeScale(-1, 1))

As you can see in my playground it worked!! :) enter image description here

And the, of course, let finalImage = UIImage(CIImage: rotada3)

Solution 5 - Ios

As it Image Orientation Defines:

typedef NS_ENUM(NSInteger, UIImageOrientation) {
UIImageOrientationUp,            // default orientation
UIImageOrientationDown,          // 180 deg rotation
UIImageOrientationLeft,          // 90 deg CCW
UIImageOrientationRight,         // 90 deg CW
UIImageOrientationUpMirrored,    // as above but image mirrored along other axis. horizontal flip
UIImageOrientationDownMirrored,  // horizontal flip
UIImageOrientationLeftMirrored,  // vertical flip
UIImageOrientationRightMirrored, // vertical flip
};

I made some improvements for more circumstances like handling UIImage from AVCaptureSession.

UIImage* sourceImage = [UIImage imageNamed:@"whatever.png"];
UIImageOrientation flipingOrientation;
if(sourceImage.imageOrientation>=4){
    flippedOrientation = sourceImage.imageOrientation - 4;
}else{
    flippedOrientation = sourceImage.imageOrientation + 4;
}
UIImage* flippedImage = [UIImage imageWithCGImage:sourceImage.CGImage 
                     scale: sourceImage.scale orientation: flipingOrientation];

Solution 6 - Ios

here's swift version: (I saw this question in comments)

let srcImage = UIImage(named: "imageName")
let flippedImage = UIImage(CGImage: srcImage.CGImage, scale: srcImage.scale, orientation: UIImageOrientation.UpMirrored)

Solution 7 - Ios

This is a solid implementation to mirror/flip an UIImage horizontally, and can apply to the image back and forth. Since it changes the underlying image data, the drawing(like, screenshot) will also change. Tested to work, no quality loss.

func flipImage() -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        let bitmap = UIGraphicsGetCurrentContext()!

        bitmap.translateBy(x: size.width / 2, y: size.height / 2)
        bitmap.scaleBy(x: -1.0, y: -1.0)

        bitmap.translateBy(x: -size.width / 2, y: -size.height / 2)
        bitmap.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image?
}

Solution 8 - Ios

iOS 10+

[myImage imageWithHorizontallyFlippedOrientation];

Swift 4:

let flippedImage = myImage.withHorizontallyFlippedOrientation()

Solution 9 - Ios

May be this will be of use for some:

    UIImageOrientation imageOrientation;
    
    switch (sourceImage.imageOrientation) {
        case UIImageOrientationDown:
            imageOrientation = UIImageOrientationDownMirrored;
            break;
        
        case UIImageOrientationDownMirrored:
            imageOrientation = UIImageOrientationDown;
            break;
        
        case UIImageOrientationLeft:
            imageOrientation = UIImageOrientationLeftMirrored;
            break;
            
        case UIImageOrientationLeftMirrored:
            imageOrientation = UIImageOrientationLeft;

            break;
            
        case UIImageOrientationRight:
            imageOrientation = UIImageOrientationRightMirrored;

            break;
            
        case UIImageOrientationRightMirrored:
            imageOrientation = UIImageOrientationRight;

            break;
            
        case UIImageOrientationUp:
            imageOrientation = UIImageOrientationUpMirrored;
            break;
        
        case UIImageOrientationUpMirrored:
            imageOrientation = UIImageOrientationUp;
            break;
        default:
            break;
    }
    
    resultImage = [UIImage imageWithCGImage:sourceImage.CGImage scale:sourceImage.scale orientation:imageOrientation];

Solution 10 - Ios

For Swift 3/4:

imageView.transform = CGAffineTransform(scaleX: -1, y: 1)

Solution 11 - Ios

A simple extension.

extension UIImage {

    var flipped: UIImage {
        guard let cgImage = cgImage else {
            return self
        }
    
        return UIImage(cgImage: cgImage, scale: scale, orientation: .upMirrored)
    }
}

Usage:

let image = #imageLiteral(resourceName: "imageName")
let imageView = UIImageView(image: image.flipped)

Solution 12 - Ios

This is a working iOS8/9 compatible version:

UIImage *image = [UIImage imageNamed:name];

if ([[UIApplication sharedApplication] userInterfaceLayoutDirection] == UIUserInterfaceLayoutDirectionRightToLeft) {
    
    if ([image respondsToSelector:@selector(imageFlippedForRightToLeftLayoutDirection)]) {
        //iOS9
        image = image.imageFlippedForRightToLeftLayoutDirection;
    }
    else {
        //iOS8
        CIImage *coreImage = [CIImage imageWithCGImage:image.CGImage];
        coreImage = [coreImage imageByApplyingTransform:CGAffineTransformMakeScale(-1, 1)];
        image = [UIImage imageWithCIImage:coreImage scale:image.scale orientation:UIImageOrientationUp];
    }
}

return image;

Solution 13 - Ios

Tested in Swift 3 and above

Here is the simple solution to achieve this problem with extensions. I test it and it worked. You can mirror in any direction.

extension UIImage {

    func imageUpMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .upMirrored)
    }

    func imageDownMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .downMirrored)
    }

    func imageLeftMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .leftMirrored)
    }

    func imageRightMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .rightMirrored)
    }
}

Usage for this code

let image = #imageLiteral(resourceName: "imageName")
flipHorizontally = image.imageUpMirror()

So on, You can use other functions.

Solution 14 - Ios

Here's one of the answers above modified and in Swift 3 that i found particularly useful when you have a button that needs to keep flipping the image back and forth.

func flipImage(sourceImage: UIImage,orientation: UIImageOrientation) -> UIImage {
        
        
        var imageOrientation = orientation
        
        switch sourceImage.imageOrientation {
     
        case UIImageOrientation.down:
            imageOrientation = UIImageOrientation.downMirrored;
            break;
            
        case UIImageOrientation.downMirrored:
            imageOrientation = UIImageOrientation.down;
            break;
            
        case UIImageOrientation.left:
            imageOrientation = UIImageOrientation.leftMirrored;
            break;
            
        case UIImageOrientation.leftMirrored:
            imageOrientation = UIImageOrientation.left;
            
            break;
            
        case UIImageOrientation.right:
            imageOrientation = UIImageOrientation.rightMirrored;
            
            break;
            
        case UIImageOrientation.rightMirrored:
            imageOrientation = UIImageOrientation.right;
            
            break;
            
        case UIImageOrientation.up:
            imageOrientation = UIImageOrientation.upMirrored;
            break;
            
        case UIImageOrientation.upMirrored:
            imageOrientation = UIImageOrientation.up;
            break;
            

        }
        
        
        return UIImage(cgImage: sourceImage.cgImage!, scale: sourceImage.scale, orientation: imageOrientation)
        
    }

Use:

imageToFlip: UIImage = flipImage(sourceImage: imageToFlip, orientation: imageToFlip.imageOrientation)

Solution 15 - Ios

aroth's answer in SWIFT 3:

let sourceImage = UIImage(named: "whatever.png")!
let flippedImage = UIImage(cgImage: sourceImage.cgImage!, scale: sourceImage.scale, orientation: .upMirrored)

Solution 16 - Ios

Swift 4

yourImage.transform = CGAffineTransform(scaleX: -1, y: 1)

Solution 17 - Ios

Due to unwrapping do the following:

let srcImage = UIImage(named: "myimage")!
let flippedImage = UIImage(cgImage: srcImage.cgImage!, 
                   scale: srcImage.scale, orientation: UIImage.Orientation.upMirrored)


     

Solution 18 - Ios

you can rotate the image as you want using this

SWIFT 4

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: CGPoint.zero, size: size))
    let t = CGAffineTransform(rotationAngle: degreesToRadians(degrees));
    rotatedViewBox.transform = t
    let rotatedSize = rotatedViewBox.frame.size
    
    // Create the bitmap context
    UIGraphicsBeginImageContext(rotatedSize)
    let bitmap = UIGraphicsGetCurrentContext()!
    
    bitmap.translateBy(x: rotatedSize.width / 2.0, y: rotatedSize.height / 2.0)
    // 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
    bitmap.rotate(by: degreesToRadians(degrees))
   // CGContextRotateCTM(bitmap, degreesToRadians(degrees));
    
    // Now, draw the rotated/scaled image into the context
    var yFlip: CGFloat
    
    if(flip){
        yFlip = CGFloat(-1.0)
    } else {
        yFlip = CGFloat(1.0)
    }
    bitmap.scaleBy(x: yFlip, y: -1.0)
    //CGContextScaleCTM(bitmap, yFlip, -1.0)
    bitmap.draw(self.cgImage!, in: CGRect.init(x: -size.width / 2, y: -size.height / 2, width: size.width, height: size.height))
   // CGContextDrawImage(bitmap, CGRectMake(-size.width / 2, -size.height / 2, size.width, size.height), CGImage)
    
    let newImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    
    return newImage
}

}

Solution 19 - Ios

Swift 5 - Xcode 11.5

The best solution for rotates horizontally: Watch this video:

https://m.youtube.com/watch?v=4kSLbuB-MlU

Or use this code:

    
import UIKit
class FirstViewControl: UIViewController {
    @IBOutlet weak var buttonAnim: UIButton!

    @IBAction func ClickOnButtonAnim(_ sender: UIButton) {    
        UIView.transition(with: buttonAnim, duration: 0.4, options: .transitionFlipFromLeft, animation: nil , completion: nil)
    }

}

You can use any ui(button or label or uiview or image) in this animation.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionpradeepaView Question on Stackoverflow
Solution 1 - IosarothView Answer on Stackoverflow
Solution 2 - IosA. AdamView Answer on Stackoverflow
Solution 3 - IosAlexey PodlasovView Answer on Stackoverflow
Solution 4 - IosabanetView Answer on Stackoverflow
Solution 5 - IosHenryView Answer on Stackoverflow
Solution 6 - IosRomanTsopinView Answer on Stackoverflow
Solution 7 - Ioscode4latteView Answer on Stackoverflow
Solution 8 - IosRoman SolodyashkinView Answer on Stackoverflow
Solution 9 - IosSathe_NagarajaView Answer on Stackoverflow
Solution 10 - IosShaked SayagView Answer on Stackoverflow
Solution 11 - IosEric ArmstrongView Answer on Stackoverflow
Solution 12 - IoscapikawView Answer on Stackoverflow
Solution 13 - IosRehan AliView Answer on Stackoverflow
Solution 14 - IosSam BingView Answer on Stackoverflow
Solution 15 - IosmaniaraliView Answer on Stackoverflow
Solution 16 - IosFarisView Answer on Stackoverflow
Solution 17 - IosMike ZrielView Answer on Stackoverflow
Solution 18 - IosMomen ShaheenView Answer on Stackoverflow
Solution 19 - IosOliaPhView Answer on Stackoverflow