场景
- 1.在调用系统UIImagePickerController拍照,竖着拍照,然后获取UIImage原图,上传到服务器发现,图片逆时针旋转了90度。
- 2.在调用系统UIImagePickerController的相册,选择的是竖的图片,然后获取UIImage原图,上传到服务器发现,发现图片也逆时针旋转了90度。
- tip:
1.在用相册和拍照时候,UIImagePickerController的allowsEditing没有设置为YES.两者取用的都是UIImagePickerControllerOriginalImage原始图片。
2.如果UIImagePickerController的allowsEditing设置为YES,而且图片取的是UIImagePickerControllerEditedImage,就不会出现图片的旋转问题
如下图使用的图片。
问题图片:
开始的代码
# pragma mark ------ 拍照相册的代理 ----
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
[picker dismissViewControllerAnimated:YES completion:^{
}];
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
self.imageview.image = image;
self.isSelectPhoto=YES;
self.updateImage.hidden = NO;
[self updateCreateBtnStatus];
}
问题排查
选取的image直接 在UIImageView 上显示,方向没有问题,相册中,也没有问题。
但是将image写到沙盒目录下,就会出现上图旋转的问题,如果把这个图上传给服务器,后台看到的图片也就有问题。进而下次再从服务器获取的时候展示就有问题。
首先,将image写到沙盒目录的时候,对image没有做任何修改,这一步肯定没问题。
那就是image本身的问题,发现image有imageOrientation的只读属性,对应的UIImageOrientation是枚举类型,如下:
typedef NS_ENUM(NSInteger, UIImageOrientation) {
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
};
- 打印image.imageOrientation
NSLog(@"%ld",(long)image.imageOrientation);
打印输出
image.imageOrientation
.发现.
1.
横向
拍照获取的imageOrientation
输出是0,对应的枚举是UIImageOrientationUp
。竖着
拍照获取的imageOrientation
输出是3,对应的枚举是UIImageOrientationRight
。
2.如果把
imagePickerController.allowsEditing = YES;图片取的是UIImagePickerControllerEditedImage,
结果打印的就是横向
拍照获取的imageOrientation
输出是3,对应的枚举是UIImageOrientationRight
。竖着
拍照获取的imageOrientation
输出是0,对应的枚举是UIImageOrientationtUP
。
3.如果把
imagePickerController.allowsEditing = YES;图片取的是UIImagePickerControllerOriginalImage,
结果打印的就是横向
拍照获取的imageOrientation
输出是0,对应的枚举是UIImageOrientationUP
。竖着
拍照获取的imageOrientation
输出是3,对应的枚举是UIImageOrientationRight
。
按照我们的意愿正常应该是
竖着
拍照获取的imageOrientation
输出是0,对应的枚举是UIImageOrientationUP
。横向
拍照获取的imageOrientation
输出是3,对应的枚举是UIImageOrientationRight
。综上那这应该就是问题所在了。竖着拍照返回来的image的方向默认就是已经逆时针旋转了90度,我们在往沙盒写入之前就需要将image调整过来。
解决后的代码
# pragma mark ------ 拍照相册的代理 ----
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
[picker dismissViewControllerAnimated:YES completion:^{
}];
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
// 解决图片偏转90度的问题
if(image.imageOrientation!=UIImageOrientationUp){
UIGraphicsBeginImageContext(image.size);
[image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
self.imageview.image = image;
self.isSelectPhoto=YES;
self.updateImage.hidden = NO;
[self updateCreateBtnStatus];
}