2017-02-11 8 views
2

今、私のコードは1ビュー、1ボタン、1イメージビューを持っています。現在のところ、コードは写真と場所をunimimageviewに取り込みます。写真をスナップするたびにフォトギャラリーに保存されるように、コードを書き込むにはどうすればよいですか。私は既にplist設定を更新しました。写真を撮って同時に保存する方法(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) 
       } 
      } 
     }); 
    } 
} 
} 

答えて

0

あなたはちょうど私が上記のコメントを追加したUIImageWriteToSavedPhotosAlbumを呼び出すと、既存のコード

サンプルコード

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) 
     } 
    } 

でそれに画像オブジェクトを渡す必要が写真を保存したい場合あなたのコードに追加する必要があります。

関連する問題