SwiftttCamera
是 AVFoundation
的一个封装,让您能够构建自己强大的自定义相机应用,而无需直接使用 AVFoundation
的所有麻烦。
AVCaptureSession
。AVCaptureVideoPreviewLayer
。AVCaptureDevice
的状态,并在需要时安全地更改其属性,例如设置闪光灯模式以及在前置和后置摄像头之间切换。AVCapturePhotoOutput
捕获全分辨率照片。AVCaptureConnection
的方向。UIImage.Orientation.up
,这对于在可能不遵守 EXIF 图像方向标签的 Web 服务上可靠地正确显示图像非常有用。SwiftttCamera
的许多操作比 UIImagePickerController
的相机更快,例如在前置和后置摄像头之间切换,并以您需要的格式为您提供捕获的照片,在大多数设备上,返回裁剪后的全分辨率图像的速度与 UIImagePickerController
返回原始捕获图像的速度一样快。它允许 AVFoundation
的所有灵活性,而无需重新发明轮子,因此您可以专注于制作漂亮的自定义 UI 并使用照片做很棒的事情。
虽然 UIImagePickerController
的相机和 AVFoundation
都为您提供原始图像,这些图像甚至可能未与您的用户看到的实时相机预览裁剪得相同,但 SwiftttCamera
为您提供裁剪为与您的实时预览视口相同宽高比的全分辨率图像,以及缩放到该视口像素尺寸的预览图像,无论您想要方形相机、全屏尺寸的相机还是其他。
SwiftttCamera
在处理图像方向方面也很智能,图像方向是来自 AVFoundation
和 UIImagePickerController
的图像中一个出了名的棘手部分。即使使用者在方向锁开启的情况下拍摄横向照片,也能神奇地正确检测到相机的方向,因为 SwiftttCamera
会检查加速计以确定设备的真实方向。
SwiftttCamera
可通过 Swift Package Manager 获得
dependencies: [
.package(name: "SwiftttCamera", url: "https://github.com/rogerluan/SwiftttCamera", .upToNextMajor(from: "1.0.0")),
]
要运行演示项目,请克隆或下载仓库,并打开 SwiftttCameraDemo/SwiftttCameraDemo.xcodeproj
SwiftttCamera 基准测试 | UIImagePickerController 基准测试 |
---|---|
![]() |
![]() |
将 SwiftttCamera
的实例添加为视图控制器的子视图。随意调整 SwiftttCamera
视图的大小和布局,SwiftttCamera
将自动调整相机的预览窗口并裁剪捕获的图像以匹配其边界内可见的内容。
import SwiftttCamera
import UIKit
class DemoViewController : UIViewController {
private lazy var camera: SwiftttCamera = {
let result = SwiftttCamera()
result.delegate = self
result.view.translatesAutoresizingMaskIntoConstraints = false
return result
}()
override func viewDidLoad() {
super.viewDidLoad()
swiftttAddChild(camera)
camera.view.frame = view.frame // Alternatively, you can set it up using autolayout
}
}
extension DemoViewController : CameraDelegate {
func cameraController(_ cameraController: CameraProtocol, didFinishCapturingImage capturedImage: CapturedImage) {
// Handle the captured image
}
}
在前置和后置摄像头之间切换
let newCameraDevice: CameraDevice = camera.cameraDevice.toggling()
guard SwiftttCamera.isCameraDeviceAvailable(newCameraDevice) else { return }
camera.cameraDevice = newCameraDevice
设置相机的闪光灯模式
camera.cameraFlashMode = shouldEnable ? .on : .off
设置相机的手电筒模式
let shouldEnable = enabled && camera.isTorchAvailableForCurrentDevice
camera.cameraTorchMode = shouldEnable ? .on : .off
拍照
camera.takePicture()
使用 SwiftttCamera
的委托方法在拍照后检索捕获的图像对象
func cameraController(_ cameraController: CameraProtocol, didFinishCapturingImage capturedImage: CapturedImage) {
// Optional protocol function
}
func cameraController(_ cameraController: CameraProtocol, didFinishScalingCapturedImage capturedImage: CapturedImage) {
// Optional protocol function
}
func cameraController(_ cameraController: CameraProtocol, didFinishNormalizingCapturedImage capturedImage: CapturedImage) {
// Optional protocol function
}
本项目强烈基于 FastttCamera,但由于该项目自 2016 年以来一直未维护,因此本项目旨在使这个出色的框架重获新生,具有相同的优势,但使用更现代的 API,并将支持的 SDK 限制为仅 iOS 13+。非常感谢 Laura Skelton,FastttCamera
的创建者,创建了如此出色的项目。没有她的工作,这个项目绝对不可能实现。 💪
如果您发现任何错误、遗漏,或者如果您想提出对本项目的改进建议,请打开 Issue 或 Pull Request 并提出您的想法,我保证在 24 小时内回复您!😇
本项目是开源的,并受标准的 2 条款 BSD 许可保护。这意味着您可以(公开、商业和私下)使用、修改和分发本项目的内容,只要您提及 Roger Oba 作为此代码的原始作者,并在您的应用程序、存储库、项目或研究论文中复制 LICENSE 文本。
Twitter: @rogerluan_