2016-07-01 14 views
1

私はテーブルビューを持っていて、セルには画像と2つのラベルがあります。私はimagePickerを使って自分のカメラロールから写真を選択し、その写真をセルイメージに入れます。ただし、写真がポートレートモードの写真の場合、画像は90度回転します。ImagePickerを使用しているときにImageViewが回転する

以下のコードでは、投稿はテーブルビューのセルのimageviewに接続するコンセントで、UIImagePickerControllerを初期化しました。ここで

class MakePostVC: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

@IBOutlet weak var postImg: UIImageView! 
@IBOutlet weak var postTitle: UITextField! 
@IBOutlet weak var postDescrip: UITextField! 

var imgPicker: UIImagePickerController! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    postImg.layer.cornerRadius = 30 
    postImg.clipsToBounds = true 

    imgPicker = UIImagePickerController() 
    imgPicker.delegate = self 

} 

didFinishPickingImageのための私の関数である。

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { 
    imgPicker.dismissViewControllerAnimated(true, completion: nil) 
    postImg.image = image 
} 

私はここSO上で同様の記事を見てきましたが、解決策は動作していないようです。
提案がありますか?

おかげで

答えて

0

あなたはこの記事のように画像を回転させることができます。 https://stackoverflow.com/a/1317194/3928412

も、あなたはそれが好きで取得することができ、デバイスの回転を取得する必要があります:

UIDevice.currentDevice().orientation 
2

UIImageは、名前付きプロパティを構成されていimageOrientation。このプロパティはAppleのマニュアルに記載されています:

画像の向きは、 が描画されたときの画像データの表示方法に影響します。デフォルトでは、画像は「上」の向きで表示されます。ただし、 に画像に関連付けられたメタデータ(EXIF情報など)がある場合、 このプロパティには、そのメタデータが示す方向が含まれます。

だから、このプロパティは、あなたが携帯電話のカメラからの映像を撮るときground.Soに対するカメラの位置を反映するために使用され、それはUIImageimageOrientation財産向きフラグが保存されます。
このプロパティを無視して表示すると、画像が正しい向きで見つからないことがあります。参考のために、カメラが画像を取得してエンコードして表示する方法の下の画像を参照してください。詳細はlinkを確認してください。 enter image description here IOSでこの問題を解決するには


のObjective-C

メイクカテゴリ

UIImage + fixOrientation.h

@interface UIImage (fixOrientation) 

- (UIImage *)fixOrientation; 

@end 

UIImage + fixOrientation。メートル

@implementation UIImage (fixOrientation) 

- (UIImage *)fixOrientation { 

    // No-op if the orientation is already correct 
    if (self.imageOrientation == UIImageOrientationUp) return self; 

    // 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 (self.imageOrientation) { 
     case UIImageOrientationDown: 
     case UIImageOrientationDownMirrored: 
      transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height); 
      transform = CGAffineTransformRotate(transform, M_PI); 
      break; 

     case UIImageOrientationLeft: 
     case UIImageOrientationLeftMirrored: 
      transform = CGAffineTransformTranslate(transform, self.size.width, 0); 
      transform = CGAffineTransformRotate(transform, M_PI_2); 
      break; 

     case UIImageOrientationRight: 
     case UIImageOrientationRightMirrored: 
      transform = CGAffineTransformTranslate(transform, 0, self.size.height); 
      transform = CGAffineTransformRotate(transform, -M_PI_2); 
      break; 
     case UIImageOrientationUp: 
     case UIImageOrientationUpMirrored: 
      break; 
    } 

    switch (self.imageOrientation) { 
     case UIImageOrientationUpMirrored: 
     case UIImageOrientationDownMirrored: 
      transform = CGAffineTransformTranslate(transform, self.size.width, 0); 
      transform = CGAffineTransformScale(transform, -1, 1); 
      break; 

     case UIImageOrientationLeftMirrored: 
     case UIImageOrientationRightMirrored: 
      transform = CGAffineTransformTranslate(transform, self.size.height, 0); 
      transform = CGAffineTransformScale(transform, -1, 1); 
      break; 
     case UIImageOrientationUp: 
     case UIImageOrientationDown: 
     case UIImageOrientationLeft: 
     case UIImageOrientationRight: 
      break; 
    } 

    // Now we draw the underlying CGImage into a new context, applying the transform 
    // calculated above. 
    CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height, 
              CGImageGetBitsPerComponent(self.CGImage), 0, 
              CGImageGetColorSpace(self.CGImage), 
              CGImageGetBitmapInfo(self.CGImage)); 
    CGContextConcatCTM(ctx, transform); 
    switch (self.imageOrientation) { 
     case UIImageOrientationLeft: 
     case UIImageOrientationLeftMirrored: 
     case UIImageOrientationRight: 
     case UIImageOrientationRightMirrored: 
      // Grr... 
      CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage); 
      break; 

     default: 
      CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.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; 
} 

@end 

スウィフト

extension UIImage { 

    func fixOrientation() -> UIImage { 

     // No-op if the orientation is already correct 
     if (self.imageOrientation == UIImageOrientation.Up) { 
      return self; 
     } 

     // 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. 
     var transform: CGAffineTransform = CGAffineTransformIdentity 

     if (self.imageOrientation == UIImageOrientation.Down || self.imageOrientation == UIImageOrientation.DownMirrored) { 
      transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height) 
      transform = CGAffineTransformRotate(transform, CGFloat(M_PI)) 
     } 

     if (self.imageOrientation == UIImageOrientation.Left || self.imageOrientation == UIImageOrientation.LeftMirrored) { 
      transform = CGAffineTransformTranslate(transform, self.size.width, 0) 
      transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2)) 
     } 

     if (self.imageOrientation == UIImageOrientation.Right || self.imageOrientation == UIImageOrientation.RightMirrored) { 
      transform = CGAffineTransformTranslate(transform, 0, self.size.height); 
      transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2)); 
     } 

     if (self.imageOrientation == UIImageOrientation.UpMirrored || self.imageOrientation == UIImageOrientation.DownMirrored) { 
      transform = CGAffineTransformTranslate(transform, self.size.width, 0) 
      transform = CGAffineTransformScale(transform, -1, 1) 
     } 

     if (self.imageOrientation == UIImageOrientation.LeftMirrored || self.imageOrientation == UIImageOrientation.RightMirrored) { 
      transform = CGAffineTransformTranslate(transform, self.size.height, 0); 
      transform = CGAffineTransformScale(transform, -1, 1); 
     } 

     // Now we draw the underlying CGImage into a new context, applying the transform 
     // calculated above. 
     let ctx: CGContextRef = CGBitmapContextCreate(nil, Int(self.size.width), Int(self.size.height), 
                 CGImageGetBitsPerComponent(self.CGImage), 0, 
                 CGImageGetColorSpace(self.CGImage), 
                 CGImageGetBitmapInfo(self.CGImage).rawValue)!; 

     CGContextConcatCTM(ctx, transform) 

     if (self.imageOrientation == UIImageOrientation.Left || 
      self.imageOrientation == UIImageOrientation.LeftMirrored || 
      self.imageOrientation == UIImageOrientation.Right || 
      self.imageOrientation == UIImageOrientation.RightMirrored) { 
      CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage) 
     } else { 
      CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage) 
     } 

     // And now we just create a new UIImage from the drawing context and return it 
     return UIImage(CGImage: CGBitmapContextCreateImage(ctx)!) 
    } 
} 
として拡張してください
関連する問題