Core Image:iOS图像处理技术追踪

本文介绍了如何在iOS和macOS应用中使用CoreImage与Metal进行视频处理,强调了设置MTLCommandQueue以提高性能,并详细讲解了如何编写自定义CoreImageKernel,以及利用CI_PRINT_TREE进行Debug支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


 创建CIContext

创建 CIContext 时,需要遵循一个 view 一个 context 的原则。由于视频的每一帧都会发生变化,将CIContext的cacheIntermediates属性设置为false可以大大减少内存消耗。

如果在使用Core Image时将同时运用Metal(作为输入或输出),通过设置MTLCommandQueue属性创建CIContext将会是较好选择。在不使用MTLCommandQueue的情况下,每一个Metal或CoreImage执行的任务都在不同队列中并以wait命令分隔开,导致任务执行效率低。通过设置MTLCommandQueue创建的CIContext和相应的Metal任务在同一队列中,能提高app的运行效率。

图一:不使用MTLCommandQueue的工作流程

图二:使用MTLCommandQueue的工作流程

 编写Core Image Kernel(在Metal中实现)

为了将效果处理得更丰富,通过Metal来实现自定义CI Kernel是个高效的选择。苹果官方提供了的许多方便部署的内置工具(都通过Metal实现),如内置CI滤镜。通过Metal实现自定义CI Kernel,不仅app的runtime编译时间将会大大减少(这段工作会移至app构建完成后进行),开发者还能获得高性能语言特性(如gather-reads、group-writes、半精度浮点数)、高效开发体验(如缩进检查、缩进高光)等功能。

 选择合适的View类

如果要对视频/动图应用特效,静态内容View如UIImageView或NSImageView应当被避免。AVPlayerView和MetalKit View(MTKView)是个两个不错的选择。前者为简单选择,后者为进阶选择。

使用AVPlayerView时,需要创建AVMutableVideoComposition对象,CI滤镜在block中执行图像处理任务。在进行断点debug时,通过点击CIImage对象地址右侧的眼睛图示可以浏览CI滤镜处理流程的详细信息。

官方提供的案例中,Core Image还将10位的HDR视频帧数据自动从HLG转化成了Core Image working space。

图三:CI Image断点测试中展现的处理流程

使用MTKView时,开发者需要以frame和device作为参数重载init方法。VIew对应的CIContext也将在init函数中被创建。如果我们在macOS中开发支持HDR的view,color-Pixel-Format属性需要被设定为rgba16Float,wants-Extended-Dynamic-Range-Content属性需要被设定为true。设定完init方法后,开发者需要实现draw-in view方法。需要注意的是,此处并未直接将Metal材质传入CIRenderDestination函数,而是创建了一个会返回texture的block。这使得CIContext能在前面的帧尚未完成时将Metal工作入队。之后该方法会执行渲染任务(至指定目的地)并创建command buffer将当前绘制结果渲染至view。

本人也亲自尝试了通过Core Image处理视频的整个流程。以下案例使用CIVortexDistortion滤镜对视频进行逐帧处理并渲染,展示内容包含核心代码、原视频、CI滤镜处理后视频以及断点测试的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值