ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Core Image:iOS图像处理技术追踪
[打印本页]
作者:
梦应逍遥
时间:
2024-6-15 00:22
标题:
Core Image:iOS图像处理技术追踪
图四:断点调试时Core Image对每帧的处理流程
基于Metal构建Core Image Kernel
==============================
利用CI Kernel有诸多上风,包括上文提及的收缩runtime编译时间、高性能语言特性(如gather-reads、group-writes、半精度浮点数)、高效开发体验(如缩进查抄、缩进高光)。基于Metal构建CI Kernel有5步流程,会在下文进行逐一介绍。
▐
在项目中增加自定义构建规则
苹果官方保举在项目target中增加两项自定义构建规则。第一个构建规则针对以“.ci.metal”为后缀名的文件。该构建规则会创建一个以“.ci.air”为后缀名的二进制输出文件。
图五:针对“*.ci.metal”文件的构建规则
第二个构建规则针对以“.ci.air”为后缀名的文件(上一个构建规则的输出结果)。该构建规则会在app的资源文件夹内创建以“.ci.metallib”为后缀名的输出文件。
图六:针对“*.ci.air”文件的构建规则
▐
在项目中增加.ci.metal资源
在Xcode提供的创建面板中选择Metal File即可。开发者对Metal File进行定名时需要以“.ci”作为后缀名,这样项目中新天生的文件会以“.ci.metal”作为后缀名。
▐
编写Metal Kernel
便携Metal Kernel需要include CoreImage.h头文件,用来利用Metal和Core Image提供的各种类。官方提供的范例编写了一个CIColorKernel,输入参数为coreimage::samle_t对象(表示输入图片的一个像素)、time和coreimage::destination对象,返回float4像素。
图七:苹果官方提供的代码范例:Metal Kernel编写
苹果官方为开发者提供了描述CI Kernel中Metal Shader语言的文档,详情见「 Metal Shading Language for Core Image Kernels」① 。
▐
加载Kernel并应用于新图像(基于Swift)
Kernel会被CI滤镜的子类利用。苹果官方保举开发者在实例化滤镜的CIKernel对象时利用静态属性(static property),这种环境下加载metallib资源的工作仅会实行一次(在首次需要时)。CI滤镜的子类也必须重载输出图片的属性,Kernel将在getter中进行图像处理并创建新图像。
图八:苹果官方提供的代码范例:Kernel加载与利用
Core Image的Debug支持
======================
苹果官方在WWDC20详细介绍了Debug特性:CI_PRINT_TREE。
▐
什么是CI_PRINT_TREE
CI_PRINT_TREE的底子框架与Xcode提供的Core Image Quick Look支持雷同。Core Image Quick Look为开发者提供了快捷可视化的Core Image图片(详见上文图三),而CI_PRINT_TREE支持几种不同的模式和选项用来查看Core Image怎样优化和渲染图像。
▐
怎样启用CI_PRINT_TREE
苹果官方提供了CI_PRINT_TREE的两种启动方式。最常用的方法是编辑Xcode target scheme,在Arugments窗体下的环境变量列表中参加CI_PRINT_TREE并设置值。另一种方法是在Terminal.app中通过下令行启动CI_PRINT_TREE(需要在实行应用步伐前设定)。
图九:启用CI_PRINT_TREE的两种方式
▐
怎样控制CI_PRINT_TREE
CI_PRINT_TREE的字符串格式为“ ”
**graph type:**表示Core Image render的多少stage,包括type-1初始图像(有助于查看被利用的色彩空间)、type-2优化后的图像(有助于查看core image对render的优化结果)、type-4级联图像(有助于查看各stage怎样级联于GPU步伐,以便了解render需要多少中间缓存)以及type-7(输出图像type1、2和4)。
图十:苹果官方对graph type四个stage的描述
**output type:**输出格式可以是pdf或png。在macOS上trees会被存储在临时项目文件夹,在iOS上trees会被存储在文档(Documents)目次下。假如output type没有确定,core image会把tree以紧凑文本格式输出在标准输出(stdout)。通过设置CI_LOG_FILE=“oslog”,文本也可以前往Console.app(在iOS开发中更为方便)。
**options:**对于CI_PRINT_TREE,开发者可以设定额外的选项。如通过设定context==name来限定输出(仅输出名字雷同的context),或是通过设定frame-n来框定详细输出context的哪一帧。更多option及详情请见图十一。设定option对debug能提供很大帮助,但也需谨慎利用,由于生产这些文件需要额外的时间和内存。
图十一:苹果官方提供的option
图十二:type设定为7时tmp文件夹下的文件
▐
怎样获得CI_PRINT_TREE文件
在macOS中,开发者只需要进入“/tmp”文件夹就能找到天生的CI_PRINT_TREE文件。需要注意的是沙盒应用会利用特有的临时存储文件夹。
在iOS中,开发者需要将Custom iOS Target Properties中的“Application supports iTunes file sharing”项设为YES(图十三)。这样天生的CI_PRINT_TREE文件可以在连接中的iOS设备上被找到并拖拽至macOS存储中。
图十三:Custom iOS Target Properties中进行设置
▐
怎样解释CI_PRINT_TREE文件
读CI_PRINT_TREE时,需要遵循以下规则:
输入在底层,输出在顶层
绿色节点代表卷曲内核(warp kernel),赤色节点代表颜色内核(color kernel)
图十四:绿色节点与赤色节点示例
在树的初始位置(initial tree)很容易找到颜色搭配节点(colormatch nodes),内里记载了搭配前后的色彩空间名称。苹果官方提供的案例为ITUR_2100_HLG_to_workingspace,即HLG色彩空间转化为Core Image线性色彩空间。
图十五:苹果官方案例中initial tree对色彩空间的描述
每个节点会显示Region of Interest(ROI),表示该节点在render中被利用的范围。
假如开发者在CI_PRINT_TREE控制字符串中选择type-4并在option中设定dump-intermediates,产生的级联图片会展示中间缓存的每一次pass(除了output pass)及其耗时、像素点数目和像素点格式(用来查找耗时大、占内存大的pass)。这对render内追踪错误非常有帮助。假如树中没有展示中间图,那么说明这张图在先前渲染的时候已被缓存,因此Core Image没有渲染它的必要。
图十六:设定dump-intermediates的debug结果展示
Core Image在手淘图片库中的应用大概
==========================
手淘图片库中的CDN图片适配处理库(TBCDNImage)的焦点目标是为不同终端设备、网络环境下的图片展示提供最优解。目前思量的维度重要是终端设备硬件和网络状态,思量的参数则是图片尺寸、压缩比率、锐化等图片属性。随着苹果在Core Image、端智能(CoreML)、硬件支持(自研芯片)等方面进行技术提升,手淘的CDN图片适配处理库可以思量增加“图片内容”作为新的维度,增加亮度、对比度、滤镜、图片种类等新参数。以下为部分应用场景:
辨认亮度较暗的图片,提升亮度做CDN图片适配处理
判定图片内容种类(如美食),根据不同内容种类的图片增加适合的滤镜做CDN图片适配处理
根据移动终端设备屏幕亮度(或深/淡色模式)修改图片色调做CDN图片适配处理,达到护眼结果
===
对Core Image技术的展望
====================
总结全文,WWDC20对Core Image技术的提升重要在三方面:
优化CI对视频/动图的支持,包括开发流程简化、逐帧处理性能提升等。
允许开发者更自由的构建Core Image Kernel,使CI的殊效处理更加丰富
那么怎样才能正确的掌握Redis呢?
为了让大家可以或许在Redis上可以或许加深,所以这次给大家准备了一些Redis的学习资料,还有一些大厂的面试题,包括以下这些面试题
并发编程面试题汇总
JVM面试题汇总
Netty常被问到的那些面试题汇总
Tomcat面试题整理汇总
Mysql面试题汇总
Spring源码深度解析
Mybatis常见面试题汇总
Nginx那些面试题汇总
Zookeeper面试题汇总
RabbitMQ常见面试题汇总
JVM常频面试:
Mysql面试题汇总(一)
Mysql面试题汇总(二)
Redis常见面试题汇总(300+题)
Mysql面试题汇总
Spring源码深度解析
Mybatis常见面试题汇总
Nginx那些面试题汇总
Zookeeper面试题汇总
RabbitMQ常见面试题汇总
JVM常频面试:
[外链图片转存中…(img-CmEodzbC-1714283123216)]
Mysql面试题汇总(一)
[外链图片转存中…(img-PgZuW5j5-1714283123216)]
Mysql面试题汇总(二)
[外链图片转存中…(img-shlfVVNf-1714283123216)]
Redis常见面试题汇总(300+题)
[外链图片转存中…(img-SNl1P2DK-1714283123217)]
本文已被CODING开源项目:【一线大厂Java面试题解析+焦点总结学习笔记+最新讲解视频+实战项目源码】收录
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4