2014年5月10日土曜日

iOSデバイスの本体の向きの取得、画像ファイルへの設定方法

カメラアプリを作成していて、やたらめったら嵌ったためまとめ。
縦向き・横向きでもきちんと本体向きを維持して画像を保存したかったが難儀した。
デバイスの回転がロックされている場合、簡単には向きが取得できなかった。

・・・なんかデバイスの向きとUIの向きとカメラの向き別らしいんすよ。

デバイスの向きの取得方法

案① 普通にデバイス情報から取得

※回転ロック時は検知できない
   デバイスの向きの設定と取得の方法

案② Notificationを使用して検知・通知

※回転ロック時は検知できない
   iPhone, iPadの画面の向きを検出する方法まとめ
   UIDeviceOrientationからAVCaptureVideoOrientationを決める

案③ モーションセンサーを使って取得する

MotionOrientation
  多分これが一番確実だと思います(棒
  本体の回転角度からどの向きになっているか取得するライブラリ。
  Apache Licence2.0だそうです。
  実際に取り込んでみて、回転ロック時・非ロック時に期待の挙動となることを確認できました。
  

画像ファイルへの設定方法

以下を参考に、Exif情報に向きを付与します。
iPhoneやiPadで撮影した画像を他のデバイスで見ると自動で回転してしまう場合の対処法



Exif情報の扱いは過去記事参照で。

switch (orientation) {
        case UIDeviceOrientationPortrait:
            LOG_I(UIDeviceOrientationPortrait);
            [metadataAsMutable setObject:[NSNumber numberWithInt:1]
                                  forKey:(NSString *)kCGImagePropertyOrientation];
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            LOG_I(UIDeviceOrientationPortraitUpsideDown);
            [metadataAsMutable setObject:[NSNumber numberWithInt:3]
                                  forKey:(NSString *)kCGImagePropertyOrientation];
            break;
        case UIDeviceOrientationLandscapeLeft:
            LOG_I(UIDeviceOrientationLandscapeLeft);
            [metadataAsMutable setObject:[NSNumber numberWithInt:8]
                                  forKey:(NSString *)kCGImagePropertyOrientation];
            break;
        case UIDeviceOrientationLandscapeRight:
            LOG_I(UIDeviceOrientationLandscapeRight);
            [metadataAsMutable setObject:[NSNumber numberWithInt:6]
                                  forKey:(NSString *)kCGImagePropertyOrientation];
            break;
        default:
            LOG_I(orientation);
            break;
    }




0 件のコメント:

コメントを投稿