相關(guān)解釋來自這里
原文答案:
If you turned your camera properly when taking the shot, and you use fairly current photo software, rotating sideways pictures is generally not something you should have to worry about in post processing. Most modern cameras have a rotation sensor which writes an orientation EXIF tag into the file to tell your software how to turn the photo for display. You also might want to open the File preferences for Photoshop and check to see if I**gnore EXIF Profile Tag **has been selected.However, there are some situations in which your photo will not be rotated properly and will display sideways.
大致意思是說王浴,現(xiàn)在攝像頭都會有一個方向旋轉(zhuǎn)傳感器宵荒,方向信息作為EXIF信息標(biāo)記到照片當(dāng)中穆壕,憑借此方向信息系統(tǒng)會“知道”如何正確的顯示照片,當(dāng)然有一些情況下创坞,照片無法被正確旋轉(zhuǎn)或者橫向顯示。
由此可知:當(dāng)ImageView
上的圖片橫向顯示或者旋轉(zhuǎn)了其他角度就說明EXIF中的方向標(biāo)簽被重置了极颓,當(dāng)代碼中有處理像素或者裁剪或者重畫圖片的功能很有可能就“抹掉”了EXIF信息中的“方向”標(biāo)簽內(nèi)對應(yīng)的消息湿痢。
對此StackOverflow中找到了OC版本的處理方法。
在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;
}
自己重寫了Swift版本(此段寫于2017/02/06台囱,適用于Swift 3):
在extension中添加
class func fixOrientation(image : UIImage) -> UIImage {
if image.imageOrientation == .up {
return image
}
var transform = CGAffineTransform.identity
switch image.imageOrientation {
case .down,.downMirrored:
transform = transform.translatedBy(x: image.size.width, y: image.size.height)
transform = transform.rotated(by: CGFloat(M_PI))
case .left,.leftMirrored:
transform = transform.translatedBy(x: image.size.width, y: 0)
transform = transform.rotated(by: CGFloat(M_PI_2))
case .right,.rightMirrored:
transform = transform.translatedBy(x: 0, y: image.size.height)
transform = transform.rotated(by: CGFloat(-M_PI_2))
default:
break
}
switch image.imageOrientation {
case .upMirrored, .downMirrored:
transform = transform.translatedBy(x: image.size.width, y: 0)
transform = transform.scaledBy(x: -1, y: 1)
case .leftMirrored, .rightMirrored:
transform = transform.translatedBy(x: image.size.height, y: 0)
transform = transform.scaledBy(x: -1, y: 1)
default:
break
}
let ctx = CGContext(data: nil, width: Int(image.size.width), height: Int(image.size.height), bitsPerComponent: image.cgImage!.bitsPerComponent, bytesPerRow: 0, space: image.cgImage!.colorSpace!, bitmapInfo: image.cgImage!.bitmapInfo.rawValue)
ctx!.concatenate(transform)
switch image.imageOrientation {
case .left,.leftMirrored,.rightMirrored,.right:
ctx?.draw(image.cgImage!, in: CGRect(x :0,y:0,width:image.size.height,height: image.size.width))
default:
ctx?.draw(image.cgImage!, in: CGRect(x :0,y:0,width:image.size.width,height: image.size.height))
}
let cgimg = ctx!.makeImage()
let img = UIImage(cgImage: cgimg!)
return img
}