2017-02-01 2 views
1

이것은 내 카메라의 코드이며, 앞 카메라를 뒤 카메라로 변경합니다. 뒤 카메라로 사진을 찍으면 사진의 방향이 좋습니다 (원본).하지만 사진을 찍으면 앞면 카메라가 나쁜 방향으로 이미지를 얻습니다.UIImageOrientation with camera

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 

} 
} 

어떻게 해결할 수 있습니까?

답변

1

전면 카메라로 찍은 이미지는 미러링됩니다. 그림을 그릴 때 EXIF ​​사전에서 이미지 방향을 가져 오거나 메타 데이터 사전 내에서 전달합니다.
대부분의 경우 JPG 또는 PNG로 전달할 때이 값은 직접 처리하지 않으면 고려되지 않습니다. 가로로 사진을 찍는 경우 비슷한 문제가 발생합니다.
캡처 방법에서 방향을 고정 값으로 강제하는 것으로 보입니다.이를 처리해야합니다.
오래전에 나는 post이라고 썼습니다. 대부분이 objC로 작성 되었더라도 문제를 감지하는 데 도움이 될 수 있다고 생각합니다. 나는 카메라 출력 방향에 대해 몇 가지 실험을 썼다.