我试图用swift制作应用程序,我想使用前置摄像头。 我使用AVFoundation并尝试了一些代码。但我无法设置前置缩放参数。可能吗?对于后置摄像头,一切都运作成功。
我不想使用仿射变换。因为,它可以降低图像质量。那么,如何以编程方式设置此参数?
感谢。
答案 0 :(得分:1)
您需要将zoomFactor变量添加到相机中。
var zoomFactor: CGFloat = 1.0
接下来定义一个与捏合识别器一起使用的函数 zoom 。我假设你已经创建了一个前捕获设备和输入。 frontDevice 是我相机上的可选捕捉设备。这是我如何缩放该设备。
public func zoom(pinch: UIPinchGestureRecognizer) {
guard let device = frontDevice else { return }
func minMaxZoom(_ factor: CGFloat) -> CGFloat { return min(max(factor, 1.0), device.activeFormat.videoMaxZoomFactor) }
func update(scale factor: CGFloat) {
do {
try device.lockForConfiguration()
defer { device.unlockForConfiguration() }
device.videoZoomFactor = factor
} catch {
debugPrint(error)
}
}
let newScaleFactor = minMaxZoom(pinch.scale * zoomFactor)
switch pinch.state {
case .began: fallthrough
case .changed: update(scale: newScaleFactor)
case .ended:
zoomFactor = minMaxZoom(newScaleFactor)
update(scale: zoomFactor)
default: break
}
}
最后在某些视图中添加一个捏合识别器。
let pgr = UIPinchGestureRecognizer(target: self, action: #selector(zoom))
view.addGestureRecognizer(pgr)
答案 1 :(得分:1)
无需内部方法即可完成先前的答案,从而使其更加直接和易于理解。
要完整解释代码,请执行以下操作:
zoom
变量可跟踪您在上一个手势之后的缩放比例。在发生任何手势之前,没有缩放,因此您的位置为1.0。
在手势过程中,scale
的{{1}}属性可保持活动手势期间的收缩比例。当手指没有从其初始位置移开并随捏而增长和收缩时,此值为1.0。通过将此乘以先前持有的pinch
,您可以得出手势发生时的当前缩放比例。重要的是,将此比例保持在zoom
的范围内,否则您将获得[1, device.activeFormat.videoMaxZoomFactor]
。
手势(SIGABRT
)完成后,您需要更新pinch.state
,以便下一个手势从当前缩放级别开始。
在修改相机属性时,请务必进行锁定,以避免同时进行修改。无论如何,zoom
都会在代码块后释放锁定,类似于defer
块。
finally