今天遇到個(gè)問題,通過iphone照相上傳的照片,后臺(tái)人員拿到是橫著的。還有,后臺(tái)同事說上傳的圖片是png的,但是實(shí)際上其實(shí)是jpg的,只是后綴名包了一層png。具體為什么,還有待我查查。先說翻轉(zhuǎn)問題,查了一下,解決方法有很多,下面就說一個(gè)給大家。
先說下原因:看論壇中的兄弟說,用相機(jī)拍攝出來的照片含有EXIF信息,UIImage的imageOrientation屬性指的就是EXIF中的orientation信息。
如果我們忽略orientation信息,而直接對(duì)照片進(jìn)行像素處理或者drawInRect等操作,得到的結(jié)果是翻轉(zhuǎn)或者旋轉(zhuǎn)90之后的樣子。這是因?yàn)槲覀儓?zhí)行像素處理或者drawInRect等操作之后,imageOrientaion信息被刪除了,imageOrientaion被重設(shè)為0,造成照片內(nèi)容和imageOrientaion不匹配。
所以,在對(duì)照片進(jìn)行處理之前,先將照片旋轉(zhuǎn)到正確的方向,并且返回的imageOrientaion為0。
下面是代碼實(shí)現(xiàn):
-
(UIImage *)fixOrientation:(UIImage *)aImage {
if (aImage.imageOrientation == UIImageOrientationUp)
return aImage;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;}
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;}
CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
UIImage *img = [UIImage imageWithCGImage:cgimg];
CGContextRelease(ctx);
CGImageRelease(cgimg);
return img;
}
大家粘過去就可以直接用了。
不過有個(gè)問題就是
我是使用的UIImagePickerControllerEditedImage 而非
UIImagePickerControllerOriginalImage 等其他模式,具體原因?yàn)槭裁?,我還真就不知道。
希望對(duì)大家有用。