Metal每日分享,海报画滤镜效果

news2024/11/26 17:43:48

本案例的目的是理解如何用Metal实现海报画效果滤镜,主要就是改变颜色级别数量从而获取到新的像素颜色;


Demo

  • HarbethDemo地址

实操代码

// 海报画滤镜
let filter = C7Posterize.init(colorLevels: 2.3)

// 方案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

效果对比图

  • 不同参数下效果
colorLevels: 1.03colorLevels: 2.3colorLevels: 5.03
WX20221213-112230.pngWX20221213-112244.pngWX20221213-112256.png

实现原理

  • 过滤器

这款滤镜采用并行计算编码器设计.compute(kernel: "C7Posterize"),参数因子[colorLevels]

对外开放参数

  • colorLevels: 减少图像空间的颜色级别数量;
public struct C7Posterize: C7FilterProtocol {
    
    public static let range: ParameterRange<Float, Self> = .init(min: 1.0, max: 255.0, value: 10.0)
    
    /// The number of color levels to reduce the image space to.
    /// This ranges from 1 to 256, with a default of 10
    public var colorLevels: Float = range.value
    
    public var modifier: Modifier {
        return .compute(kernel: "C7Posterize")
    }
    
    public var factors: [Float] {
        return [colorLevels]
    }
    
    public init(colorLevels: Float = range.value) {
        self.colorLevels = colorLevels
    }
}
  • 着色器

对输入像素x颜色级别数量再加上平均亮度half4(0.5h)取整floor,再除以颜色级别数量得到最终的像素颜色;

kernel void C7Posterize(texture2d<half, access::write> outputTexture [[texture(0)]],
                        texture2d<half, access::read> inputTexture [[texture(1)]],
                        constant float *colorLevelsPointer [[buffer(0)]],
                        uint2 grid [[thread_position_in_grid]]) {
    const half4 inColor = inputTexture.read(grid);
    
    const half colorLevels = half(*colorLevelsPointer);
    const half4 outColor = floor((inColor * colorLevels) + half4(0.5h)) / colorLevels;
    
    outputTexture.write(outColor, grid);
}

Harbeth功能清单

  • 支持ios系统和macOS系统
  • 支持运算符函数式操作
  • 支持多种模式数据源 UIImage, CIImage, CGImage, CMSampleBuffer, CVPixelBuffer.
  • 支持快速设计滤镜
  • 支持合并多种滤镜效果
  • 支持输出源的快速扩展
  • 支持相机采集特效
  • 支持视频添加滤镜特效
  • 支持矩阵卷积
  • 支持使用系统 MetalPerformanceShaders.
  • 支持兼容 CoreImage.
  • 滤镜部分大致分为以下几个模块:
    • Blend:图像融合技术
    • Blur:模糊效果
    • Pixel:图像的基本像素颜色处理
    • Effect:效果处理
    • Lookup:查找表过滤器
    • Matrix: 矩阵卷积滤波器
    • Shape:图像形状大小相关
    • Visual: 视觉动态特效
    • MPS: 系统 MetalPerformanceShaders.

最后

  • 慢慢再补充其他相关滤镜,喜欢就给我点个星🌟吧。
  • 滤镜Demo地址,目前包含100+种滤镜,同时也支持CoreImage混合使用。
  • 再附上一个开发加速库KJCategoriesDemo地址
  • 再附上一个网络基础库RxNetworksDemo地址
  • 喜欢的老板们可以点个星🌟,谢谢各位老板!!!

✌️.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不用虚拟机也能在Windows下使用Linux

想学习热门的Linux系统&#xff0c;可是一开始就需要安装虚拟机软件&#xff0c;这样很容易消耗Linux初学者的热情。比如常用的VMWare虚拟机&#xff0c;虽然步骤并不复杂&#xff0c;但是一开始的搭建和配置过程&#xff0c; 容易劝退一部分新手。我认为学习新的操作系统&…

看了这篇文章后,面试官再也不敢问你非结构化存储的原理了

那么你可能会说&#xff0c;是不是我无限制地增加从库的数量就可以抵抗大量的并发呢&#xff1f; 实际上并不是的。因为随着从库数量增加&#xff0c;从库连接上来的 IO 线程比较多&#xff0c;主库也需要创建同样多的 log dump 线程来处理复制的请求&#xff0c;对于主库资源消…

[附源码]Python计算机毕业设计飞羽羽毛球馆管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等…

人工智能课后作业_python实现深度优先遍历搜索(DFS算法)(附源码)

1 深度优先遍历搜索(DFS) 1.1算法介绍1.2实验代码1.3实验结果1.4实验总结 1.1算法介绍 深度优先搜索算法&#xff08;Depth-First-Search&#xff0c;DFS&#xff09;是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点&#xff0c;尽可能深的搜索树的分支。当节点…

知识图谱-KGE-第三方库:OpenKE库【清华开源】

GitHub - thunlp/OpenKE: An Open-Source Package for Knowledge Embedding (KE) OpenKE是THUNLP基于TensorFlow、PyTorch开发的用于将知识图谱嵌入到低维连续向量空间进行表示的开源框架。在OpenKE中&#xff0c;我们提供了快速且稳定的各类接口&#xff0c;也实现了诸多经典…

