使用相机拍照获取图片后 有时候图像显示旋转
2016-01-30 09:47
513 查看
发现直接拍照获取图片在截取图像的时候不正确,后来发现获取的image 没有设置相机的拍照方向
#import <UIKit/UIKit.h>
@interface UIImage (reviseImage)
+ (UIImage *)image:(UIImage *)image rotation:(UIImageOrientation)orientation;
@end
#import "UIImage+reviseImage.h"
@implementation UIImage (reviseImage)
//改正拍照时图片的方向
+ (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.width, image.size.height);
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;
}
@end
根据自己的需求 研究一下CTM变换 修改参数
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;
最后注意 相机在头向右的时候为默认方向 向上的时候为向右偏方向
#import <UIKit/UIKit.h>
@interface UIImage (reviseImage)
+ (UIImage *)image:(UIImage *)image rotation:(UIImageOrientation)orientation;
@end
#import "UIImage+reviseImage.h"
@implementation UIImage (reviseImage)
//改正拍照时图片的方向
+ (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.width, image.size.height);
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;
}
@end
根据自己的需求 研究一下CTM变换 修改参数
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;
最后注意 相机在头向右的时候为默认方向 向上的时候为向右偏方向
相关文章推荐
- 推荐:多线程的实现方式及经典示例
- poj1007
- 杭电2036 多边形面积求解
- 杭电acm 2037贪心算法
- poj 3278 广搜
- hdu 2047(递推)
- iOS ffmpeg 之Linux下搭建rtmp nginx服务器
- 《iOS Human Interface Guidelines》——Edit Menu
- unity3D学习 1
- js使用cookie保存登陆信息
- iOS 牛人博客
- 【Android】AS环境下,在布局中使用android:gravity="left/right"提示使用start/end
- 最短路坑题——贝西回家 uscow2.2.4
- Linux下常用命令总结
- 对struts2的OGNL的理解
- 自作拖拽事件
- 使用Spring实现读写分离(MySQL实现主从复制)
- uva 580
- Yii - data exists update else insert
- cookie的设置、获取和删除封装