美文网首页
聊聊iOS的UIImage的方向(UIImageOrientat

聊聊iOS的UIImage的方向(UIImageOrientat

作者: 0619f9023a02 | 来源:发表于2018-04-07 01:09 被阅读0次

                         

下面是苹果官方关于UIImageOrientation的定义:

typedef NS_ENUM(NSInteger, UIImageOrientation) {

    UIImageOrientationUp,            // default orientation

    UIImageOrientationDown,          // 180 deg rotation

    UIImageOrientationLeft,          // 90 deg CCW

    UIImageOrientationRight,        // 90 deg CW

    UIImageOrientationUpMirrored,    // as above but image mirrored along other axis. horizontal flip

    UIImageOrientationDownMirrored,  // horizontal flip

    UIImageOrientationLeftMirrored,  // vertical flip

    UIImageOrientationRightMirrored, // vertical flip

};

我们一一来看一下上面类型的具体意思:

1、UIImageOrientationUp:

这个很好理解,就是图片前后没有变化

2、UIImageOrientationDown:

通过上面的例子可以看到,意思是图片旋转了180度

3、UIImageOrientationLeft:

通过上面的例子可以看到,意思是图片逆时针旋转了90度

4、UIImageOrientationRight:

通过上面的例子可以看到,意思是图片顺时针旋转了90度

5、UIImageOrientationUpMirrored:

通过上面的例子可以看到,意思是对原图进行了左右镜像,即水平镜像

6、UIImageOrientationDownMirrored:

通过上面的例子可以看到,意思是对旋转了180的图片进行了左右镜像,也可以理解对原图进行了垂直镜像,既上下镜像

7、UIImageOrientationLeftMirrored:

通过上面的例子可以看到,意思是对进行逆时针旋转90度图片做了上下镜像,也可以理解为对进行顺时针旋转90度图片做了左右镜像

8、UIImageOrientationRightMirrored:

通过上面的例子可以看到,意思是对进行顺时针旋转90度图片做了上下镜像。也可以理解为对进行逆时针旋转90度图片做了左右镜像

当具有上面旋转属性的original UIImage在UIImageView上面显示的时候,会按照上面的属性做相应的旋转,这就是为什么有时候拍照的时候照片看起来方向是正确的,但拍出来的照片显示时候被旋转了90度,因为照片的方向属性是UIImageOrientationRight,这就需要对照片的方向进行纠正:

/** 纠正图片的方向 */

- (UIImage *)fixUIImageOrientation:(UIImage *)originalImage

{

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

    // We need to calculate the proper transformation to make the image upright.

    // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.

    CGAffineTransform transform = CGAffineTransformIdentity;

    switch (originalImage.imageOrientation)

    {

        case UIImageOrientationDown:

        case UIImageOrientationDownMirrored:

            transform = CGAffineTransformTranslate(transform, originalImage.size.width, originalImage.size.height);

            transform = CGAffineTransformRotate(transform, M_PI);

            break;

        case UIImageOrientationLeft:

        case UIImageOrientationLeftMirrored:

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

            transform = CGAffineTransformRotate(transform, M_PI_2);

            break;

        case UIImageOrientationRight:

        case UIImageOrientationRightMirrored:

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

            transform = CGAffineTransformRotate(transform, -M_PI_2);

            break;

        case UIImageOrientationUp:

        case UIImageOrientationUpMirrored:

            break;

    }

    switch (originalImage.imageOrientation)

    {

        case UIImageOrientationUpMirrored:

        case UIImageOrientationDownMirrored:

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

            transform = CGAffineTransformScale(transform, -1, 1);

            break;

        case UIImageOrientationLeftMirrored:

        case UIImageOrientationRightMirrored:

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

            transform = CGAffineTransformScale(transform, -1, 1);

            break;

        case UIImageOrientationUp:

        case UIImageOrientationDown:

        case UIImageOrientationLeft:

        case UIImageOrientationRight:

            break;

    }

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

    // calculated above.

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

                                            CGImageGetBitsPerComponent(self.CGImage), 0,

                                            CGImageGetColorSpace(self.CGImage),

                                            CGImageGetBitmapInfo(self.CGImage));

    CGContextConcatCTM(ctx, transform);

    switch (originalImage.imageOrientation)

    {

        case UIImageOrientationLeft:

        case UIImageOrientationLeftMirrored:

        case UIImageOrientationRight:

        case UIImageOrientationRightMirrored:

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

            break;

        default:

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

            break;

    }

    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);

    UIImage *img = [UIImage imageWithCGImage:cgimg];

    CGContextRelease(ctx);

    CGImageRelease(cgimg);

    return img;

}

相关文章

网友评论

      本文标题:聊聊iOS的UIImage的方向(UIImageOrientat

      本文链接:https://www.haomeiwen.com/subject/yzjehftx.html