2017-07-02 69 views
1

我最近在我的項目中添加了一個cameraView,一切正常。 儘管現在我還沒有真正捕捉照片,並且它的下一步我想實現...我如何拍照並預覽它

如果你能告訴我如何實現捕捉照片並用代碼預覽它,有

所以TakePhoto功能將拍攝照片,然後拍攝的圖像IV將展示給我的previewPhotoViewController

CustomCameraView:

import UIKit 
import AVFoundation 


class CustomCameraViewController: UIViewController,UIImagePickerControllerDelegate { 

    @IBOutlet weak var cameraView: UIView! 

    let session: AVCaptureSession = AVCaptureSession() 


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

     session.sessionPreset = AVCaptureSessionPresetHigh 

     if let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) { 
      do { 
       try session.addInput(AVCaptureDeviceInput(device: device)) 

      } catch { 
       print(error.localizedDescription) 
      } 

      guard let previewLayer = AVCaptureVideoPreviewLayer(session: session) else { 
       print("no preview layer") 
       return 
      } 

      self.cameraView.layer.addSublayer(previewLayer) 
      previewLayer.frame = self.view.layer.bounds 

     } 


     session.startRunning() 

    } 


    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

} 
    override var preferredStatusBarStyle : UIStatusBarStyle { 
     return .lightContent 
    } 

    func TakePhoto(_ sender: UIButton) { 

     //Wants to take photo with this button funcntion... 


    } 

,我開始用預覽頁面,以及:

PreviewPhotoViewController:

import UIKit 

class PhotoPreviewViewController: UIViewController { 

    @IBOutlet weak var imageView: UIImageView! 

    var takenPhoto :UIImage? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     if let availableImage = takenPhoto { 
      imageView.image = availableImage 
     } 
} 
    @IBAction func dismissView(_ sender: UIButton) { 
     self.dismiss(animated: true, completion: nil) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

} 

感謝你的幫助

+0

你可以在AVCaptureSession中使用AVCaptureVideoPreviewLayer。看看:https://stackoverflow.com/questions/44682698/how-to-take-uiimage-of-avcapturevideopreviewlayer-instead-of-avcapturephotooutpu/44727608#44727608 – ninjaproger

回答

0

AVCaptureSession,你可以看看this。我剛剛創建了一個使用AVCaptureSession的樣本,這是對AVCam Apple樣本的簡化。

請記得在您的.plist中設置Privacy - Camera Usage Description


由於有一些bug使得AVCaptureSession崩潰iOS10模擬器,從this。我更喜歡使用UIImagePickerController。你可以看看下面的例子:

import UIKit 
import AVFoundation 
import MobileCoreServices 

class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate { 

    @IBOutlet weak var imageView: UIImageView! 

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

    @IBAction func takePhoto(_ sender: UIButton) { 
     self.presentPhotoCamera(canEdit: false) 
    } 

    func presentPhotoCamera(canEdit: Bool) { 
     if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) { 
      return 
     } 

     let type = kUTTypeImage as String 
     let imagePicker = UIImagePickerController() 

     if UIImagePickerController.isSourceTypeAvailable(.camera) { 

      if let availableTypes = UIImagePickerController.availableMediaTypes(for: .camera) { 

       if availableTypes.contains(type) { 

        imagePicker.mediaTypes = [type] 
        imagePicker.sourceType = UIImagePickerControllerSourceType.camera 
       } 
      } 

      if UIImagePickerController.isCameraDeviceAvailable(.rear) { 
       imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.rear 
      } else if UIImagePickerController.isCameraDeviceAvailable(.front) { 
       imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.front 
      } 
     } else { return } 

     imagePicker.allowsEditing = canEdit 
     imagePicker.showsCameraControls = true 
     imagePicker.delegate = self 
     DispatchQueue.main.async { 
      self.present(imagePicker, animated: true, completion: nil) 
     } 
    } 

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     let image = info[UIImagePickerControllerOriginalImage] as! UIImage 

     picker.dismiss(animated: true, completion: { 
      self.imageView.image = image 
     }) 
    } 
} 
+0

我在我的設備上運行,所以我沒有得到崩潰。並且更喜歡AVCaptureSession,因爲我用我的自定義相機視圖獲得了更多的自由度,所以這會更可取。謝謝 – RandomGeek

+0

你知道它如何處理AVCaptureSession嗎? – RandomGeek

+0

更新了我的答案。 – Lawliet

相關問題