Farlanki

旋转UIImage

字数统计: 308阅读时长: 1 min
2016/02/29 Share

创建一个UIImage可以使用以下方法:

1
- initWithCGImage:scale:orientation:

这个方法看起来可以对图片进行旋转,但是这个方法实际上是创建一个传入的CGImage的拷贝,并且把CGImage的imageFlags属性里的imageOrientation改变了.所以对一些无视这个flag的类,例如UIActivityViewController,使用这个方法将得不到正确的效果.处理后的图片在使用某些软件加载的时候也会没有效果.

所以,下面介绍一个从像素上旋转图片的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
func rotateImage(oldImage : UIImage ,byDegree degree: Double) -> UIImage{
let rotatedViewBox = UIView(frame: CGRectMake(0,0,oldImage.size.height,oldImage.size.width))
let t : CGAffineTransform = CGAffineTransformMakeRotation(CGFloat(degree * M_PI / 180.0))
rotatedViewBox.transform = t
//得到已经旋转后图片的尺寸
let rotatedSize = rotatedViewBox.frame.size
//创建一个context并将其设置为current context,尺寸是旋转后图片的尺寸
UIGraphicsBeginImageContext(rotatedSize)

let bitmap = UIGraphicsGetCurrentContext()
//设置context的原点在中心,这样才可以绕中心旋转.
CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2)
//旋转
CGContextRotateCTM(bitmap, CGFloat(degree * M_PI / 180.0))
//因为原点被重新设置,所以(-oldImage.size.height/2, -oldImage.size.width/2)是实际上的开始点.
CGContextDrawImage(bitmap, CGRectMake(-oldImage.ssize.height/2, -oldImage.size.width/2, oldImage.size.height, oldImage.size.width), oldImage.CGImage)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
CATALOG