Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rotating UIImage in Swift

Tags:

ios

swift

uiimage

I'm using Xcode 6.0.1 with Swift. I have a UIImage, and I would like to make another image using the old image as a source, with the new image being rotated in some way... say flipped vertically.

This question was already answered a few months ago. However, that solution doesn't work for me, even though the situation is identical.

When I have

var image = UIImage(CGImage: otherImage.CGImage, scale: 1.0, orientation: .DownMirrored) 

Xcode complains that there's an "Extra argument 'scale' in call". After checking with the Apple documentation, this makes no sense, as that version of the initializer does take those three arguments. Leaving out the scale and orientation arguments does fix the problem, but prevents me from doing the rotation.

The only other reference to this that I can find is this guy, who had the same problem.

What do you think?

I do need this to run on this version of Xcode, so if there's an alternate way to perform the rotation (I haven't found one yet) that would be useful.

like image 963
std_answ Avatar asked Nov 23 '14 18:11

std_answ


People also ask

How do I rotate UIImageView?

Step 1 − Open Xcode→SingleViewApplication→name it RotateImage. Step 2 − Open Main. storyboard, add UIImageView and add 2 buttons as shown below name them ROTATE BY 90 DEGREES AND ROTATE BY 45 DEGREES.

What is the difference between UIImage and UIImageView?

UIImage contains the data for an image. UIImageView is a custom view meant to display the UIImage .

How do you flip an image in IOS Swift?

Swift 5 Solution For anyone wondering, if you want to flip the image vertically just change context. scaleBy(x: -1.0, y: 1.0) to context. scaleBy(x: 1.0, y: -1.0) .


2 Answers

Swift 5 Solution

I wrote Pixel SDK which offers a more powerful solution to this problem, otherwise here is the simplest solution:

extension UIImage {     func rotate(radians: Float) -> UIImage? {         var newSize = CGRect(origin: CGPoint.zero, size: self.size).applying(CGAffineTransform(rotationAngle: CGFloat(radians))).size         // Trim off the extremely small float value to prevent core graphics from rounding it up         newSize.width = floor(newSize.width)         newSize.height = floor(newSize.height)          UIGraphicsBeginImageContextWithOptions(newSize, false, self.scale)         let context = UIGraphicsGetCurrentContext()!          // Move origin to middle         context.translateBy(x: newSize.width/2, y: newSize.height/2)         // Rotate around middle         context.rotate(by: CGFloat(radians))         // Draw the image at its center         self.draw(in: CGRect(x: -self.size.width/2, y: -self.size.height/2, width: self.size.width, height: self.size.height))          let newImage = UIGraphicsGetImageFromCurrentImageContext()         UIGraphicsEndImageContext()          return newImage     } } 

and to use this solution you can do the following

let image = UIImage(named: "image.png")! let newImage = image.rotate(radians: .pi/2) // Rotate 90 degrees 
like image 66
Josh Bernfeld Avatar answered Oct 16 '22 19:10

Josh Bernfeld


Here is a simple extension to UIImage:

//ImageRotation.swift  import UIKit  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: CGPointZero, size: size))         let t = CGAffineTransformMakeRotation(degreesToRadians(degrees));         rotatedViewBox.transform = t         let rotatedSize = rotatedViewBox.frame.size          // Create the bitmap context         UIGraphicsBeginImageContext(rotatedSize)         let 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.0, rotatedSize.height / 2.0);          //   // Rotate the image context         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)         }          CGContextScaleCTM(bitmap, yFlip, -1.0)         CGContextDrawImage(bitmap, CGRectMake(-size.width / 2, -size.height / 2, size.width, size.height), CGImage)          let newImage = UIGraphicsGetImageFromCurrentImageContext()         UIGraphicsEndImageContext()          return newImage     } } 

(Source)

Use it with:

rotatedPhoto = rotatedPhoto?.imageRotatedByDegrees(90, flip: false)  

The former will rotate an image and flip it if flip is set to true.

like image 39
confile Avatar answered Oct 16 '22 20:10

confile