自动保存和捕获前置摄像头iOS Swift中的图片



我正在开发一个新的应用程序,我被一个主要问题卡住了。我需要自动捕捉和保存前摄像头的照片,在照片。我使用这个代码,但谁能帮助我,请保存捕获的图像。谢谢你

    let videoDevices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo)
    var captureDevice:AVCaptureDevice
    for device in videoDevices{
        let device = device as! AVCaptureDevice
        if device.position == AVCaptureDevicePosition.Front {
            captureDevice = device
        }
    }

Try This…

import UIKit
import CoreMedia
import CoreVideo
import AVFoundation
class AutocaptureViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, AVCaptureVideoDataOutputSampleBufferDelegate
{

    @IBOutlet var cameraImageView: UIImageView!
   // var device: AVCaptureDevice;
var captureSession : AVCaptureSession;
var previewLayer : AVCaptureVideoPreviewLayer;
var cameraImage: UIImage
@IBOutlet var mainImage: UIImageView!
@IBOutlet var tempDrawImage: UIImageView!
@IBOutlet var cameraImg: UIImageView!

var cameraTimer: NSTimer
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}
func setupTimer()
{
    snapshot()
    cameraTimer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: #selector(AutocaptureViewController.snapshot), userInfo: nil, repeats: true)
}
func setupCamera() {
    var devices: [AnyObject] = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo)
    let device = AVCaptureDevice.devices()
    for device: in devices
    {
        if device.position == .Front {
            self.device = device
        }
    }
    //let input = try AVCaptureDeviceInput(device: self.device) as AVCaptureDeviceInput
    var input: AVCaptureDeviceInput = AVCaptureDeviceInput.deviceInputWithDevice(self.device, error: nil)
    var output: AVCaptureVideoDataOutput = AVCaptureVideoDataOutput()
    output.alwaysDiscardsLateVideoFrames = true
   // var queue: dispatch_queue_t
    var queue: dispatch_queue_t = dispatch_queue_create("cameraQueue", DISPATCH_QUEUE_SERIAL)
    //queue = dispatch_queue_create("cameraQueue")
    output.setSampleBufferDelegate(self, queue: queue)
    var key: String = String(kCVPixelBufferPixelFormatTypeKey)
    var value: Int = Int(kCVPixelFormatType_32BGRA)
    var videoSettings: [NSObject : AnyObject] = [
        key : value
    ]
    output.videoSettings = videoSettings
    self.captureSession = AVCaptureSession()
    self.captureSession.addInput(input)
    self.captureSession.addOutput(output)
    self.captureSession.sessionPreset = AVCaptureSessionPresetPhoto
    let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
    self.previewLayer.hidden = true
    // CHECK FOR YOUR APP
    self.previewLayer.frame = CGRectMake(0, 0, self.view.frame.size.height, self.view.frame.size.width)
    self.previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.Portrait
    // CHECK FOR YOUR APP
    self.view.layer.insertSublayer(self.previewLayer, atIndex: 0)
    // Comment-out to hide preview layer
    self.captureSession.startRunning()
}
func snapshot()
{
    let imageArray: NSMutableArray
    let rect: CGRect = CGRectMake(0, 0, 90, 120)
    UIGraphicsBeginImageContext(rect.size)
    self.cameraImage.drawInRect(rect)
    let picture1: UIImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    let imageData: NSData = UIImagePNGRepresentation(picture1)!
    let img:UIImage = UIImage(data:imageData)!
    imageArray.addObject(img)
    self.cameraImageView.image = img
    // Comment-out to hide snapshot
}
func image(image: UIImage, didFinishSavingWithError error: NSErrorPointer, contextInfo:UnsafePointer<Void>) {
}
 @IBAction func doneBtn(sender: AnyObject)
{
    self.captureSession.stopRunning()
}

可以使用UIImagePickerController作为此功能的I R&D。

如果你想从相机中自动捕获图像,那么你可以使用下面提到的代码。

1. First you need to Add AVFoundation framework in your project. 
Select project -> Add AVFoundation framework in Frameworks, Libraries, and Embedded Content Section

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIGestureRecognizerDelegate {
    
    let objCaptureSession = AVCaptureSession()
    var objPreviewLayer : AVCaptureVideoPreviewLayer?
    var objCaptureDevice : AVCaptureDevice?
    var objImagePicker = UIImagePickerController()
    var objTimer: Timer?
    var flagRepeatRecording: Bool = false
    var objOutputVolumeObserve: NSKeyValueObservation?
    let objAudioSession = AVAudioSession.sharedInstance()
    
    override func viewDidAppear(_ animated: Bool) {
        if !flagRepeatRecording {
            if UIImagePickerController.isSourceTypeAvailable(.camera) {
                objImagePicker = UIImagePickerController()
                objImagePicker.delegate = self
                objImagePicker.sourceType = .camera
                objImagePicker.allowsEditing = false
                objImagePicker.showsCameraControls = false
                
                //imagePicker.mediaTypes = [kUTTypeMovie as String] // If you want to start auto recording video by camera
            } else {
                debugPrint("Simulator has no camera")
            }
            
            self.present(self.objImagePicker, animated: true, completion: {
                self.objImagePicker.takePicture() // If you want you auto start video capturing then replace this code with take picture() method startVideoCapture()
                
            NotificationCenter.default.addObserver(self, selector: #selector(self.cameraIsReady), name: .AVCaptureSessionDidStartRunning, object: nil)
            
            flagRepeatRecording = true
        }
    }
    @objc func cameraIsReady(notification: NSNotification) {
        DispatchQueue.main.async {
            self.objImagePicker.takePicture()
        }
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
//        let tempImage = info[UIImagePickerController.InfoKey.mediaURL] as! NSURL?
//        let pathString = tempImage?.relativePath
        self.dismiss(animated: true, completion: {})
//        UISaveVideoAtPathToSavedPhotosAlbum(pathString!, self, nil, nil)
        
        self.objTimer?.invalidate()
        self.objTimer = nil
    }
}

最新更新