上传到服务器的iOS UIImage旋转

上传到服务器的iOS UIImage旋转

问题描述:

我正在使用以下代码将图像发送到Web服务器。它的工作原理是,图片在上传时出于某种原因旋转。上传到服务器的iOS UIImage旋转

这里是我的上传方式:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 

     [self dismissViewControllerAnimated:YES completion:nil]; 

     NSData *image = UIImageJPEGRepresentation([info objectForKey:UIImagePickerControllerOriginalImage], 0.1); 

     // use token with url for json data from contents of url 
     NSString *savedValue = [[NSUserDefaults standardUserDefaults] 
           stringForKey:@"token"]; 

     NSString *urlString = [NSString stringWithFormat:@"%@%@/photos?token=%@", kIDURLPhoto, listingId, savedValue]; 

     NSLog(@"urlstring for comment is %@",urlString); 

     self.flUploadEngine = [[fileUploadEngine alloc] initWithHostName:urlString customHeaderFields:nil]; 

     NSMutableDictionary *postParams = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"image", @"caption", nil]; 

     self.flOperation = [self.flUploadEngine postDataToServer:postParams path:nil]; 
     [self.flOperation addData:image forKey:@"picture" mimeType:@"image/jpeg" fileName:@"upload.jpg"]; 

     [self.flOperation addCompletionHandler:^(MKNetworkOperation* operation) { 
      NSLog(@"%@", [operation responseString]); 

    //   handle a successful 200 response 

     [self.flUploadEngine enqueueOperation:self.flOperation]; 

     // for iOS7 
     if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) { 

      [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
     } 

     [self forceReload]; 

    } 
+0

难道ü尝试保存图像磁盘看看图片的样子是怎样的? – satheeshwaran

+2

这是你面临的问题的确切原因。 http://*.com/a/10601175/1030951 – HarshIT

银行代码3.0:Image Orientation 3.0

目标C代码:

-(UIImage *)scaleAndRotateImage:(UIImage *)image{ 
     // No-op if the orientation is already correct 
     if (image.imageOrientation == UIImageOrientationUp) return image; 

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

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

      case UIImageOrientationRight: 
      case UIImageOrientationRightMirrored: 
       transform = CGAffineTransformTranslate(transform, 0, image.size.height); 
       transform = CGAffineTransformRotate(transform, -M_PI_2); 
       break; 
      case UIImageOrientationUp: 
      case UIImageOrientationUpMirrored: 
       break; 
     } 

     switch (image.imageOrientation) { 
      case UIImageOrientationUpMirrored: 
      case UIImageOrientationDownMirrored: 
       transform = CGAffineTransformTranslate(transform, image.size.width, 0); 
       transform = CGAffineTransformScale(transform, -1, 1); 
       break; 

      case UIImageOrientationLeftMirrored: 
      case UIImageOrientationRightMirrored: 
       transform = CGAffineTransformTranslate(transform, image.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, image.size.width, image.size.height, 
               CGImageGetBitsPerComponent(image.CGImage), 0, 
               CGImageGetColorSpace(image.CGImage), 
               CGImageGetBitmapInfo(image.CGImage)); 
     CGContextConcatCTM(ctx, transform); 
     switch (image.imageOrientation) { 
      case UIImageOrientationLeft: 
      case UIImageOrientationLeftMirrored: 
      case UIImageOrientationRight: 
      case UIImageOrientationRightMirrored: 
       // Grr... 
       CGContextDrawImage(ctx, CGRectMake(0,0,image.size.height,image.size.width), image.CGImage); 
       break; 

      default: 
       CGContextDrawImage(ctx, CGRectMake(0,0,image.size.width,image.size.height), image.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; 
} 

使用的代码

UIImage *img=[info objectForKey:UIImagePickerControllerOriginalImage]; 

img=[self scaleAndRotateImage:img]; 
NSData *image = UIImageJPEGRepresentation(img, 0.1); 
+0

你检查了我的答案? –

+0

这完全没有必要。服务器应解码EXIF数据并以正确的方向显示图像。 –

+0

@DavidCaunt我使用此代码解决了此问题,所以我给出了建议 –

最可能的是你没有考虑到EXIF数据,他们给相机的旋转,你应该将它们添加到图像EXIF字典。通过这种方式,当您打开图像时,阅读软件可以相应地旋转图像。勾选此question and relative answers,这将有助于