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


    问题描述:选取相册图片或使用摄像头拍摄图片后,得到的图像旋转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;
    
    }

     

     

     

  • 相关阅读:
    Django 【第十二篇】Form组件进阶
    Django 【第十一篇】Form组件基础
    前端知识点总结
    vue组件续和前端工程化
    vue组件
    Vue视图下
    Vue实例与渲染
    BootStrap
    jQuery事件与动画
    dom操作 属性操作 样式操作
  • 原文地址:https://www.cnblogs.com/hushuai-ios/p/3669059.html
Copyright © 2020-2023  润新知