2015-01-05 3 views
4

Я пытаюсь захватить изображение и сохранить его в переменной, когда я нажимаю «myButton». Что мне делать?Съемка текущего изображения камеры с использованием AVFoundation

Мой код выглядит следующим образом:

import UIKit 
import AVFoundation 
import MobileCoreServices 

class ViewController: UIViewController { 

    let captureSession = AVCaptureSession() 
    var previewLayer : AVCaptureVideoPreviewLayer? 
    var captureDevice : AVCaptureDevice? 
    @IBOutlet var myTap: UITapGestureRecognizer! 
    @IBOutlet weak var myButton: UIButton! 

    @IBAction func shotPress(sender: UIButton) { 
     //Save image to variable somehow 
     }) 
     var stillImageOutput = AVCaptureStillImageOutput() 
     stillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] 

     if captureSession.canAddOutput(stillImageOutput) { 
      captureSession.addOutput(stillImageOutput) 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     captureSession.sessionPreset = AVCaptureSessionPresetHigh 
     let devices = AVCaptureDevice.devices() 
     for device in devices { 
      if (device.hasMediaType(AVMediaTypeVideo)) { 
       if(device.position == AVCaptureDevicePosition.Back) { 
        captureDevice = device as? AVCaptureDevice 
        if captureDevice != nil { 
         beginSession() 
        } 
       } 
      } 
     } 
    } 

    func updateDeviceSettings(focusValue : Float, isoValue : Float) { 
     if let device = captureDevice { 
      if(device.lockForConfiguration(nil)) { 
       device.focusMode = AVCaptureFocusMode.ContinuousAutoFocus 
       device.unlockForConfiguration() 
      } 
     } 
    } 

    func beginSession() { 
     var err : NSError? = nil 
     captureSession.addInput(AVCaptureDeviceInput(device: captureDevice, error: &err)) 
     if err != nil { 
      println("error: \(err?.localizedDescription)") 
     } 
     previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
     self.view.layer.addSublayer(previewLayer) 
     self.view.bringSubviewToFront(myButton) 
     previewLayer?.frame = self.view.layer.frame 
     captureSession.startRunning() 
    } 

} 
+0

То, что вы в основном должны сделать, это пытается захватить samplebuffer для этого изображения. Вы можете сделать это, вызвав функцию func captureStillImageAsynchronouslyFromConnection (_ connection: AVCaptureConnection!, CompleteHandler: ((CMSampleBuffer !, NSError!) -> Void)!) 'На вашем AVCaptureStillImageOutput. Передайте обработчик завершения, в котором вы будете делать то, что хотите, с вашим изображением. – Jan

ответ

8

Это то, что я использую на одном из приложения, что я работаю. Должен быть полезен и для вашей проблемы.

func capturePicture(){ 

    println("Capturing image") 
    stillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] 
    captureSession.addOutput(stillImageOutput) 

    if let videoConnection = stillImageOutput.connectionWithMediaType(AVMediaTypeVideo){ 
      stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: { 
        (sampleBuffer, error) in 
       var imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) 
       var dataProvider = CGDataProviderCreateWithCFData(imageData) 
       var cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault) 
       var image = UIImage(CGImage: cgImageRef, scale: 1.0, orientation: UIImageOrientation.Right) 

       var imageView = UIImageView(image: image) 
       imageView.frame = CGRect(x:0, y:0, width:self.screenSize.width, height:self.screenSize.height) 

       //Show the captured image to 
       self.view.addSubview(imageView) 

       //Save the captured preview to image 
       UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) 

       }) 
     } 
} 
+0

Хороший ответ. Могу я задать вопрос? Что такое kCGRenderingDefault? –

+0

привет, вы можете заменить строки ниже отображенных данных с варом ImageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation (sampleBuffer) вара изображением = UIImage (данные: ImageData, масштаб: 1,0) // Сохранение захваченного предпросмотр изображения UIImageWriteToSavedPhotosAlbum (изображения !, nil, nil, nil) – Morganster

+0

@MarcusGabilheri Я думаю, что вы хотите: CGColorRenderingIntent.RenderingIntentDefault – iksnae

1

Обновление для Swift 3:

var stillImageOutput = AVCaptureStillImageOutput.init() 
stillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] 
self.cameraSession.addOutput(stillImageOutput) 

if let videoConnection = stillImageOutput.connection(withMediaType:AVMediaTypeVideo){ 
    stillImageOutput.captureStillImageAsynchronously(from:videoConnection, completionHandler: { 
    (sampleBuffer, error) in 
    var imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) 
    var dataProvider = CGDataProvider.init(data: imageData as! CFData) 
    var cgImageRef = CGImage.init(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent) 
    var image = UIImage.init(cgImage: cgImageRef!, scale: 1.0, orientation: .right) 
    // do something with image 
    }) 
} 
Смежные вопросы