I am unable to rotate the image by 90 degrees in swift. I have written below code but there is an error and doesn't compile
func imageRotatedByDegrees(oldImage: UIImage, deg degrees: CGFloat) -> UIImage {
//Calculate the size of the rotated view's containing box for our drawing space
let rotatedViewBox: UIView = UIView(frame: CGRect(x: 0, y: 0, width: oldImage.size.width, height: oldImage.size.height))
let t: CGAffineTransform = CGAffineTransform(rotationAngle: degrees * CGFloat(M_PI / 180))
rotatedViewBox.transform = t
let rotatedSize: CGSize = rotatedViewBox.frame.size
//Create the bitmap context
UIGraphicsBeginImageContext(rotatedSize)
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: rotatedSize.width / 2, y: rotatedSize.height / 2)
//Rotate the image context
bitmap.rotate(by: (degrees * CGFloat(M_PI / 180)))
//Now, draw the rotated/scaled image into the context
bitmap.scaleBy(x: 1.0, y: -1.0)
bitmap.draw(oldImage, in: CGRect(origin: (x: -oldImage.size.width / 2, y: -oldImage.size.height / 2, width: oldImage.size.width, height: oldImage.size.height), size: oldImage.cgImage))
let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return newImage
}
below is the code i am not sure about
bitmap.draw(oldImage, in: CGRect(origin: (x: -oldImage.size.width / 2, y: -oldImage.size.height / 2, width: oldImage.size.width, height: oldImage.size.height), size: oldImage.cgImage))
This is an extension of
UIImage
that targets Swift 4.0 and can rotate just the image without the need for aUIImageView
. Tested successfully that the image was rotated, and not just had its exif data changed.To perform a 180 degree rotation, you can call it like this:
If for whatever reason it fails to rotate, the original image will then be returned.
In Swift 4.2 and Xcode 10.0
If you want to add animation...
Your problem is that you use non-existing initializer for CGRect. If you want to use CGRect(origin:size:), then create origin properly, without width and height parameters. Or remove size parameter and use CGRect(x:y:width:height:).
Just replace this line
with this one:
Your code is not that far off from functional. You can apply the transform as you are doing directly to the bitmap, you don't need an intermediate view:
Also, if you're going to create a function that rotates an image, it is typically good form to include a
clockwise: Bool
parameter that will interpret thedegrees
argument as rotating clockwise or not. The implementation and appropriate conversion to radians I leave to you.Also note that it's a bit hand-wavy on my part to assume that
oldImage.size
is non-zero. If it is, force-unwrappingUIGraphicsGetCurrentContext()!
will probably crash. You should validate theoldImage
's size and if it's invalid just returnoldImage
.In one line: