1

Я сделал простое приложение для iOS, которое фотографирует и сохраняет его в библиотеке устройства. Я ожидаю, что изображение пейзажа будет выводиться, но то, что производится камерой, - это ориентация на портретное изображение ландшафта, например 50x100, изображение поворачивается на 90 градусов. Я хотел, чтобы изображение было в пейзаже, и я не уверен, что не так с моим кодом.Swift 3 Выход изображения AVCaptureSession находится в портрете, а не в ландшафте

Мне нужно, чтобы мой слой предварительного просмотра был в ландшафте, поэтому я установил AVCaptureVideoOrientation в желаемую ориентацию.

previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.landscapeRight 

Вот конфигурация:

override func viewWillAppear(_ animated: Bool) { 

    let devices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) 
    for device in devices! { 
     if (device as AnyObject).position == AVCaptureDevicePosition.back { 

      do { 

       let input = try AVCaptureDeviceInput(device: device as! AVCaptureDevice) 

       if (captureSession.canAddInput(input)) { 

        captureSession.sessionPreset = AVCaptureSessionPresetPhoto 
        captureSession.addInput(input) 
        sessionOutput.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG] 


        if (captureSession.canAddOutput(sessionOutput)) { 

         captureSession.addOutput(sessionOutput) 
         captureSession.startRunning() 

         previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
         previewLayer.videoGravity = AVLayerVideoGravityResize 
         previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.landscapeRight 
         previewLayer.frame = self.cameraView.bounds 
         cameraView.layer.addSublayer(previewLayer) 

         previewLayer.position = CGPoint(x: self.cameraView.frame.width/2, y: self.cameraView.frame.height/2) 
         previewLayer.bounds = cameraView.frame 

         cameraView.addSubview(captureBtn) 
         cameraView.addSubview(shutterTimer) 

        } 

       } 

      } catch let err { 

       print(err) 
       return 

      } 

     } 
    } 

} 

Вывод изображения

if let videoConnection = sessionOutput.connection(withMediaType: AVMediaTypeVideo) { 

     sessionOutput.captureStillImageAsynchronously(from: videoConnection, completionHandler: { (buffer, error) in 

      let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer) 
      let image = UIImage(data: imageData!)! 
      UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) 
      print(UIImage(data: imageData!)!) 

     }) 

    } 

ответ

1

Я получил его !, Поэтому, прежде чем сохранять изображения в библиотеку, вы должны установить ориентацию Выходов, основываясь на том, что находится на вашем уровне предварительного просмотра, просто добавив эту строку:

videoConnection.videoOrientation = .landscapeRight 

....

if let videoConnection = sessionOutput.connection(withMediaType: AVMediaTypeVideo) { 
     // set output orientation before saving 
     videoConnection.videoOrientation = .landscapeRight 
     sessionOutput.captureStillImageAsynchronously(from: videoConnection, completionHandler: { (buffer, error) in 

      let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer) 
      let image = UIImage(data: imageData!)! 
      UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)     
     }) 

    }