简体   繁体   English

带摄像头的 UIImageOrientation

[英]UIImageOrientation with camera

This is the code of my camera, change the front camera to the rear camera, if I take a picture with the back camera, the orientation of the photo is good (original), but if i take a photo with the front camera get the image with the bad orientation.这是我相机的代码,把前置摄像头换成后置摄像头,如果我用后置摄像头拍照,照片的方向是好的(原始),但是如果我用前置摄像头拍照得到方向错误的图像。

class TakeSelfieViewController: UIViewController, AVCapturePhotoCaptureDelegate {

var captureSession = AVCaptureSession()
var photoOutput = AVCapturePhotoOutput()
var previewLayer : AVCaptureVideoPreviewLayer?
var captureDevice : AVCaptureDevice?

var sessionOutputSetting = AVCapturePhotoSettings(format: [AVVideoCodecKey:AVVideoCodecJPEG])

var toggle = false

@IBOutlet weak var cameraView: UIView!
@IBOutlet weak var tempImageView: UIImageView!
@IBOutlet weak var adorButton: UIButton!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    previewLayer?.frame = cameraView.bounds

    let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.light)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame = adorButton.bounds
    blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    adorButton.addSubview(blurEffectView)

}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    pickCamera(which: toggle)

}

func pickCamera(which: Bool) {

    if (which == true) {

        let deviceDescovery = AVCaptureDeviceDiscoverySession(deviceTypes: [AVCaptureDeviceType.builtInDualCamera, AVCaptureDeviceType.builtInTelephotoCamera,AVCaptureDeviceType.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.back)

        print("back camera")

        startCamera(deviceDesc: deviceDescovery!)

        toggle = true

    } else if (which == false) {

        let deviceDescovery = AVCaptureDeviceDiscoverySession(deviceTypes: [AVCaptureDeviceType.builtInDualCamera, AVCaptureDeviceType.builtInTelephotoCamera,AVCaptureDeviceType.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: AVCaptureDevicePosition.front)

        print("front camera")

        startCamera(deviceDesc: deviceDescovery!)

        toggle = false

    }

}


func startCamera(deviceDesc: AVCaptureDeviceDiscoverySession!) {

    for device in (deviceDesc.devices)! {


        if device.position == AVCaptureDevicePosition.back {

            do {

                let input = try AVCaptureDeviceInput(device: device)
                if captureSession.canAddInput(input) {
                    captureSession.addInput(input)

                    if captureSession.canAddOutput(photoOutput) {
                        captureSession.addOutput(photoOutput)


                        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                        previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
                        previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait


                        cameraView.layer.addSublayer(previewLayer!)
                        captureSession.startRunning()
                        print("ADD Back")

                    } else { print("Cannot add input - back") }

                }

            } catch {

                print("Error")

            }

        } else if (device.position == AVCaptureDevicePosition.front) {

            do {

                let input = try AVCaptureDeviceInput(device: device)
                print(input)
                if captureSession.canAddInput(input) {

                    captureSession.addInput(input)

                    if captureSession.canAddOutput(photoOutput) {
                        captureSession.addOutput(photoOutput)


                        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                        previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
                        previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait


                        cameraView.layer.addSublayer(previewLayer!)
                        captureSession.startRunning()
                        print("ADD Front")

                }

                } else { print("Cannot add input - front") }

            } catch {

                print(error)

            }
        }
    }
}

func didPressTakePhoto() {
    if let videoConnection = photoOutput.connection(withMediaType: AVMediaTypeVideo) {
        videoConnection.videoOrientation = AVCaptureVideoOrientation.portrait
        let settings = AVCapturePhotoSettings(format: [AVVideoCodecKey : AVVideoCodecJPEG])
        photoOutput.capturePhoto(with: settings, delegate: self)

    }
}

func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) {

    let imageData = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: photoSampleBuffer!, previewPhotoSampleBuffer: previewPhotoSampleBuffer)
    let dataProvider = CGDataProvider(data: imageData as! CFData)
    let cgImageRef = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: CGColorRenderingIntent.defaultIntent)

    let image = UIImage(cgImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.right)
    self.tempImageView.image = image
    self.tempImageView.isHidden = false
    self.yellowButton.isHidden = true
    self.toggleAction.isHidden = true
    self.adorButton.isHidden = true
    print("Hola")
}

var didTakePhoto = Bool()

@IBOutlet weak var yellowButton: UIButton!
@IBOutlet weak var toggleAction: UIButton!

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    if didTakePhoto {
        tempImageView.isHidden = true
        yellowButton.isHidden = false
        toggleAction.isHidden = false
        adorButton.isHidden = false
        didTakePhoto = false
        print("🍊")

    }
}

@IBAction func yellowPressed(_ sender: UIButton) {
    captureSession.startRunning()
    didTakePhoto = true
    didPressTakePhoto()
    print("🐶")
}

@IBAction func toggleCamera(_ sender: Any) {

    if (toggle == false) {

        print("Changing to back camera")

        let currentCameraInput: AVCaptureInput = captureSession.inputs[0] as! AVCaptureInput

        captureSession.removeInput(currentCameraInput)

        toggle = true

        pickCamera(which: toggle)

    } else if (toggle == true) {

        print("Changing to front camera")

        let currentCameraInput: AVCaptureInput = captureSession.inputs[0] as! AVCaptureInput

        captureSession.removeInput(currentCameraInput)

        toggle = false

        pickCamera(which: toggle)

    }

}

override var prefersStatusBarHidden: Bool {

    return true

}
}

How do I solve this?我该如何解决这个问题? 🤔 🤔

Images taken with front camera are mirrored, when you take a picture the image orientation is taken inside the EXIF dictionary of it, or passed inside a dictionary of metadata.使用前置摄像头拍摄的图像是镜像的,当您拍照时,图像方向是在它的 EXIF 字典中获取的,或者在元数据字典中传递。

Most of the time when you pass it around as JPG or PNG this value is not taken into account if you don't deal directly with it.大多数情况下,当您将其作为 JPG 或 PNG 传递时,如果您不直接处理它,则不会考虑此值。 You should experience a similar problem if you take a picture in landscape.如果您在风景中拍照,您应该会遇到类似的问题。

In your capture method, it seems that you are forcing orientation to a fixed value when you should take care of it.在您的捕获方法中,您似乎在应该注意方向时将方向强制为固定值。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM