場景
- 1.在調(diào)用系統(tǒng)UIImagePickerController拍照,豎著拍照,然后獲取UIImage原圖,上傳到服務(wù)器發(fā)現(xiàn)贞盯,圖片逆時針旋轉(zhuǎn)了90度。
- 2.在調(diào)用系統(tǒng)UIImagePickerController的相冊沪饺,選擇的是豎的圖片躏敢,然后獲取UIImage原圖,上傳到服務(wù)器發(fā)現(xiàn)整葡,發(fā)現(xiàn)圖片也逆時針旋轉(zhuǎn)了90度件余。
- tip:
1.在用相冊和拍照時候,UIImagePickerController的allowsEditing沒有設(shè)置為YES.兩者取用的都是UIImagePickerControllerOriginalImage原始圖片遭居。
2.如果UIImagePickerController的allowsEditing設(shè)置為YES啼器,而且圖片取的是UIImagePickerControllerEditedImage,就不會出現(xiàn)圖片的旋轉(zhuǎn)問題
如下圖使用的圖片魏滚。
問題圖片:
開始的代碼
# 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寫到沙盒目錄下芋齿,就會出現(xiàn)上圖旋轉(zhuǎn)的問題腥寇,如果把這個圖上傳給服務(wù)器,后臺看到的圖片也就有問題觅捆。進(jìn)而下次再從服務(wù)器獲取的時候展示就有問題赦役。
首先,將image寫到沙盒目錄的時候栅炒,對image沒有做任何修改掂摔,這一步肯定沒問題术羔。
那就是image本身的問題,發(fā)現(xiàn)image有imageOrientation的只讀屬性乙漓,對應(yīng)的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
.發(fā)現(xiàn).
1.
橫向
拍照獲取的imageOrientation
輸出是0,對應(yīng)的枚舉是UIImageOrientationUp
叭披。豎著
拍照獲取的imageOrientation
輸出是3寥殖,對應(yīng)的枚舉是UIImageOrientationRight
。
2.如果把
imagePickerController.allowsEditing = YES;圖片取的是UIImagePickerControllerEditedImage涩蜘,
結(jié)果打印的就是橫向
拍照獲取的imageOrientation
輸出是3嚼贡,對應(yīng)的枚舉是UIImageOrientationRight
。豎著
拍照獲取的imageOrientation
輸出是0同诫,對應(yīng)的枚舉是UIImageOrientationtUP
粤策。
3.如果把
imagePickerController.allowsEditing = YES;圖片取的是UIImagePickerControllerOriginalImage,
結(jié)果打印的就是橫向
拍照獲取的imageOrientation
輸出是0误窖,對應(yīng)的枚舉是UIImageOrientationUP
掐场。豎著
拍照獲取的imageOrientation
輸出是3,對應(yīng)的枚舉是UIImageOrientationRight
贩猎。
按照我們的意愿正常應(yīng)該是
豎著
拍照獲取的imageOrientation
輸出是0熊户,對應(yīng)的枚舉是UIImageOrientationUP
。橫向
拍照獲取的imageOrientation
輸出是3吭服,對應(yīng)的枚舉是UIImageOrientationRight
嚷堡。綜上那這應(yīng)該就是問題所在了。豎著拍照返回來的image的方向默認(rèn)就是已經(jīng)逆時針旋轉(zhuǎn)了90度艇棕,我們在往沙盒寫入之前就需要將image調(diào)整過來蝌戒。
解決后的代碼
# pragma mark ------ 拍照相冊的代理 ----
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
[picker dismissViewControllerAnimated:YES completion:^{
}];
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
// 解決圖片偏轉(zhuǎn)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];
}