AV基金会的定位是错误的

时间:2016-06-11 19:40:54

标签: ios swift avfoundation

我在Swift iOS 9应用中使用此代码来显示相机:

属性:

@IBOutlet weak var previewView: UIView!

var session: AVCaptureSession!
var input: AVCaptureDeviceInput!
var output: AVCaptureStillImageOutput!
var previewLayer: AVCaptureVideoPreviewLayer?

方法:

func setupSession() {
    session = AVCaptureSession()
    session.sessionPreset = AVCaptureSessionPresetPhoto

    let camera = frontCamera()

    do { input = try AVCaptureDeviceInput(device: camera) } catch { return }

    output = AVCaptureStillImageOutput()
    output.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]

    guard session.canAddInput(input) && session.canAddOutput(output) else { return }

    session.addInput(input)
    session.addOutput(output)

    previewLayer = AVCaptureVideoPreviewLayer(session: session)
    previewLayer!.videoGravity = AVLayerVideoGravityResizeAspectFill
    previewLayer!.frame = previewView.bounds
    previewLayer!.connection?.videoOrientation = .Portrait

    previewView.layer.addSublayer(previewLayer!)

    session.startRunning()
}

func frontCamera() -> AVCaptureDevice! {
    let devices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo)
    for device in devices {
        if (device.position == AVCaptureDevicePosition.Front) {
            return device as! AVCaptureDevice
        }
    }
    return nil
}

捕捉照片

func captureImage() {
    guard let connection = output.connectionWithMediaType(AVMediaTypeVideo) else { return }
    connection.videoOrientation = .Portrait

    output.captureStillImageAsynchronouslyFromConnection(connection) { (sampleBuffer, error) in guard sampleBuffer != nil && error == nil else { return }

        let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
        guard let image = UIImage(data: imageData) else { return }

        self.capturedImage = UIImage().fixOrientationOfImage(image)

        self.performSegueWithIdentifier("capturedSegue", sender: self)
    }
}

将图片旋转90度。为了弥补这一点,我使用了UIImage扩展程序:

import Foundation

extension UIImage {
func fixOrientationOfImage(image: UIImage) -> UIImage? {
    if image.imageOrientation == .Up {
        return image
    }

    // 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 = CGAffineTransformIdentity

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

    switch image.imageOrientation {
    case .UpMirrored, .DownMirrored:
        transform = CGAffineTransformTranslate(transform, image.size.width, 0)
        transform = CGAffineTransformScale(transform, -1, 1)
    case .LeftMirrored, .RightMirrored:
        transform = CGAffineTransformTranslate(transform, image.size.height, 0)
        transform = CGAffineTransformScale(transform, -1, 1)
    default:
        break
    }

    // Now we draw the underlying CGImage into a new context, applying the transform
    // calculated above.
    guard let context = CGBitmapContextCreate(nil, Int(image.size.width), Int(image.size.height), CGImageGetBitsPerComponent(image.CGImage), 0, CGImageGetColorSpace(image.CGImage), CGImageGetBitmapInfo(image.CGImage).rawValue) else {
        return nil
    }

    CGContextConcatCTM(context, transform)

    switch image.imageOrientation {
    case .Left, .LeftMirrored, .Right, .RightMirrored:
        CGContextDrawImage(context, CGRect(x: 0, y: 0, width: image.size.height, height: image.size.width), image.CGImage)
    default:
        CGContextDrawImage(context, CGRect(origin: .zero, size: image.size), image.CGImage)
    }

    // And now we just create a new UIImage from the drawing context
    guard let CGImage = CGBitmapContextCreateImage(context) else {
        return nil
    }

    return UIImage(CGImage: CGImage)
}

}

此代码使肖像照片看起来正确,但镜像风景照片。

这里考虑方向变化的正确方法是什么?

0 个答案:

没有答案