Metal每日分享,UV去雾滤镜效果
本案例的目的是理解如何用Metal实现去雾效果滤镜,类似于UV过滤器;
Demo
- HarbethDemo地址
实操代码
// 去雾效果滤镜
let filter = C7Haze.init(distance: 0.5, slope: 0.5)// 方案1:
ImageView.image = try? BoxxIO(element: originImage, filters: [filter, filter2, filter3]).output()// 方案2:
ImageView.image = originImage.filtering(filter, filter2, filter3)// 方案3:
ImageView.image = originImage ->> filter ->> filter2 ->> filter3
效果对比图
- 不同参数下效果
distance: 0.25, slope: 0.25 | distance: 0.25, slope: 0.5 | distance: 0.4, slope: 0.5 |
---|---|---|
实现原理
- 过滤器
这款滤镜采用并行计算编码器设计.compute(kernel: "C7Haze")
,参数因子[distance, slope]
;
对外开放参数
distance
: 应用颜色的强度;slope
: 颜色变化量;
/// 去雾,类似于UV过滤器
public struct C7Haze: C7FilterProtocol {/// Strength of the color applied.public var distance: Float = 0/// Amount of color change.public var slope: Float = 0public var modifier: Modifier {return .compute(kernel: "C7Haze")}public var factors: [Float] {return [distance, slope]}public init(distance: Float = 0, slope: Float = 0) {self.distance = distanceself.slope = slope}
}
- 着色器
归一化y乘以颜色变化量,加上强度,得到像素颜色(inColor - dd * white) / (1.0h - dd)
;
kernel void C7Haze(texture2d<half, access::write> outputTexture [[texture(0)]],texture2d<half, access::read> inputTexture [[texture(1)]],constant float *hazeDistance [[buffer(0)]],constant float *slope [[buffer(1)]],uint2 grid [[thread_position_in_grid]]) {const half4 inColor = inputTexture.read(grid);const half4 white = half4(1.0h);const half dd = half(grid.y) / half(inputTexture.get_height()) * half(*slope) + half(*hazeDistance);const half4 outColor = half4((inColor - dd * white) / (1.0h - dd));outputTexture.write(outColor, grid);
}
Harbeth功能清单
- 支持ios系统和macOS系统
- 支持运算符函数式操作
- 支持多种模式数据源 UIImage, CIImage, CGImage, CMSampleBuffer, CVPixelBuffer.
- 支持快速设计滤镜
- 支持合并多种滤镜效果
- 支持输出源的快速扩展
- 支持相机采集特效
- 支持视频添加滤镜特效
- 支持矩阵卷积
- 支持使用系统 MetalPerformanceShaders.
- 支持兼容 CoreImage.
- 滤镜部分大致分为以下几个模块:
- Blend:图像融合技术
- Blur:模糊效果
- Pixel:图像的基本像素颜色处理
- Effect:效果处理
- Lookup:查找表过滤器
- Matrix: 矩阵卷积滤波器
- Shape:图像形状大小相关
- Visual: 视觉动态特效
- MPS: 系统 MetalPerformanceShaders.
最后
- 慢慢再补充其他相关滤镜,喜欢就给我点个星
Metal每日分享,UV去雾滤镜效果相关推荐
- Metal每日分享,图像单色滤镜效果
本案例的目的是理解如何用Metal实现图像单色效果滤镜,将图像转换为单色版本,根据每个像素的亮度进行着色: Demo HarbethDemo地址 实操代码 // 去雾效果滤镜 let filter = ...
- Metal每日分享,纯色图片滤镜效果
本案例的目的是理解如何用Metal实现纯色图片效果滤镜,主要就是生成纯色图片: Demo HarbethDemo地址 实操代码 // 纯色滤镜 ImageView.image = C7Color.pu ...
- Metal每日分享,颜色转换滤镜效果
本案例的目的是理解如何用Metal实现像素颜色转换滤镜,通过对像素颜色的不同读取方式获取到相应像素颜色,灰度图移除场景中除了黑白灰以外所有的颜色,让整个图像灰度化: Demo HarbethDemo地 ...
- Metal每日分享,虚假颜色混合滤镜效果
本案例的目的是理解如何用Metal实现虚假颜色效果滤镜,使用图像的亮度在两种用户指定的颜色之间进行混合: Demo HarbethDemo地址 实操代码 // 混合颜色 let filter = C7 ...
- Metal每日分享,均值模糊滤镜效果
本案例的目的是理解如何用Metal实现均值模糊效果滤镜,均值模糊原理其实很简单通过多个纹理叠加,每个纹理偏移量设置不同达到一点重影效果来实现模糊; Demo HarbethDemo地址 实操代码 // ...
- Metal每日分享,海报画滤镜效果
本案例的目的是理解如何用Metal实现海报画效果滤镜,主要就是改变颜色级别数量从而获取到新的像素颜色: Demo HarbethDemo地址 实操代码 // 海报画滤镜 let filter = C7 ...
- Metal每日分享,调节亮度滤镜效果
本案例的目的是理解如何用Metal实现调节亮度滤镜,简单讲就是通过对像素rgb+亮度值来改变图片亮度; Demo HarbethDemo地址 实操代码 // 调节亮度滤镜 let filter = C ...
- Metal每日分享,调整对比度滤镜效果
本案例的目的是理解如何用Metal实现调整对比度效果滤镜,调整对比度就是在保证平均亮度不变的情况下,扩大或缩小亮的点和暗的点之间的差异: Demo HarbethDemo地址 实操代码 // 对比度 ...
- Metal每日分享,自然饱和度滤镜效果
本案例的目的是理解如何用Metal实现自然饱和度效果滤镜,简单讲就是调整图像整体的明亮程度,如调节到较高数值,图像会产生色彩过饱和从而引起图像失真: Demo HarbethDemo地址 iDay每日 ...
最新文章
- Playing Video on iPhone Cocos2D-X
- 工业用微型计算机(20)-指令系统(15)
- 安装虚拟机和docker封装
- 获取控制台窗口的句柄(HWND)和程序中输出回车键
- Android开发 - 掌握ConstraintLayout(七)辅助线(Guideline)
- 【多线程学习第一弹】支持value重复的双向Map
- iOS开发,更改状态栏(StatusBar)文字颜色为白色
- 牛客寒假算法集训营(4)
- nyoj - 168房间安排
- 优思学院|2021中质协六西格玛绿带考题及答案
- 怎么用python爬豆瓣_完全小白篇-用python爬取豆瓣影评
- 仿生蜘蛛机器人的制作
- JAVA:实现ClosestPair最近对算法(附完整源码)
- Flink状态一致性检查点
- SAP英语专栏:第1篇
- DJ logo图片 DJ logo设计
- 微信公众平台商业模式探索
- MATLAB学习笔记 皮尔逊相关系数和模板匹配
- 注册D8读卡器COM组件
- 【四则运算】个人项目实践
热门文章
- python中sum函数的使用方法及实例_python 运行sum函数的使用
- 【Unity3D】立方体纹理(Cubemap)和天空盒子(Skybox)
- Linux 之八 完整嵌入式 Linux 环境及构建工具、(交叉)编译工具链、CPU 体系架构
- 洛谷—— P1775 古代人的难题_NOI导刊2010提高(02)
- Java线程安全集合总结
- Ubuntu 16.04.6 安装流程报告
- iPhone也能一键完成录音转文字,堪称会议神器!老板看了都称赞
- 提醒!手机卡注销前,一定要做的四件事!
- 防关联是什么|亚马逊电商
- 用MFC制作一个倒计时小程序
- Metal每日分享,图像单色滤镜效果