当前位置: 首页 > news >正文

网站上那些兼职网页怎么做昆明专业做网站多少钱

网站上那些兼职网页怎么做,昆明专业做网站多少钱,游戏网站模板免费下载,信阳优化公司引言 在上一篇文章中,我们初步完成了使用 AVFoundation 采集视频数据的流程,掌握了 AVCaptureSession 的搭建与视频流的预览显示。 本篇将继续深入 AVFoundation,聚焦于静态图片采集的实现。通过 AVCapturePhotoOutput,我们可以…

引言

在上一篇文章中,我们初步完成了使用 AVFoundation 采集视频数据的流程,掌握了 AVCaptureSession 的搭建与视频流的预览显示。

本篇将继续深入 AVFoundation,聚焦于静态图片采集的实现。通过 AVCapturePhotoOutput,我们可以快速搭建起拍照功能,并获取高质量的照片数据。

本文将详细介绍拍照的基本流程,包括如何创建输出、配置拍照参数、处理拍照回调,以及如何将拍摄到的照片保存到系统相册。结合实际示例,带你完成一套完整、稳定的拍照功能搭建。

在早期的 iOS 开发中,我们常常使用 AVCaptureStillImageOutput 来实现拍照功能。但从 iOS 10 开始,Apple 推荐使用更强大、功能更全面的 AVCapturePhotoOutput 进行静态图片采集。AVCapturePhotoOutput 不仅统一了拍照接口,还支持 HEIF 格式、Live Photo、深度数据、RAW 拍摄等高级特性,能够更好地满足高质量拍摄的需求。

接下来,我们将基于 AVCapturePhotoOutput,搭建一个基础的拍照流程。

搭建拍照功能

为了更好地管理拍照流程,我们将功能封装到一个自定义的PHCaptureController类中,负责完成会话的搭建、控制与拍照等操作。

整个拍照流程主要包括以下几个步骤:

  1. 配置 AVCaptureSession。
  2. 添加摄像头输入。
  3. 添加照片输出。
  4. 启动与停止会话。
  5. 处理拍照请求与回调。

下面我们来逐一实现。

1. 类的基本结构

我们先来创建一个PHCaptureController类,大致结构如下:

//
//  PHCaptureController.swift
//  PHCaptureExample
//
//  Created by Louis on 2025/4/23.
// 负责会话控制及拍照操作import UIKit
import AVFoundationclass PHCaptureController:NSObject {/// 会话private let session = AVCaptureSession()/// 输出private let photoOutput = AVCapturePhotoOutput()/// 输入private var captureDeviceInput: AVCaptureDeviceInput?/// 队列private let sessionQueue = DispatchQueue(label: "com.example.captureSession")/// 代理weak var delegate: PHCaptureProtocol?init() {}/// 配置会话func setupConfigureSession() { }/// 启动会话func startSession() { }/// 停止会话func stopSession() { }/// 拍照func takePhoto() { }}

可以看到我们在类的内部维护了:

  1. session:采集会话。
  2. photoOutput:用于拍照的会话输出。
  3. captureDeviceInput:当前使用的会话输入。
  4. sessionQueue:串行队列,保证采集相关操作的线程安全。
  5. delegate:代理,负责错误和结果的回调。

PHCaptureProtocol 实现如下:

//
//  PHCaptureProtocol.swift
//  PHCaptureExample
//
//  Created by Louis on 2025/4/23.
//import Foundation
import UIKitprotocol PHCaptureProtocol:NSObjectProtocol {/// 发生错误func captureError(_ error: Error)/// 拍照回调func capturePhoto(_ image: UIImage)}

包含了:

  1. captureError:发生错误的回调方法。
  2. capturePhoto:拍照结果的回调方法。

2. 配置采集会话

我们在 setupConfigureSession 方法中需要完成三个操作:

  1. 设置会话预设。
  2. 添加摄像头输入。
  3. 添加照片输出。

并且保证这些操作需要在会话 beginConfiguration 与 commitConfiguration 方法之间执行。

    /// 配置会话func setupConfigureSession() {session.beginConfiguration()// 1.设置会话预设setupSessionPreset()// 2.设置会话输入if !setupSessionInput() {delegate?.captureError(NSError(domain: "PHCaptureController", code: 1001, userInfo: [NSLocalizedDescriptionKey: "Failed to add input"]))return}// 3.设置会话输出if !setupSessionOutput() {delegate?.captureError(NSError(domain: "PHCaptureController", code: 1002, userInfo: [NSLocalizedDescriptionKey: "Failed to add output"]))return}session.commitConfiguration()}

2.1 设置会话预设

就是设置分辨率,比如高质量照片。

    /// 设置会话话预设private func setupSessionPreset() {session.sessionPreset = .photo}

2.2 设置会话输入

添加摄像头设备,并包装一层 AVCaptureDeviceInput 添加到会话中。

    /// 设置会话输入private func setupSessionInput() -> Bool {guard let device = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video,position: .back) else { return false }do {captureDeviceInput = try AVCaptureDeviceInput(device: device)if session.canAddInput(captureDeviceInput!) {session.addInput(captureDeviceInput!)return true} else {return false}} catch {delegate?.captureError(error)return false}}
  1. 首先要确保获取到了摄像头设备。
  2. 检测输入是否可以被添加到会话。
  3. 如果出现错误则直接回调。

2.3 设置会话输出

将图片输出添加到会话。

    /// 设置会话输出private func setupSessionOutput() -> Bool {if session.canAddOutput(photoOutput) {session.addOutput(photoOutput)return true} else {return false}}

添加输出时也要检测是否可以被添加到会话。

3. 会话的启动与停止

我们使用单独的串行队列来管理会话的启动与停止,避免出现线程问题。

    /// 启动会话func startSession() {sessionQueue.async {if !self.session.isRunning {self.session.startRunning()}}}/// 停止会话func stopSession() {sessionQueue.async {if self.session.isRunning {self.session.stopRunning()}}}

4. 拍照

在拍照的方法里设置拍照参数和代理,并实现 AVCapturePhotoCaptureDelegate 的代理方法。

    /// 拍照func takePhoto() {let settings = AVCapturePhotoSettings()settings.flashMode = .autosettings.isHighResolutionPhotoEnabled = truesessionQueue.async {self.photoOutput.capturePhoto(with: settings, delegate: self)}}//MARK: - AVCapturePhotoCaptureDelegatefunc photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: (any Error)?) {if let error = error {delegate?.captureError(error)return}guard let imageData = photo.fileDataRepresentation() else {delegate?.captureError(NSError(domain: "PHCaptureController", code: 1003, userInfo: [NSLocalizedDescriptionKey: "Failed to get image data"]))return}guard let image = UIImage(data: imageData) else {delegate?.captureError(NSError(domain: "PHCaptureController", code: 1004, userInfo: [NSLocalizedDescriptionKey: "Failed to create image"]))return}delegate?.capturePhoto(image)}

整个拍照的核心功能就已经搭建完成了,接下来我们只需要添加画面预览,就可以调用这个类来实现完整的拍照功能了。

5. 画面预览

为了能够实时显示摄像头画面,我们需要一个专门的预览视图。

在 AVFoundation 中,通常通过 AVCaptureVideoPreviewLayer 来实现摄像头画面渲染,因此我们可以自定义一个简单的 PHPreviewView。

import UIKit
import AVFoundationclass PHPreviewView: UIView {override class var layerClass: AnyClass {return AVCaptureVideoPreviewLayer.self}private var previewLayer: AVCaptureVideoPreviewLayer {return layer as! AVCaptureVideoPreviewLayer}func setSession(_ session: AVCaptureSession) {previewLayer.session = sessionpreviewLayer.videoGravity = .resizeAspectFill}
}

使用拍照功能

接下来我们只需要在视图控制器中,非常简单的接入一下拍照的控制器和预览视图就可以使用拍照功能咯。

import UIKit
import AVFoundationclass ViewController: UIViewController,PHCaptureProtocol {/// 拍照控制器let captureController = PHCaptureController()/// 预览视图let previewView = PHPreviewView()override func viewDidLoad() {super.viewDidLoad()captureController.setupConfigureSession()captureController.delegate = selfcaptureController.startSession()previewView.setSession(captureController.session)view.addSubview(previewView)previewView.frame = view.bounds}//MARK: - PHCaptureProtocolfunc captureError(_ error: any Error) {}func capturePhoto(_ image: UIImage) {}}

结语

在本篇中,我们基于 AVFoundation 框架,搭建了一个基本的拍照功能实现流程:

包括配置 AVCaptureSession、添加 AVCaptureDeviceInput 和 AVCapturePhotoOutput、设置预览视图 PHPreviewView,并通过 AVCapturePhotoCaptureDelegate 拿到照片数据,为后续保存、展示、处理照片打下了基础。

需要特别注意的是:在正式使用相机功能之前,务必进行权限申请和检测。

如果未申请或未获得相机访问权限,直接启动 AVCaptureSession 会导致应用崩溃或黑屏。

通常,我们会在 App 启动或功能入口时,通过 AVCaptureDevice.requestAccess(for: .video) 请求权限,并根据权限结果决定是否继续初始化采集相关流程。

到这里,我们已经完成了拍照功能的基本搭建,感谢大家的阅读。

 

 

 

 

http://www.dtcms.com/a/468495.html

相关文章:

  • 策划的网站购物网站页面设计思路
  • 如果做网站运营网站构架图怎么做
  • 西部空间怎样上传网站2019建一个什么网站最好
  • 如何登录网站备案网站建设办公软件销售技巧
  • 建一个网站需要哪些东西三合一网站什么意思
  • 重庆房产信息网官网外贸seo网站制作
  • 商城建设网站开发住房和城乡建设部网站31号文
  • 北京城建设计集团网站深圳鹏洲建设工程有限公司网站
  • 专业做二手网站有哪些经典营销案例分析
  • 黄山网站建设哪家好企业网站搭建的优点
  • 可信网站认证查询郑州做网站擎天
  • 昆明网站排名优化价格东莞百度seo排名
  • 深圳宝安区住房和建设局网站网店推广新趋势
  • 宣城做w网站的公司gif素材网站推荐
  • 中国和城乡建设部网站开源商城小程序
  • 泰州网站制作公司中国建设银行保函查询网站
  • 做非洲出口的网站自我介绍的网页设计作业
  • 邢台网站优化公司企业级网站开发与部署
  • 珠海网站建设服务网站制作论文文献综述
  • 做折页的网站网站建设的平台
  • 做网站要有哪些知识大连网站建设大连
  • 郑州市惠济区城乡建设局网站淄博百度
  • 做网页前端接活网站网络建设服务与网站运营推广
  • 做建材加盟什么网站好wordpress数据库设置密码
  • 网站静态页有哪些做问卷调查的网站
  • 中细软做的网站dede网站 设置404 错误页面
  • 有限责任公司公司章程范本自动app优化最新版
  • 基于ASP与Access数据库的网站开发为什么电脑打开那个做网站都是那一个
  • 找做网站的上什么app网络服务器异常是怎么回事
  • 建立企业的网站有哪几种方案郑州建设信息网首页图