菜鸟教程小白 发表于 2022-12-11 18:56:01

ios - 如何拍照并同时保存(swift3)


                                            <p><p>现在我的代码有 1 个 View 、1 个按钮和 1 个 ImageView 。目前,代码拍摄照片并放置在 uniimageview 上。如何编写代码,以便每次拍摄照片时都会将其保存到照片库中。我已经更新了 plist 设置。 </p>

<pre><code> 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(&#34;issue here : captureSesssion.canAddInput&#34;)
      }
    } else {
      print(&#34;some problem here&#34;)
    }
}

// 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(&#34;error occure : \(error.localizedDescription)&#34;)
    }

    iflet 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(&#34;some error here&#34;)
    }
}

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

    switch cameraPermissionStatus {
    case .authorized:
      print(&#34;Already Authorized&#34;)
    case .denied:
      print(&#34;denied&#34;)

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

    case .restricted:
      print(&#34;restricted&#34;)
    default:
      AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo, completionHandler: {
            
            (granted :Bool) -&gt; Void in

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

                DispatchQueue.main.async(){
                  let alert = UIAlertController(title: &#34;WHY?&#34; , message:&#34;Camera it is the main feature of our application&#34;, preferredStyle: .alert)
                  let action = UIAlertAction(title: &#34;Ok&#34;, style: .cancel, handler: nil)
                  alert.addAction(action)
                  self?.present(alert, animated: true, completion: nil)
                }
            }
      });
    }
}
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>如果要保存照片,只需调用 <code>UIImageWriteToSavedPhotosAlbum</code> 并在现有代码中将图像对象传递给它</p>

<p>示例代码</p>

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

      if let error = error {
            print(&#34;error occure : \(error.localizedDescription)&#34;)
      }

      iflet 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(&#34;some error here&#34;)
      }
    }

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

<p>我已在您需要在代码中添加的行上方添加了注释。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何拍照并同时保存(swift3),我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/42181660/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/42181660/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何拍照并同时保存(swift3)