iOS上传相册图片到服务器端显示位置翻转问题

转载 2015年11月18日 22:08:44

iOS用相机拍摄出来的照片含有EXIF信息,UIImage的imageOrientation属性指的就是EXIF中的orientation信息。因为不是所有的工具都支持方向属性,这其中甚至包含了具有最多用户群体的Windows,所以要在保存之前将照片旋转至正常观看的方向即可,然后直接将最终具有正确方向的照片保存下来。
首先,为 UIImage 创建一个category,其中包含 fixOrientation 方法:

@interface UIImage (fixOrientation)

- (UIImage *)fixOrientation;

@end

@implementation UIImage (fixOrientation)

  - (UIImage *)fixOrientation {

      // No-op if the orientation is already correct
      if (self.imageOrientation == UIImageOrientationUp) return self;

      // 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 (self.imageOrientation) {
         case UIImageOrientationDown:
         case UIImageOrientationDownMirrored:
             transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height);
             transform = CGAffineTransformRotate(transform, M_PI);
             break;

         case UIImageOrientationLeft:
         case UIImageOrientationLeftMirrored:
             transform = CGAffineTransformTranslate(transform, self.size.width, 0);
             transform = CGAffineTransformRotate(transform, M_PI_2);
             break;

         case UIImageOrientationRight:
         case UIImageOrientationRightMirrored:
             transform = CGAffineTransformTranslate(transform, 0, self.size.height);
             transform = CGAffineTransformRotate(transform, -M_PI_2);
             break;
         case UIImageOrientationUp:
         case UIImageOrientationUpMirrored:
             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;
         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, 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;
 }

@end

相关文章推荐

android 客户端通过选择本地相册和拍照上传本地图片到服务器端

关于上传我们可以分三步进行。第一步 就是通过Intent 获取本地相册的访问拿到本地图片的路径或者是通过相机拍摄图片保存本地 (1)这个是通过相机拍照然后保存本地 // 记录文件名 privat...

android webview js交互 调取本地相册(兼容各个版本)并且上传到服务器端。

android webview  js交互,调取本地相册,并且实现上传。             首先我们要理解整个互动过程,在网页webview的的组件是 input输入框,输入类型为file,点击...

PHP Curl post上传图片版本不兼容而引起服务器端接收不到图片问题/考虑 PHP 5.0~5.6 各版本兼容性的 cURL 文件上传

最近做的一个需求,要通过PHP调用cURL,以multipart/form-data格式上传文件。踩坑若干,够一篇文章了。 重要警告 没事不要读PHP的官方中文文档!版本跟不上坑死你! 不同版本...

iOS 相机调用相册打开及图片头像的上传到服务器详解

首先要遵守代理: UIImagePickerControllerDelegate, UINavigationControllerDelegate // 创建 提示 UIAlertCo...

iOS中(相册)摄像头获取的图片上传至服务器被自动旋转了

今天写项目的时候发现, 通过相机(相册)获取到的图片显示是正的,但是上传至服务器后下次从服务器读取就被莫名其妙的旋转了,开始时候以为是服务器的原因,最后原来是我的原因:如果把通过相机获取到的图片,直接...

iOS中(相册)摄像头获取的图片上传至服务器被自动旋转了

今天写项目的时候发现, 通过相机(相册)获取到的图片显示是正的,但是上传至服务器后下次从服务器读取就被莫名其妙的旋转了,开始时候以为是服务器的原因,最后原来是我的原因:如果把通过相机获取到的图片,直接...

iOS 将相册中的图片上传至服务器

在使用app时,从相册中选取图片作为头像是很常用的操作,首先打开相册选择图片,然后将图片保存至本应用的document,最后将document中图片的路径保存至NSUserDefaults和服务器。 ...

.net 服务器端通用图片上传服务

  • 2015年09月11日 15:21
  • 4.85MB
  • 下载

ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结

iphone中图像通常存储在4个地方【相册、应用程序包、沙盒、Internet】,通过这4个源,我们就可以存取应用图片。 相册     iphone的相册包含摄像头胶卷+用户计算机同步的部分...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS上传相册图片到服务器端显示位置翻转问题
举报原因:
原因补充:

(最多只允许输入30个字)