2016-04-04 9 views
3

私はUImagePickerControllerを使ってカメラから画像をキャプチャしています。UIImagePickerController didFinishPickingImageが正しくないimageOrientationを返しました

didFinishPickingImage代理人方法私は間違ったimageOrientationで画像を取得しています。

私がポートレートモードで写真を撮っているときに、imageOrientation = UPの代わりにimageOrientation = RIGHT(rawValue = 3)という正しい画像が返されています。

風景モードで写真を撮ると、正しい画像が戻ってきますが、もう一度正しくないimageOrientation = DOWN

コードからわかるように、私はピッカーから取得するとすぐに画像の向きをチェックしています。他の同様の質問私は戻って正しい画像を取得していますが、imageOrientationは常に間違っているとは異なり

override func viewDidLoad() 
{ 
     picker.sourceType = UIImagePickerControllerSourceType.Camera 
     presentViewController(self.picker, animated: true, completion: nil) 
} 

func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) 
{ 
    print("orientation: \(image.imageOrientation.rawValue)") 
} 

答えて

0

私も同じ問題に直面していました。この関数を使用して解決する:

func fixImageOrientation(src:UIImage)->UIImage { 

if src.imageOrientation == UIImageOrientation.Up { 
    return src 
} 

var transform: CGAffineTransform = CGAffineTransformIdentity 

switch src.imageOrientation { 
case UIImageOrientation.Down, UIImageOrientation.DownMirrored: 
    transform = CGAffineTransformTranslate(transform, src.size.width, src.size.height) 
    transform = CGAffineTransformRotate(transform, CGFloat(M_PI)) 
    break 
case UIImageOrientation.Left, UIImageOrientation.LeftMirrored: 
    transform = CGAffineTransformTranslate(transform, src.size.width, 0) 
    transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2)) 
    break 
case UIImageOrientation.Right, UIImageOrientation.RightMirrored: 
    transform = CGAffineTransformTranslate(transform, 0, src.size.height) 
    transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2)) 
    break 
case UIImageOrientation.Up, UIImageOrientation.UpMirrored: 
    break 
} 

switch src.imageOrientation { 
case UIImageOrientation.UpMirrored, UIImageOrientation.DownMirrored: 
    CGAffineTransformTranslate(transform, src.size.width, 0) 
    CGAffineTransformScale(transform, -1, 1) 
    break 
case UIImageOrientation.LeftMirrored, UIImageOrientation.RightMirrored: 
    CGAffineTransformTranslate(transform, src.size.height, 0) 
    CGAffineTransformScale(transform, -1, 1) 
case UIImageOrientation.Up, UIImageOrientation.Down, UIImageOrientation.Left, UIImageOrientation.Right: 
    break 
} 

let ctx:CGContextRef = CGBitmapContextCreate(nil, Int(src.size.width), Int(src.size.height), CGImageGetBitsPerComponent(src.CGImage), 0, CGImageGetColorSpace(src.CGImage), CGImageAlphaInfo.PremultipliedLast.rawValue)! 

CGContextConcatCTM(ctx, transform) 

switch src.imageOrientation { 
case UIImageOrientation.Left, UIImageOrientation.LeftMirrored, UIImageOrientation.Right, UIImageOrientation.RightMirrored: 
    CGContextDrawImage(ctx, CGRectMake(0, 0, src.size.height, src.size.width), src.CGImage) 
    break 
default: 
    CGContextDrawImage(ctx, CGRectMake(0, 0, src.size.width, src.size.height), src.CGImage) 
    break 
} 

let cgimg:CGImageRef = CGBitmapContextCreateImage(ctx)! 
let img:UIImage = UIImage(CGImage: cgimg) 

return img 
} 
+0

私は画像がすでに正しく回転していると言っているので、これは適切なソリューションではないと私は思わない。メタデータ(imageOrientation)のみが間違っている。 – ade

+1

@EricDの回答が "Swift"で更新されました。ありがとう:) – ivarun

関連する問題