SwiftttCamera

Swifttty 且易于使用的 iOS 相机框架。

GitHub Action Build Status Swift 5.4 Latest release

Issues Follow on Twitter

查看演示 · 报告错误 · 请求功能

SwiftttCameraAVFoundation 的一个封装,让您能够构建自己强大的自定义相机应用,而无需直接使用 AVFoundation 的所有麻烦。

为何使用它?

SwiftttCamera 为您自动处理的主要麻烦

AVFoundation 的麻烦
设备方向的麻烦
图像处理的麻烦

SwiftttCamera 的许多操作比 UIImagePickerController 的相机更快,例如在前置和后置摄像头之间切换,并以您需要的格式为您提供捕获的照片,在大多数设备上,返回裁剪后的全分辨率图像的速度与 UIImagePickerController 返回原始捕获图像的速度一样快。它允许 AVFoundation 的所有灵活性,而无需重新发明轮子,因此您可以专注于制作漂亮的自定义 UI 并使用照片做很棒的事情。

虽然 UIImagePickerController 的相机和 AVFoundation 都为您提供原始图像,这些图像甚至可能未与您的用户看到的实时相机预览裁剪得相同,但 SwiftttCamera 为您提供裁剪为与您的实时预览视口相同宽高比的全分辨率图像,以及缩放到该视口像素尺寸的预览图像,无论您想要方形相机、全屏尺寸的相机还是其他。

SwiftttCamera 在处理图像方向方面也很智能,图像方向是来自 AVFoundationUIImagePickerController 的图像中一个出了名的棘手部分。即使使用者在方向锁开启的情况下拍摄横向照片,也能神奇地正确检测到相机的方向,因为 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 Benchmark Average Run Time UIImagePickerController Benchmark Average Run Time

用法

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 SkeltonFastttCamera 的创建者,创建了如此出色的项目。没有她的工作,这个项目绝对不可能实现。 💪

贡献

如果您发现任何错误、遗漏,或者如果您想提出对本项目的改进建议,请打开 Issue 或 Pull Request 并提出您的想法,我保证在 24 小时内回复您!😇

许可

本项目是开源的,并受标准的 2 条款 BSD 许可保护。这意味着您可以(公开、商业和私下)使用、修改和分发本项目的内容,只要您提及 Roger Oba 作为此代码的原始作者,并在您的应用程序、存储库、项目或研究论文中复制 LICENSE 文本。

联系方式

Twitter: @rogerluan_