Edited at

カメラで撮影した画像の向きをデバイスに合わせる

More than 3 years have passed since last update.

※画面向き設定をPortraitに固定して、デバイスを横などに向けて撮る時に使うものです。

画面向きを固定しない場合はAVCaptureVideoOrientationを対応させれば良いみたいです。


デバイスの向き取得と対応したUIImageOrientation

CMMotionManaferでデバイスの向きを取得して

画像を生成する際に回転させるためのUIImageOrientationを取得する。

var manager: CMMotionManager!

var photoOrientation: UIImageOrientation!

private func initMotion() {
manager = CMMotionManager()
manager.accelerometerUpdateInterval = 0.01;
let handler:CMAccelerometerHandler = {(data:CMAccelerometerData!, error:NSError!) -> Void in
let x = data.acceleration.x
let y = data.acceleration.y
let z = data.acceleration.z
NSLog("x: %@%.2f", (x < 0 ? "-" : " "), fabs(x))
NSLog("y: %@%.2f", (y < 0 ? "-" : " "), fabs(y))
NSLog("z: %@%.2f", (z < 0 ? "-" : " "), fabs(z))
self.photoOrientation = self.getOrientation(x, y: y)
}
manager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler:handler)
}

private func getOrientation(x: Double, y: Double) -> UIImageOrientation {
var orientation :UIImageOrientation!
if (fabs(x) < 0.5) {
if (y < 0) {
// ホームボタン:下
orientation = UIImageOrientation.Right
} else {
// ホームボタン:上
orientation = UIImageOrientation.Left
}
} else {
if (x < 0) {
// ホームボタン:右
orientation = UIImageOrientation.Up
} else {
// ホームボタン:左
orientation = UIImageOrientation.Down
}
}
return orientation
}


画像の回転

UIImageを回転させる

let result = UIImage(CGImage: image.CGImage, scale: 1.0, orientation: orientation)!


注意

CMMotionManagerはメソッド内にしかスコープのないオブジェクトに格納するとstartAccelerometerUpdatesなどで検知できない。

クラスにメンバ変数として持たせる必要がある。