当前位置: 动力学知识库 > 问答 > 编程问答 >

ios - How to rotate image in Swift 3?

问题描述:

I am unbale to rotate the image to 90 degree in swift 3.I have written below code but it is having error & can'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 code i am not able to write & do not know what is the issue with it

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))

网友答案:

set ImageView image

ImageView.transform = ImageView.transform.rotated(by: CGFloat(M_PI_2))
网友答案:
 let angle =  CGFloat(M_PI_2)
  let tr = CGAffineTransform.identity.rotated(by: angle)
  ImageView.transform = tr
网友答案:

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:

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(M_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
}

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 the degrees 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-unwrapping UIGraphicsGetCurrentContext()! will probably crash. You should validate the oldImage's size and if it's invalid just return oldImage.

网友答案:

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

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))

with this one:

let rect = CGRect(origin: CGPoint(x: -oldImage.size.width / 2,  y: -oldImage.size.height / 2), size: oldImage.size)
bitmap.draw(oldImage.cgImage!, in: rect)
分享给朋友:
您可能感兴趣的文章:
随机阅读: