Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to rotate an image 90 degrees on iOS?

What I want to do is take a snapshot from my camera , send it to a server and then the server sends me back the image on a viewController. If the image is in portrait mode the image appears well on screen , however if the image was taken in landscape mode the image appears streched on the screen(as it tries to appear on portrait mode!). I dont know how to fix this but i guess one solution is first to check if the image is in portrait/landscape mode and then if it is on landscape mode rotate it by 90degrees before showing it on screen. So how could i do that?

like image 736
user1511244 Avatar asked Jul 26 '12 10:07

user1511244


11 Answers

self.imageview.transform = CGAffineTransformMakeRotation(M_PI_2);

Swift 4+:

self.imageview.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi/2))
like image 109
mandeep-dhiman Avatar answered Sep 28 '22 07:09

mandeep-dhiman


This is the complete code for rotation of image to any degree just add it to appropriate file ie in .m as below where you want to use the image processing

for .m

@interface UIImage (RotationMethods)
- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees;
@end

@implementation UIImage (RotationMethods)

static CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;};

- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees 
{   
    // calculate the size of the rotated view's containing box for our drawing space
    UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.width, self.size.height)];
    CGAffineTransform t = CGAffineTransformMakeRotation(DegreesToRadians(degrees));
    rotatedViewBox.transform = t;
    CGSize rotatedSize = rotatedViewBox.frame.size;

    // Create the bitmap context
    UIGraphicsBeginImageContext(rotatedSize);
    CGContextRef bitmap = UIGraphicsGetCurrentContext();

    // Move the origin to the middle of the image so we will rotate and scale around the center.
    CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);

    //   // Rotate the image context
    CGContextRotateCTM(bitmap, DegreesToRadians(degrees));

    // Now, draw the rotated/scaled image into the context
    CGContextScaleCTM(bitmap, 1.0, -1.0);
    CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), [self CGImage]);

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;

}

@end

This is the code snippet form apple's SquareCam example.

To call the above method just use the below code

UIImage *rotatedSquareImage = [square imageRotatedByDegrees:rotationDegrees];

Here the square is one UIImage and rotationDegrees is one flote ivar to rotate the image that degrees

like image 36
The iOSDev Avatar answered Sep 28 '22 08:09

The iOSDev


Swift 3 and Swift 4 use .pi instead

eg:

//rotate 90 degrees
myImageView.transform = CGAffineTransform(rotationAngle: .pi / 2)

//rotate 180 degrees
myImageView.transform = CGAffineTransform(rotationAngle: .pi)

//rotate 270 degrees
myImageView.transform = CGAffineTransform(rotationAngle: .pi * 1.5)
like image 43
Jesus Rodriguez Avatar answered Sep 28 '22 07:09

Jesus Rodriguez


- (UIImage *)rotateImage:(UIImage*)image byDegree:(CGFloat)degrees 
{   
    UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,image.size.width, image.size.height)];
    CGAffineTransform t = CGAffineTransformMakeRotation(DegreesToRadians(degrees));
    rotatedViewBox.transform = t;
    CGSize rotatedSize = rotatedViewBox.frame.size;
    [rotatedViewBox release];

    UIGraphicsBeginImageContext(rotatedSize);
    CGContextRef bitmap = UIGraphicsGetCurrentContext();


    CGContextTranslateCTM(bitmap, rotatedSize.width, rotatedSize.height);

    CGContextRotateCTM(bitmap, DegreesToRadians(degrees));


    CGContextScaleCTM(bitmap, 1.0, -1.0);
    CGContextDrawImage(bitmap, CGRectMake(-image.size.width, -image.size.height, image.size.width, image.size.height), [image CGImage]);

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;

}
like image 21
janusfidel Avatar answered Sep 28 '22 07:09

janusfidel


Simply add this code to the image.

Image.transform=CGAffineTransformMakeRotation(M_PI / 2);
like image 21
IronManGill Avatar answered Sep 28 '22 09:09

IronManGill


I got an error trying this in XCode 6.3 Swift 1.2

self.imageview.transform = CGAffineTransformMakeRotation(M_PI_2);

You should try this to force type cast fix:

self.imageview.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2));

Swift 4 Edit

imageview.transform = CGAffineTransform(rotationAngle: .pi/2)
like image 21
mattyU Avatar answered Sep 28 '22 07:09

mattyU


Swift 3 version:

imageView.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_2))
like image 22
Dhruv Khatri Avatar answered Sep 28 '22 08:09

Dhruv Khatri


Swift 4+.

arrowImageView.transform = CGAffineTransform(rotationAngle: .pi/2)

Note: angle is in radian

.pi = 180 degree

.pi/2 = 90 degree

If you want to add with animation

  @IBAction func applyTransForm(sender: UIButton) {
        sender.isSelected = !sender.isSelected
        UIView.animate(withDuration: 1, animations: {
        if sender.isSelected {
            self.arrowImageView.transform = CGAffineTransform(rotationAngle: .pi)
        } else {
            self.arrowImageView.transform = CGAffineTransform(rotationAngle: 0)

        }
        })
    }

Output:

enter image description here

like image 40
Jack Avatar answered Sep 28 '22 07:09

Jack


Swift 4 | Xcode 9 syntax (please note that this code rotates a UIImageView 90 degrees clockwise, not a UIImage):

myImageView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 2))
like image 21
Frank Eno Avatar answered Sep 28 '22 07:09

Frank Eno


 func imageRotatedByDegrees(oldImage: UIImage, deg degrees: CGFloat) -> UIImage {

    let size = oldImage.size
    UIGraphicsBeginImageContext(size)

    let bitmap: CGContext = UIGraphicsGetCurrentContext()!
    //Move the origin to the middle of the image so we will rotate and scale around the center.
    bitmap.translateBy(x: size.width / 2, y: size.height / 2)
    //Rotate the image context
    bitmap.rotate(by: (degrees * CGFloat(Double.pi / 180)))
    //Now, draw the rotated/scaled image into the context
    bitmap.scaleBy(x: 1.0, y: -1.0)

    let origin = CGPoint(x: -size.width / 2, y: -size.width / 2)

    bitmap.draw(oldImage.cgImage!, in: CGRect(origin: origin, size: size))

    let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return newImage

}

Use of function

imageRotatedByDegrees(oldImage: yourImage, deg: degree) 
like image 26
urvashi bhagat Avatar answered Sep 28 '22 09:09

urvashi bhagat


Doing it in the Image Level, in Swift 5:

extension UIImage{
    
    
    func imageRotated(by radian: CGFloat) -> UIImage{
        
        let rotatedSize = CGRect(origin: .zero, size: size)
            .applying(CGAffineTransform(rotationAngle: radian))
            .integral.size
        UIGraphicsBeginImageContext(rotatedSize)
        if let context = UIGraphicsGetCurrentContext() {
            let origin = CGPoint(x: rotatedSize.width / 2.0,
                                 y: rotatedSize.height / 2.0)
            context.translateBy(x: origin.x, y: origin.y)
            context.rotate(by: radian)
            draw(in: CGRect(x: -origin.y, y: -origin.x,
                            width: size.width, height: size.height))
            let rotatedImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()

            return rotatedImage ?? self
        }

        return self

    }
}
like image 29
dengApro Avatar answered Sep 28 '22 07:09

dengApro