图像编辑或选取照片后的方向旋转

摘要:
问题描述:选择相册图片或使用相机拍照后,获得的图像旋转90度解决方案:在获取图片之前,调整图像的方向属性结果:正常操作相关函数:CGAffineTransform(transform,x,y):更改位置,CGAffineTransformMakeTranslation(width,0.0);CGAffineTransformRotate(变换,

问题描述:选取相册图片或使用摄像头拍摄图片后,得到的图像旋转90度

解决方法:在获取图片,使用之前,调整图像的方向属性

结果:正常运行

相关函数:

CGAffineTransformTranslate(transform, x, y):改变位置,
CGAffineTransformMakeTranslation(width, 0.0);改变位置,
CGAffineTransformRotate(transform, M_PI);旋转。
CGAffineTransformMakeRotation(-M_PI);旋转的
transform = CGAffineTransformScale(transform, -1.0, 1.0);是缩放的。
?view.transform = CGAffineTransformIdentity;当改变过一个view.transform属性或者view.layer.transform的时候需要恢复默认状态的话,记得先把他们重置可以使用
view.transform = CGAffineTransformIdentity,
或者view.layer.transform = CATransform3DIdentity,
 

 

------------------------------------------------------------------------------------------------------------------------------------------------

扩展UIImage类,增加新方法fixOrientation以使图像回归正确的方向属性

UIImage+fixOrientation.h

#import <UIKit/UIKit.h>

@interface UIImage (fixOrientation)

- (UIImage *)fixOrientation;

@end

 UIImage+fixOrientation.m

 

#import "UIImage+fixOrientation.h"

 

@implementation UIImage (fixOrientation)

- (UIImage *)fixOrientation {

    

    // 如果图像已经是正确方向则不做操作

    if (self.imageOrientation == UIImageOrientationUp) return self;

    

    // 否则执行对应的操作以调整方向

    // 1,旋转 2,翻转

    CGAffineTransform transform = CGAffineTransformIdentity;

    

    switch (self.imageOrientation) {

        case UIImageOrientationDown://方向向下

        case UIImageOrientationDownMirrored://方向下并且被翻转

            transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height);//移动至右下角

            transform = CGAffineTransformRotate(transform, M_PI);//以右下角为圆点旋转180度

            break;//更改结果,方向朝上

            

        case UIImageOrientationLeft://方向向左

        case UIImageOrientationLeftMirrored://方向向左并且翻转

            transform = CGAffineTransformTranslate(transform, self.size.width, 0);//右移width

            transform = CGAffineTransformRotate(transform, M_PI_2);//逆时针旋转90度

            break;

            

        caseUIImageOrientationRight://方向向右

        caseUIImageOrientationRightMirrored://方向向右并且翻转

            transform = CGAffineTransformTranslate(transform, 0, self.size.height);//下移

            transform = CGAffineTransformRotate(transform, -M_PI_2);//顺时针旋转-90度

            break;

    }

    

    switch (self.imageOrientation) {

        case UIImageOrientationUpMirrored://向上镜像

        case UIImageOrientationDownMirrored://向下镜像

            transform = CGAffineTransformTranslate(transform, self.size.width, 0);

            transform = CGAffineTransformScale(transform, -1, 1);//纵向翻转

            break;

            

        case UIImageOrientationLeftMirrored://向左镜像

        case UIImageOrientationRightMirrored:向右镜像

            transform = CGAffineTransformTranslate(transform, self.size.height, 0);

            transform = CGAffineTransformScale(transform, -1, 1);//横向翻转

            break;

    }

    

    // Now we draw the underlying CGImage into a new context, applying the transform

    // calculated above.

    CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height,

                                             CGImageGetBitsPerComponent(self.CGImage), 0,

                                             CGImageGetColorSpace(self.CGImage),

                                             CGImageGetBitmapInfo(self.CGImage));

    CGContextConcatCTM(ctx, transform);

    switch (self.imageOrientation) {

        case UIImageOrientationLeft:

        case UIImageOrientationLeftMirrored:

        case UIImageOrientationRight:

        case UIImageOrientationRightMirrored:

            // Grr...

            CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage);

            break;

            

        default:

            CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage);

            break;

    }

    

    // And now we just create a new UIImage from the drawing context

    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);

    UIImage *img = [UIImage imageWithCGImage:cgimg];

    CGContextRelease(ctx);

    CGImageRelease(cgimg);

    return img;

}

 

 

 

免责声明:文章转载自《图像编辑或选取照片后的方向旋转》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Opencv | 图形学 | Mingw64 | 如何正确地用MinGW64编译与配置vscode的Opencv环境redis集群如何解决重启不了的问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

unity中实现静态的3D对象对其他对象的跟随

using UnityEngine; public class FollowPosition : MonoBehaviour { public Transform targetTrans; public Transform lookAtTrans; public Vector3 offsetPos; //与本跟随者...

(三) ffmpeg filter学习-编写自己的filter

目录 目录 什么是ffmpeg filter 如何使用ffmpeg filter 1 将输入的1920x1080缩小到960x540输出 2 为视频添加logo 3 去掉视频的logo 自己写一个过滤器 filter的结构体 filter_frame调用流程 1 decode_video ffmpegc 2 av_buffersrc_add_fr...

p标签多行文字内容实现上下垂直居中兼容ie8

之前实现上下居中一般都是用height和line-height的来设置。 今天在修改样式的时候,p标签的文字内容可能是一行也可能是两行, 所以用height和line-height就没效果。 今天找到了一种方法,挺好用的。 设置p标签的父元素样式{height, position: relative;} p标签的样式加上 {position: absolu...

CSS(八)-- 变形(过渡、动画、平移、旋转、缩放)

目录 1.过渡(transition) 1.1transition-property:指定执行过渡的属性 1.2transition-duration:执行过渡需要的时间 1.3transition-timing-function:过得的时序函数 通过贝塞尔曲线指定 steps()分步执行过渡效果 1.4 transition-delay:过...

Unity中Instantiate物体失效问题

才开始学Unity,开始总是这样用Instantiate函数: GameObject temp = (GameObject)Instantiate(bulletSource, transform.position, transform.rotation); 然后该类中定义一个共有变量如下: public GameObject bulletSource;...

Unity + NGUI 实现人物头顶UI的信息展示

1、思路:   (1)信息数据:需要展示属性信息   (2)信息的展示:负责显示UI属性信息   (3)UI的跟随:负责实现UI对人物的跟随   (4)UI的管理:负责对UI进行创建于回收,游戏中需要用到UI的地方都是与该脚本的交互。 2、将需要用到的UI资源打到一个图集中,以免出现大量人物的时候图集穿插造成不良的影响。 3、创建一个头顶UI预设,当道对应...