iOS CoreImage专题(二) —— 进阶

2024-09-03 04:38
文章标签 进阶 ios 专题 coreimage

本文主要是介绍iOS CoreImage专题(二) —— 进阶,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 前言
  • 管理线程安全
  • 滤镜链
  • 使用转场效果
  • 图像中的人脸检测
    • 人脸检测
    • 获取人脸和人脸的特征所在的矩形界限
  • 自动图像增强
    • 自动图像增强滤镜
    • 使用自动增强滤镜
  • 总结

前言

上一章节我们简单的介绍了CoreImage以及其滤镜的简单使用,包括对输出图像的渲染。这一部分我们将使用更高级一些的技巧:滤镜链、图像转场、人脸检测、自动图像增强等。

管理线程安全

在我们开始之前,先看一个比较重要的东西,那就是线程安全。

CIContext和CIImage对象都是不可变的,也就是说他们可以安全地共享给多个线程。多线程可以使用相同的GPU或者CPU下的CIContext对象来渲染CIImage对象。然而,这种情况并不能用于CIFilter对象,因为它是可变的。一个CIFilter对象不能安全地共享给多个线程。如果你的app是多线程的,每个线程必须创建它自己的CIFilter对象。否则你的app可能会产生一些意料之外的效果。

滤镜链

你可以创建一个滤镜链来获得一种amazing的效果。创建滤镜链就是把一个滤镜的的输出图像作为下一个滤镜的输入图像。我们来看看如何在一个图像上应用多个滤镜 – 变暗(CIGloom)以及凹凸变形(CIBumpDistortion)。
变暗的滤镜通过削弱一个图像的强光部分来让其变暗。下面的代码创建了一个滤镜然后把刚才调整色调的输出图像作为变暗滤镜的输入图像。这就是把滤镜连成一串,简单吧。

    CIFilter *gloom = [CIFilter filterWithName:@"CIGloom"];[gloom setDefaults];    // 1[gloom setValue: result forKey: kCIInputImageKey];[gloom setValue: @25.0f forKey: kCIInputRadiusKey]; // 2[gloom setValue: @0.75f forKey: kCIInputIntensityKey]; // 3result = [gloom valueForKey: kCIOutputImageKey]; // 4

1. 设置默认参数。在OS X中必须要手动调用才能设置默认参数,iOS则不需要,因为在iOS中在调用filterWithName的时候已经自动设置好了。
2. 设置输入半径为25。输入半径指定了效果的范围,可以从0变化到100,其默认值为10。之前提到了你能在代码中通过一个滤镜的属性字典来找到最大值、最小值和默认值。
3. 设置输入强度为0.75。输入强度是一个标量值,它指定了原图和输出图的线性混合。最小值为0,最大值为1,默认值为1。
4. 获取输出图像,而此时并有绘制图像。

代码到这里只是请求了一个输出图像而并没有绘制图像,下图展示了如果你在这时就绘制图像(在处理了色调和变暗后)的话图像将会显示成什么样子。

凹凸变形滤镜(CIBumpDistortion)在原图中一个指定的点创建一个凸起效果。下面的代码将展示如何创建、设置以及将其应用在之前的滤镜(变暗滤镜)的输出图像上。凹凸变形需要三个参数:指定效果的位置,效果的半径以及输入比例。

    CIFilter *bumpDistortion = [CIFilter filterWithName:@"CIBumpDistortion"]; //1[bumpDistortion setDefaults]; //2[bumpDistortion setValue: result forKey: kCIInputImageKey];[bumpDistortion setValue: [CIVector vectorWithX:200 Y:150]forKey: kCIInputCenterKey]; //3[bumpDistortion setValue: @100.0f forKey: kCIInputRadiusKey]; //4[bumpDistortion setValue: @3.0f forKey: kCIInputScaleKey]; //5result = [bumpDistortion valueForKey: kCIOutputImageKey];
  1. 通过滤镜名称创建滤镜
  2. 同样的需要在OS X中设置为默认值(iOS中则不需要)
  3. 设置效果的中心点在图像中的位置
  4. 设置凹凸半径为100像素
  5. 设置输入比例为3。输入比例指定了效果的方向和数量。默认值为-0.5。取值范围是-10.0到10.0。设置为0则表示没有效果。负值创建一个向外凸起的效果,正值则创建向内凸起的效果。

最终的渲染图像:

使用转场效果

转场效果通常被用于幻灯片的切换或者在视频中从一个场景切换到另一个场景。这种效果是随着时间的推移而渲染的,所以你要设置一个计时器。接下来要讲的是如何设置计时器,你将会学会如何设置拷贝机(copy machine)转场滤镜(CICopyMachine)并将其应用于两张图片。拷贝机转场将创建一根光条,就像你在拷贝机或者图像扫描器上看到的那样。这根光条在源图像上从左扫到右,扫过的地方将变成目标图像。下图展示了从一个滑雪靴到滑雪者的转场中&#x

这篇关于iOS CoreImage专题(二) —— 进阶的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132046

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key: