关于UIImage方向的坑--->imageOrientation
2017-05-31 22:25
197 查看
最近,在使用到照相机和相册的过程中暴露的一个坑—–>在本地显示的照片是正常方向展示的,但是上传到服务器展示的照片却整体右转了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
- 关于TDBNavigator->VisibleButtons及TDBGrid->Options属性更新的问题
- <kingofark关于学习C++和编程的50个观点> 详解 - 预览版
- 关于论文的中心方向
- 关于shell命令的定向输出 2>&1
- 同济大学软件学院院长谈择业—关于嵌入式方向
- 关于嵌入式系统方向(转)
- 关于嵌入式系统方向!【转贴】
- 关于嵌入式系统方向
- 同济大学软件学院院长谈择业—关于嵌入式方向 [ZZ]
- 关于开发在线网页编辑器按回车会输入<p>而不是<br>的解决方法
- 关于动态语言的发展和自己的方向
- 关于未来操作系统方向的初步设想
- 关于本Blog内容的声明、今后的发展方向及Teddy的其他相关站点
- UCGIS的Research Agenda(关于GIS的研究方向)
- 关于 .NET 方向较为深入的书籍
- 关于 .NET 方向较为深入的书籍(转)
- 关于嵌入式系统方向
- 关于嵌入式系统方向