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

来源:互联网 发布:gdi高级编程 pdf 编辑:程序博客网 时间:2024/04/30 08:04

今天写项目的时候发现, 通过相机(相册)获取到的图片显示是正的,但是上传至服务器后下次从服务器读取就被莫名其妙的旋转了,开始时候以为是服务器的原因,最后原来是我的原因:如果把通过相机获取到的图片,直接进行操作, 比如裁剪, 缩放, 则会把原图片向右旋转90度。

上网查后也有人说是这个原因:如果该图片大于2M,会自动旋转90度;否则不旋转

//get original photo from iOS photos //如果该图片大于2M,会自动旋转90度;否则不旋转UIImage* originalImg=[dict objectForKey:UIImagePickerControllerOriginalImage];

不知道是否是上边的原因,至于是否正确, 还没确定。 先Mark,哈哈。

下边说下解决方案:用相机拍摄出来的照片含有EXIF信息,UIImage的imageOrientation属性指的就是EXIF中的orientation信息。
如果我们忽略orientation信息,而直接对照片进行像素处理或者drawInRect等操作,得到的结果是翻转或者旋转90之后的样子。这是因为我们执行像素处理或者drawInRect等操作之后,imageOrientaion信息被删除了,imageOrientaion被重设为0,造成照片内容和imageOrientaion不匹配。
所以,在对照片进行处理之前,先将照片旋转到正确的方向,并且返回的imageOrientaion为0。
下面这个方法就是一个UIImage category中的方法,用它可以达到以上目的。

上代码:

- (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;}

上边方法亲自测试用过绝对靠谱。下面截取项目中用此方法的片段:

            UIImageView *aImageView=[[[UIImageView alloc]init]autorelease];            [aImageView setFrame:CGRectMake(INSETS-85, 5, PIC_WIDTH, PIC_HEIGHT)];            aImageView = [addedPicArray objectAtIndex:0];            NSData *imageData = UIImageJPEGRepresentation([self fixOrientation:aImageView.image], 0.1);            // 上传信息至服务器            [self setPlayerImageRequest:imageData];//先上传玩发表的图片,然后在发表文字

经过转后的image上传至服务器就是正常方向了。


0 0
原创粉丝点击