2017-02-11 6 views
2

Im Moment hat mein Code 1 Ansicht, 1 Taste und 1 Bildansicht. Momentan nimmt der Code das Foto und platziert auf der uniimageview. Wie kann ich den Code schreiben, so dass jedes Mal, wenn das Foto einrastet, es in der Fotogalerie gespeichert wird. Ich habe die PLIST-Einstellungen bereits aktualisiert.Wie man Foto macht und es gleichzeitig speichert (swift3)

import UIKit 
import AVFoundation 

class ViewController: UIViewController,AVCapturePhotoCaptureDelegate { 

var captureSesssion : AVCaptureSession! 
var cameraOutput : AVCapturePhotoOutput! 
var previewLayer : AVCaptureVideoPreviewLayer! 

@IBOutlet weak var capturedImage: UIImageView! 
@IBOutlet weak var previewView: UIView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    captureSesssion = AVCaptureSession() 
    captureSesssion.sessionPreset = AVCaptureSessionPresetPhoto 
    cameraOutput = AVCapturePhotoOutput() 

    let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 

    if let input = try? AVCaptureDeviceInput(device: device) { 
     if (captureSesssion.canAddInput(input)) { 
      captureSesssion.addInput(input) 
      if (captureSesssion.canAddOutput(cameraOutput)) { 
       captureSesssion.addOutput(cameraOutput) 
       previewLayer = AVCaptureVideoPreviewLayer(session: captureSesssion) 
       previewLayer.frame = previewView.bounds 
       previewView.layer.addSublayer(previewLayer) 
       captureSesssion.startRunning() 
      } 
     } else { 
      print("issue here : captureSesssion.canAddInput") 
     } 
    } else { 
     print("some problem here") 
    } 
} 

// Take picture button 
@IBAction func didPressTakePhoto(_ sender: UIButton) { 
    let settings = AVCapturePhotoSettings() 
    let previewPixelType = settings.availablePreviewPhotoPixelFormatTypes.first! 
    let previewFormat = [ 
     kCVPixelBufferPixelFormatTypeKey as String: previewPixelType, 
     kCVPixelBufferWidthKey as String: 160, 
     kCVPixelBufferHeightKey as String: 160 
    ] 
    settings.previewPhotoFormat = previewFormat 
    cameraOutput.capturePhoto(with: settings, delegate: self) 

} 

// callBack from take picture 
func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) { 

    if let error = error { 
     print("error occure : \(error.localizedDescription)") 
    } 

    if let sampleBuffer = photoSampleBuffer, 
     let previewBuffer = previewPhotoSampleBuffer, 
     let dataImage = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: sampleBuffer, previewPhotoSampleBuffer: previewBuffer) { 
     print(UIImage(data: dataImage)?.size as Any) 

     let dataProvider = CGDataProvider(data: dataImage as CFData) 
     let cgImageRef: CGImage! = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent) 
     let image = UIImage(cgImage: cgImageRef, scale: 1.0, orientation: UIImageOrientation.right) 

     self.capturedImage.image = image 
    } else { 
     print("some error here") 
    } 
} 

// This method you can use somewhere you need to know camera permission state 
func askPermission() { 
    print("here") 
    let cameraPermissionStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo) 

    switch cameraPermissionStatus { 
    case .authorized: 
     print("Already Authorized") 
    case .denied: 
     print("denied") 

     let alert = UIAlertController(title: "Sorry :(" , message: "But could you please grant permission for camera within device settings", preferredStyle: .alert) 
     let action = UIAlertAction(title: "Ok", style: .cancel, handler: nil) 
     alert.addAction(action) 
     present(alert, animated: true, completion: nil) 

    case .restricted: 
     print("restricted") 
    default: 
     AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo, completionHandler: { 
      [weak self] 
      (granted :Bool) -> Void in 

      if granted == true { 
       // User granted 
       print("User granted") 
       DispatchQueue.main.async(){ 
        //Do smth that you need in main thread 
       } 
      } 
      else { 
       // User Rejected 
       print("User Rejected") 

       DispatchQueue.main.async(){ 
        let alert = UIAlertController(title: "WHY?" , message: "Camera it is the main feature of our application", preferredStyle: .alert) 
        let action = UIAlertAction(title: "Ok", style: .cancel, handler: nil) 
        alert.addAction(action) 
        self?.present(alert, animated: true, completion: nil) 
       } 
      } 
     }); 
    } 
} 
} 

Antwort

0

Wenn Sie das Foto speichern müssen Sie nur UIImageWriteToSavedPhotosAlbum anrufen und Bildobjekt, um es in Ihrem vorhandenen Code

Beispielcode

func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) { 

     if let error = error { 
      print("error occure : \(error.localizedDescription)") 
     } 

     if let sampleBuffer = photoSampleBuffer, 
      let previewBuffer = previewPhotoSampleBuffer, 
      let dataImage = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: sampleBuffer, previewPhotoSampleBuffer: previewBuffer) { 
      print(UIImage(data: dataImage)?.size as Any) 

      let dataProvider = CGDataProvider(data: dataImage as CFData) 
      let cgImageRef: CGImage! = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent) 
      let image = UIImage(cgImage: cgImageRef, scale: 1.0, orientation: UIImageOrientation.right) 

      self.capturedImage.image = image 

      //Add: Save image object to photo album 
//   UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) // 
      UIImageWriteToSavedPhotosAlbum(image, self, #selector(self.image(_:didFinishSavingWithError:contextInfo:)), nil) 
     } else { 
      print("some error here") 
     } 
    } 

    func image(_ image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) { 
     if let error = error { 
      // we got back an error! 
      let ac = UIAlertController(title: "Save error", message: error.localizedDescription, preferredStyle: .alert) 
      ac.addAction(UIAlertAction(title: "OK", style: .default)) 
      present(ac, animated: true) 
     } else { 
      let ac = UIAlertController(title: "Image Saved!", message: "Your image has been saved to your photos.", preferredStyle: .alert) 
      ac.addAction(UIAlertAction(title: "OK", style: .default)) 
      present(ac, animated: true) 
     } 
    } 

ich den Kommentar hinzugefügt über das haben, passieren Zeile, die Sie in Ihrem Code hinzufügen müssen.

Verwandte Themen