let image = board.image!
//水平翻轉
let flipImageOrientation = (image.imageOrientation.rawValue + 4) % 8
let flipImage = UIImage(CGImage: image.CGImage!, scale: image.scale, orientation: UIImageOrientation(rawValue: flipImageOrientation)!)
board.image = flipImage
/******* 另外一種水平鏡像翻轉的寫法 ***********/
//Quartz重繪圖片
let rect = CGRectMake(0, 0, image .size.width , image .size.height);//創建矩形框
//根據size大小創建一個基於位圖的圖形上下文
UIGraphicsBeginImageContext(rect.size)
// UIGraphicsBeginImageContextWithOptions(rect.size, false, 2)
let currentContext = UIGraphicsGetCurrentContext();//獲取當前quartz 2d繪圖環境
CGContextClipToRect(currentContext, rect);//設置當前繪圖環境到矩形框
CGContextRotateCTM(currentContext, CGFloat(M_PI)); //旋轉180度
//平移, 這裏是平移座標系,跟平移圖形是一個道理
CGContextTranslateCTM(currentContext, -rect.size.width, -rect.size.height);
CGContextDrawImage(currentContext, rect, image .CGImage);//繪圖
//翻轉圖片
let drawImage = UIGraphicsGetImageFromCurrentImageContext();//獲得圖片
//垂直翻轉
var flipImageOrientation = (image.imageOrientation.rawValue + 4) % 8
flipImageOrientation += flipImageOrientation%2==0 ? 1 : -1
let flipImage = UIImage(CGImage:image.CGImage!,scale:image.scale,orientation:UIImageOrientation(rawValue: flipImageOrientation)!)
board.image = flipImage
//順時針旋轉
up -> right -> down -> left -> up
//逆時針旋轉
up -> left -> down -> right -> up
這其中的規律能否不用switch 而用rawValue來表示,待明天來繼續研究
- (IBAction)btnClicked:(id)sender {
UIImage * image = _imageView.image;
_imageView.image = nil;
//逆時針
UIImageOrientation orientation = image.imageOrientation;
switch (orientation) {
case UIImageOrientationUp:
orientation = UIImageOrientationLeft;
break;
case UIImageOrientationLeft:
orientation = UIImageOrientationDown;
break;
case UIImageOrientationDown:
orientation = UIImageOrientationRight;
break;
case UIImageOrientationRight:
orientation = UIImageOrientationUp;
break;
default:
break;
}
_imageView.image = [self image:image rotation:orientation];
}
- (UIImage *)image:(UIImage *)image rotation:(UIImageOrientation)orientation
{
long double rotate = 0.0;
CGRect rect;
float translateX = 0;
float translateY = 0;
float scaleX = 1.0;
float scaleY = 1.0;
switch (orientation) {
case UIImageOrientationLeft:
rotate = M_PI_2;
rect = CGRectMake(0, 0, image.size.height, image.size.width);
translateX = 0;
translateY = -rect.size.width;
scaleY = rect.size.width/rect.size.height;
scaleX = rect.size.height/rect.size.width;
break;
case UIImageOrientationRight:
rotate = 3 * M_PI_2;
rect = CGRectMake(0, 0, image.size.height, image.size.width);
translateX = -rect.size.height;
translateY = 0;
scaleY = rect.size.width/rect.size.height;
scaleX = rect.size.height/rect.size.width;
break;
case UIImageOrientationDown:
rotate = M_PI;
rect = CGRectMake(0, 0, image.size.width, image.size.height);
translateX = -rect.size.width;
translateY = -rect.size.height;
break;
default:
rotate = 0.0;
rect = CGRectMake(0, 0, image.size.width, image.size.height);
translateX = 0;
translateY = 0;
break;
}
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
//做CTM變換
CGContextTranslateCTM(context, 0.0, rect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextRotateCTM(context, rotate);
CGContextTranslateCTM(context, translateX, translateY);
CGContextScaleCTM(context, scaleX, scaleY);
//繪製圖片
CGContextDrawImage(context, CGRectMake(0, 0, rect.size.width, rect.size.height), image.CGImage);
UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext();
return newPic;
}