关于UIImage方向的坑--imageOrientation
2017-05-31 22:39
204 查看
最近几天项目用到了关于照片选择和照相机获取图片,出现了一个关于方向的bug,就是在本地展示的时候是正常方向展示的图片,但是上传后却发现照片向右旋转了90度,然后上网各种查资料,终于找到了一个大概的解决方案.
UIImage有一个imageOrientation的属性,主要作用是控制image的绘制方向,共有以下8中方向:
(UIImage *)imageWithCGImage:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation NS_AVAILABLE_IOS(4_0);
该方面使用一个CGImageRef创建UIImage,在创建时还可以指定方法倍数以及旋转方向。当scale设置为1的时候,新创建的图像将和原图像尺寸一摸一样,而orientaion则可以指定新的图像的绘制方向。
下面是个解决应用图片旋转或颠倒的bug:
UIImage有一个imageOrientation的属性,主要作用是控制image的绘制方向,共有以下8中方向:
//UIImageOrientation的定义,定义了如下几种变换 typedef enum { 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 } UIImageOrientation;
(UIImage *)imageWithCGImage:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation NS_AVAILABLE_IOS(4_0);
该方面使用一个CGImageRef创建UIImage,在创建时还可以指定方法倍数以及旋转方向。当scale设置为1的时候,新创建的图像将和原图像尺寸一摸一样,而orientaion则可以指定新的图像的绘制方向。
下面是个解决应用图片旋转或颠倒的bug:
+ (UIImage *)fixOrientation:(UIImage *)aImage { // No-op if the orientation is already correct if (aImage.imageOrientation == UIImageOrientationUp) return aImage; // 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 (aImage.imageOrientation) { case UIImageOrientationDown: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height); transform = CGAffineTransformRotate(transform, M_PI); break; case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: transform = CGAffineTransformTranslate(transform, aImage.size.width, 0); transform = CGAffineTransformRotate(transform, M_PI_2); break; case UIImageOrientationRight: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, 0, aImage.size.height); transform = CGAffineTransformRotate(transform, -M_PI_2); break; default: break; } switch (aImage.imageOrientation) { case UIImageOrientationUpMirrored: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform, aImage.size.width, 0); transform = CGAffineTransformScale(transform, -1, 1); break; case UIImageOrientationLeftMirrored: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, aImage.size.height, 0); transform = CGAffineTransformScale(transform, -1, 1); break; default: break; } // Now we draw the underlying CGImage into a new context, applying the transform // calculated above. CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height, CGImageGetBitsPerComponent(aImage.CGImage), 0, CGImageGetColorSpace(aImage.CGImage), CGImageGetBitmapInfo(aImage.CGImage)); CGContextConcatCTM(ctx, transform); switch (aImage.imageOrientation) { case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: case UIImageOrientationRight: case UIImageOrientationRightMirrored: // Grr... CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage); break; default: CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.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; }
相关文章推荐
- 关于UIImagePickerViewController拍摄video的分辨率和方向的一些代码整理
- 关于UIImage方向的坑--->imageOrientation
- 关于嵌入式系统方向
- 关于 .NET 方向较为深入的书籍
- 同济大学软件学院院长谈择业—关于嵌入式方向 [ZZ]
- 关于 .NET 方向较为深入的书籍
- 关于lucene发展和多语言实现的方向(转载)
- 关于方向
- 关于嵌入式系统方向(转)
- (轉貼) 关于程序职业的几个方向 (Misc)
- 关于嵌入式系统方向
- 关于目前的方向
- 关于本Blog内容的声明、今后的发展方向及Teddy的其他相关站点
- 关于嵌入式系统方向
- 关于嵌入式系统方向
- 关于本Blog内容的声明、今后的发展方向及Teddy的其他相关站点
- 关于发展方向
- 关于未来操作系统方向的初步设想
- 同济大学软件学院院长谈择业——关于嵌入式方向
- 关于嵌入式系统方向