【问题标题】:How to expand camera view to full screen in swift - UIImagePickerController如何在swift中将相机视图扩展到全屏 - UIImagePickerController
【发布时间】:2016-01-26 14:12:38
【问题描述】:

我正在使用 UIImagePickerController 用 pone 拍摄一张照片,稍后在应用程序中使用该照片。

这是我启动相机的代码:

imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .Camera
imagePicker.showsCameraControls = false
imagePicker.cameraOverlayView = customViewTakePhoto()

presentViewController(imagePicker, animated: true, completion: nil)

一切正常,相机启动,拍照后我可以获取照片,但只有一件事我无法弄清楚,那就是:

如何在拍照前让相机在整个屏幕上显示?

这里的图片正好显示了我需要的东西

这是我现在的观点(顺便说一句,我强烈推荐这本书):

这就是我需要的(全屏相机视图):

【问题讨论】:

    标签: ios swift camera


    【解决方案1】:
    import UIKit
    import AVFoundation
    
    class CameraViewController: UIViewController {
    
        // MARK: @IBOutlet
    
        @IBOutlet weak var overlayCamera: UIView! 
        @IBOutlet weak var capturedImage: UIImageView! 
    
        // MARK: Local Variables
    
        var captureSession: AVCaptureSession?
        var stillImageOutput: AVCaptureStillImageOutput?
        var previewLayer: AVCaptureVideoPreviewLayer?
    
        // MARK: Overrides
    
        override func viewDidAppear(animated: Bool) {
            super.viewDidAppear(animated)
            previewLayer!.frame = overlayCamera.bounds
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
            let tapGesture = UITapGestureRecognizer(target: self, action: "cameraDidTap")
            overlayCamera.addGestureRecognizer(tapGesture)
        }
    
        override func viewWillAppear(animated: Bool) {
            self.navigationController?.setNavigationBarHidden(true, animated: false)
            super.viewWillAppear(animated)
    
            captureSession = AVCaptureSession()
            captureSession!.sessionPreset = AVCaptureSessionPresetPhoto
    
            let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    
            var error: NSError?
            var input: AVCaptureDeviceInput!
            do {
                input = try AVCaptureDeviceInput(device: backCamera)
            } catch let error1 as NSError {
                error = error1
                input = nil
            }
    
            if error == nil && captureSession!.canAddInput(input) {
                captureSession!.addInput(input)
    
                stillImageOutput = AVCaptureStillImageOutput()
                stillImageOutput!.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
                if captureSession!.canAddOutput(stillImageOutput) {
                    captureSession!.addOutput(stillImageOutput)
    
                    previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                    previewLayer!.videoGravity = AVLayerVideoGravityResizeAspectFill
                    previewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.Portrait
                    overlayCamera.layer.addSublayer(previewLayer!)
    
                    captureSession!.startRunning()
                }
            }
        }
    
        override func viewWillDisappear(animated: Bool) {
            self.navigationController?.setNavigationBarHidden(false, animated: false)
            super.viewWillDisappear(animated)
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    
        // function for UITapGestureRecognizer for camera tap
        func cameraDidTap() {
    
            if let videoConnection = stillImageOutput!.connectionWithMediaType(AVMediaTypeVideo) {
                videoConnection.videoOrientation = AVCaptureVideoOrientation.Portrait
                stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: {(sampleBuffer, error) in
                    if (sampleBuffer != nil) {
                        let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
                        let dataProvider = CGDataProviderCreateWithCFData(imageData)
                        let cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault)
    
                        let image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Right)
                        self.capturedImage.image = image
                    }
                })
            }
        }
    }
    

    【讨论】:

    • 易于操作相机,如果你使用 AVFoundation 比 UIImagePickerController :)
    • 对于 Swift 4 - 使用 AVCaptureSession.Preset.hd1920x1080 全屏摄像头
    • @StevenSchafer 它适用于旧设备吗?我的意思是,它适用于我的 iPhone XR,但我不确定 iPhone 5 有这么多分辨率。
    【解决方案2】:

    它对我有用:

    设置AVCaptureSession():

    let captureSession = AVCaptureSession()
    
    guard let captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: AVMediaType.video, position: .back) else { return }
    guard let input = try? AVCaptureDeviceInput(device: captureDevice) else { return }    
    captureSession.addInput(input)
    captureSession.startRunning()
    

    设置AVCaptureVideoPreviewLayer():

    let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    previewLayer.videoGravity = .resizeAspectFill
    view.layer.addSublayer(previewLayer)
    previewLayer.frame = view.frame
    

    【讨论】:

    • 这对我有用。谢谢
    【解决方案3】:

    在 previewLayer 中只需将 videoGravity 设置为 aspectFill:

    let previewLayer = AVCaptureVideoPreviewLayer()
    
    previewLayer.videoGravity = .resizeAspectFill
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多