2017-07-20 29 views
1

如何修復使用前置相機鏡像捕獲圖像? SnapChat似乎修復它以及WhatsApp和Instagram,我怎麼能? 我真的很想找到一個解決方案,這...它相當討厭...先謝謝如何修復使用前置相機鏡像捕獲圖像,AVFoundation,Swift

我見過Always seeing Mirror image while capturing from Front Camera iOS 5.0但它翻轉後方照相機和正面的圖像,它不能解決任何人真正的問題。如果任何人都可以幫助我弄清楚如何翻轉前置攝像頭圖像或任何其他解決方案,那將非常棒!

import UIKit 
import AVFoundation 

@available(iOS 10.0, *) 
class CameraViewController: UIViewController,AVCaptureVideoDataOutputSampleBufferDelegate { 

let photoSettings = AVCapturePhotoSettings() 
    var audioPlayer = AVAudioPlayer() 
    var captureSession = AVCaptureSession() 
    var videoDeviceInput: AVCaptureDeviceInput! 
    var previewLayer = AVCaptureVideoPreviewLayer() 
    var frontCamera: Bool = false 
    var captureDevice:AVCaptureDevice! 
    var takePhoto = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

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

    func prepareCamera() { 
     captureSession.sessionPreset = AVCaptureSessionPresetPhoto 

     if let availableDevices = AVCaptureDeviceDiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaTypeVideo, position: .back).devices { 
      captureDevice = availableDevices.first 
      beginSession() 
     } 
    } 

    func frontCamera(_ front: Bool){ 
     let devices = AVCaptureDevice.devices() 

     do{ 
      try captureSession.removeInput(AVCaptureDeviceInput(device:captureDevice!)) 
     }catch{ 
      print("Error") 
     } 

     for device in devices!{ 
      if((device as AnyObject).hasMediaType(AVMediaTypeVideo)){ 
       if front{ 
        if (device as AnyObject).position == AVCaptureDevicePosition.front { 
         captureDevice = device as? AVCaptureDevice 

         do{ 
          try captureSession.addInput(AVCaptureDeviceInput(device: captureDevice!)) 
         }catch{} 
         break 
        } 
       }else{ 
        if (device as AnyObject).position == AVCaptureDevicePosition.back { 
         captureDevice = device as? AVCaptureDevice 

         do{ 
          try captureSession.addInput(AVCaptureDeviceInput(device: captureDevice!)) 
         }catch{} 
         break 
        } 
       } 
      } 
     } 
    } 

    func beginSession() { 
     do { 
      let captureDeviceInput = try AVCaptureDeviceInput(device: captureDevice) 
      if let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) { 
      self.previewLayer = previewLayer 
      containerView.layer.addSublayer(previewLayer as? CALayer ?? CALayer()) 
      self.previewLayer.frame = self.view.layer.frame 
      self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
      previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait 
      captureSession.startRunning() 

      let dataOutput = AVCaptureVideoDataOutput() 
      dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString):NSNumber(value:kCVPixelFormatType_32BGRA)] 

      dataOutput.alwaysDiscardsLateVideoFrames = true 

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

       photoSettings.isHighResolutionPhotoEnabled = true 
       photoSettings.isAutoStillImageStabilizationEnabled = true 
      } 

      captureSession.commitConfiguration() 

      let queue = DispatchQueue(label: "com.NightOut.captureQueue") 
      dataOutput.setSampleBufferDelegate(self, queue: queue) 
     } 
    } 
     @IBAction func takePhoto(_ sender: Any) { 
      takePhoto = true 

      photoSettings.isHighResolutionPhotoEnabled = true 
      photoSettings.isAutoStillImageStabilizationEnabled = true 
    } 

    func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) { 
     if takePhoto { 
      takePhoto = false 
      if let image = self.getImageFromSampleBuffer(buffer: sampleBuffer) { 
       let photoVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PhotoVC") as! PhotoPreviewViewController 

       photoVC.takenPhoto = image 

       DispatchQueue.main.async { 
        self.present(photoVC, animated: true, completion: { 
         self.stopCaptureSession() 
        }) 
       } 
      } 
     } 
    } 

    func getImageFromSampleBuffer (buffer:CMSampleBuffer) -> UIImage? { 
     if let pixelBuffer = CMSampleBufferGetImageBuffer(buffer) { 
      let ciImage = CIImage(cvPixelBuffer: pixelBuffer) 
      let context = CIContext() 

      let imageRect = CGRect(x: 0, y: 0, width: CVPixelBufferGetWidth(pixelBuffer), height: CVPixelBufferGetHeight(pixelBuffer)) 

      if let image = context.createCGImage(ciImage, from: imageRect) { 
       return UIImage(cgImage: image, scale: UIScreen.main.scale, orientation: .leftMirrored) 
      } 
    } 
     return nil 
    } 

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

     self.captureSession.stopRunning() 
    } 

    func stopCaptureSession() { 
     self.captureSession.stopRunning() 

     if let inputs = captureSession.inputs as? [AVCaptureDeviceInput] { 
      for input in inputs { 
       self.captureSession.removeInput(input) 
      } 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    @IBAction func DismissButtonAction(_ sender: UIButton) { 

     UIView.animate(withDuration: 0.1, animations: { 
      self.DismissButton.transform = CGAffineTransform.identity.scaledBy(x: 0.8, y: 0.8) 
     }, completion: { (finish) in 
      UIView.animate(withDuration: 0.1, animations: { 
       self.DismissButton.transform = CGAffineTransform.identity 
      }) 
     }) 
     performSegue(withIdentifier: "Segue", sender: nil) 
    } 
} 
+0

的[總是看到鏡像,同時從正面相機的iOS 5.0捕獲](可能的複製https://stackoverflow.com/questions/9227450/總是看到鏡像圖像,而從前端攝像頭捕獲 - ios-5-0) –

+0

我看到..''LeftMirrored'爲前置攝像頭做了訣竅,但卻讓後置攝像頭翻轉圖像你不想要... @CleverError – RandomGeek

回答

2

我這出自己,下面是解:

if captureDevice.position == AVCaptureDevicePosition.back { 
      if let image = context.createCGImage(ciImage, from: imageRect) { 
       return UIImage(cgImage: image, scale: UIScreen.main.scale, orientation: .right) 
       } 
      } 

       if captureDevice.position == AVCaptureDevicePosition.front { 
        if let image = context.createCGImage(ciImage, from: imageRect) { 
        return UIImage(cgImage: image, scale: UIScreen.main.scale, orientation: .leftMirrored) 

     } 
    } 
     } 
     return nil 
     } 
+0

正確的解決方案是將AVCaptureConnection對象的isVideoMirrored屬性設置爲true是captureOutput回調中的前置攝像頭,在調用CMSampleBufferGetImageBuffer之前。 – Boon

0

我很久以前就做過了。我沒有我的系統,但我可以說,水平變換預覽圖層,它會顯示你想要的確切結果。爲了保存和導出,你會在這裏找到很多例子。

+0

當我離開鏡像圖層時,它也會鏡像我的背部相機圖像....不是一個好的解決方案 – RandomGeek

相關問題