生态流量智能终端机介绍 功能 特点

平升电子生态流量智能终端机是一款集人机交互、视频叠加、4G路由、数据采集、逻辑运算与远程传输功能于一体的多媒体智能终端设备。 此款产品为水电站生态流量监测项目的专用产品&#xff0c;便于监管单位及时掌握水电站的流量下泄情况&#xff0c;以保障河湖生态用水&#xf…

Java序列化_unknown object tag -126

项目场景&#xff1a; 第一次进入获取员工信息的方法时&#xff0c;会先通过序列化数据库的对应员工信息并保存到 Redis 中。 第二次进入获取员工信息的方法时&#xff0c;直接取出 Redis 里序列化后员工信息&#xff0c;进行反序列化后返回。 问题描述 这里是第一次保存成功…

重温经典,推箱子游戏,你能闯到第几关?可自行添加关卡

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

WebDAV之葫芦儿·派盘+厚墨

厚墨 支持WebDAV方式连接葫芦儿派盘。 如果你喜欢看电子书又时常书荒,搜索不到想要的电子书,那就快来试试厚墨阅读APP吧。与你一同搜索极简阅读中的最佳体验。 厚墨是目前网络上非常方便的一款电子阅读软件,采用独家数据采集分析技术,汇合了移动互联网各种资源网站大数据…

【JavaSE成神之路】可变参数

哈喽&#xff0c;我是兔哥呀&#xff0c;今天就让我们继续这个JavaSE成神之路&#xff01; 这一节啊&#xff0c;咱们要学习的内容是Java的可变参数。 1.什么是可变参数 首先来看下概念。 Java的可变参数指的是在方法中设置不定数量的参数。可变参数使得代码更加简洁&#x…

用cocos creator实现《我的世界》

摘要 《我的世界》是一款非常流行的游戏&#xff0c;不过网上大多都是用unity还原实现的。那么用cocos实现一版&#xff0c;会是怎样的开发体验呢&#xff1f; 使用版本 使用最新的cocos creator 3.6.2版本 目前主要功能 生成地形方块创建与销毁角色移动、碰撞、重力和简单…

Java-MySQL-SQL函数

SQL函数 函数介绍 函数是 SQL 的一个非常强有力的特性&#xff0c;函数能够用于下面的目的&#xff1a; ● 执行数据计算 ● 修改单个数据项 ● 操纵输出进行行分组 ● 格式化显示的日期和数字 ● 转换列数据类型 SQL 函数有输入参数&#xff0c;并且总有一个返回值。 …

【云原生系列CKA备考】Kubernetes架构

目录前言一、Kubernetes架构1.1Master节点1.2 Node节点1.3 Add-ons1.3 Kubeadm二、相关命令2.1 查看组件运行状态2.2 kubeadm容器化组件三、总结前言 ​ OpenStack是管理虚拟机的&#xff0c;底层依靠虚拟化技术&#xff1b;kubernetes是管理容器的&#xff0c;底层也是依靠虚…

juery笔记

文章目录Jquery一、什么是 jQuery二、如何使用 jQuery三、如何选择 jQuery 版本四、jQuery 的运行原理实例方法1、一般通过一个字符串来标识匹配的元素2、支持多个选择器任意组合使用3、jQuery 特有的选择器&#xff0c;当然也可以和其他选择器任意组合使用4、元素筛选&#xf…

基于OpenGL的地形建模技术的研究与实现

毕业论文 基于OpenGL的地形建模技术的研究与实现 诚信声明 本人郑重声明&#xff1a;本设计&#xff08;论文&#xff09;及其研究工作是本人在指导教师的指导下独立完成的&#xff0c;在完成设计&#xff08;论文&#xff09;时所利用的一切资料均已在参考文献中列出。 本人…

代码随想录训练营第50天|LeetCode 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

参考 代码随想录 题目一&#xff1a;LeetCode 123.买卖股票的最佳时机III 确定dp数组下标及其含义 某一天最多存在5个状态&#xff1a; j 0&#xff1a;没有操作j 1&#xff1a;第一次买入j 2&#xff1a;第一次卖出j 3&#xff1a;第二次买入j 4&#xff1a;第二次卖出…

[附源码]Python计算机毕业设计SSM基于JAVA线上订餐系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

安卓电子名片管理器的设计与实现

毕业设计 安卓电子名片管理器的设计与实现 诚信申明 本人郑重声明&#xff1a;本设计&#xff08;论文&#xff09;及其研究工作是本人在指导教师的指导下独立完成的&#xff0c;在完成设计&#xff08;论文&#xff09;时所利用的一切资料均已在参考文献中列出。 本人签名&…

789. 数的范围

目录 题目&#xff1a;​编辑 题目思路&#xff1a; 解释&#xff1a; 方法&#xff1a; 对于k值所在左边界&#xff1a; 对于k值所在右边界&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 链接&#xff1a;789. 数的范围 - AcWing题库https://www.acwing.com/prob…