gpt4 book ai didi

ios - 如何在 iOS8.1 上使用 Swift 按顺序拍摄多张照片(每张延迟 1 秒)?

转载 作者:搜寻专家 更新时间:2023-10-30 23:07:08 28 4
gpt4 key购买 nike

我试图在单个用户点击相机预览后拍几张照片,这样我就可以展示它们,用户可以选择时间最佳的照片或在“胶卷”模式下全部使用。预期的用户体验是:“我打开相机,拍照,然后我看到一秒一秒拍了 5 张照片。我不必按 5 次‘拍照’按钮,一次就足以启动序列” .

我是 iOS 和 Swift 的新手,我的工作基于一本“Swift 食谱”书 (https://www.safaribooksonline.com/library/view/ios-8-swift/9781491908969/)。

单张照片拍摄的源码是:

controller = UIImagePickerController()
if let theController = controller{
theController.sourceType = .Camera
theController.mediaTypes = [kUTTypeImage as NSString]
theController.allowsEditing = true
theController.delegate = self
presentViewController(theController, animated: true, completion: nil)
}

加上相关的图像处理(通过 func imagePickerController)。我尝试使用上面的 Controller 对象,但惨遭失败 :( 我认为这不是获得我想要的东西的正确方法,但我很难找到合适的方法。我们将不胜感激。

最佳答案

我不知道 UIImagePickerController 中是否有这种行为的模式。如果我是你,我会使用 AVFoundation实现这个。

import UIKit
import AVFoundation

class ViewController: UIViewController {

var connection: AVCaptureConnection!
var output: AVCaptureStillImageOutput!
var videoPreviewLayer: AVCaptureVideoPreviewLayer!
@IBOutlet var videPreviewView: UIView!

override func viewDidLoad() {
super.viewDidLoad()

self.createCamera()
}

override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()

self.videoPreviewLayer.bounds = self.videPreviewView.bounds
self.videoPreviewLayer.position = CGPoint(x: CGRectGetMidX(self.videPreviewView.bounds), y: CGRectGetMidY(self.videPreviewView.bounds))
}

func createCamera() {
let captureSession = AVCaptureSession()

if captureSession.canSetSessionPreset(AVCaptureSessionPresetHigh) {
captureSession.sessionPreset = AVCaptureSessionPresetHigh
} else {
println("Error: Couldn't set preset = \(AVCaptureSessionPresetHigh)")
return
}

let cameraDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

var error: NSError?
let inputDevice = AVCaptureDeviceInput.deviceInputWithDevice(cameraDevice, error: &error) as AVCaptureDeviceInput
if let error = error {
println("Error: \(error)")
return
}

if captureSession.canAddInput(inputDevice) {
captureSession.addInput(inputDevice)
} else {
println("Error: Couldn't add input device")
return
}

let imageOutput = AVCaptureStillImageOutput()
if captureSession.canAddOutput(imageOutput) {
captureSession.addOutput(imageOutput)
} else {
println("Error: Couldn't add output")
return
}

// Store imageOutput. We will need it to take photo
self.output = imageOutput

let connection = imageOutput.connections.first as AVCaptureConnection!
// Store this connection in property. We will need it when we take image.
self.connection = connection
connection.videoOrientation = AVCaptureVideoOrientation.Portrait

captureSession.startRunning()

// This will preview the camera
let videoLayer = AVCaptureVideoPreviewLayer(session: captureSession)
videoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
videoLayer.contentsScale = UIScreen.mainScreen().scale

self.videPreviewView.layer.addSublayer(videoLayer)

// Store this layer instance in property. We will place it into a view
self.videoPreviewLayer = videoLayer
}

func takePhoto(completion: (UIImage?, NSError?) -> Void) {
self.output.captureStillImageAsynchronouslyFromConnection(self.connection) { buffer, error in
if let error = error {
completion(nil, error)
} else {
let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer)
let image = UIImage(data: imageData, scale: UIScreen.mainScreen().scale)
completion(image, nil)
}
}
}
}

现在您所要做的就是创建一个调用 takePhoto 3 次的操作。您可以使用 NSTimer 来执行此操作。

关于ios - 如何在 iOS8.1 上使用 Swift 按顺序拍摄多张照片(每张延迟 1 秒)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26641443/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com