iOS 上 UIImage 的运动模糊效果

2024-01-21

有没有办法在 UIImage 上获得运动模糊效果? 我尝试了 GPUImage、Filtrr 和 iOS Core Image,但所有这些都有常规模糊 - 没有运动模糊。

我也尝试过 UIImage-DSP,但它的运动模糊几乎不可见。我需要更强大的东西。


正如我对存储库的评论一样,我刚刚向 GPUImage 添加了运动和缩放模糊。它们是 GPUImageMotionBlurFilter 和 GPUImageZoomBlurFilter 类。这是变焦模糊的示例:

对于运动模糊,我在单个方向上进行 9 次高斯模糊。这是使用以下顶点和片段着色器实现的:

Vertex:

 attribute vec4 position;
 attribute vec4 inputTextureCoordinate;

 uniform highp vec2 directionalTexelStep;

 varying vec2 textureCoordinate;
 varying vec2 oneStepBackTextureCoordinate;
 varying vec2 twoStepsBackTextureCoordinate;
 varying vec2 threeStepsBackTextureCoordinate;
 varying vec2 fourStepsBackTextureCoordinate;
 varying vec2 oneStepForwardTextureCoordinate;
 varying vec2 twoStepsForwardTextureCoordinate;
 varying vec2 threeStepsForwardTextureCoordinate;
 varying vec2 fourStepsForwardTextureCoordinate;

 void main()
 {
     gl_Position = position;

     textureCoordinate = inputTextureCoordinate.xy;
     oneStepBackTextureCoordinate = inputTextureCoordinate.xy - directionalTexelStep;
     twoStepsBackTextureCoordinate = inputTextureCoordinate.xy - 2.0 * directionalTexelStep;
     threeStepsBackTextureCoordinate = inputTextureCoordinate.xy - 3.0 * directionalTexelStep;
     fourStepsBackTextureCoordinate = inputTextureCoordinate.xy - 4.0 * directionalTexelStep;
     oneStepForwardTextureCoordinate = inputTextureCoordinate.xy + directionalTexelStep;
     twoStepsForwardTextureCoordinate = inputTextureCoordinate.xy + 2.0 * directionalTexelStep;
     threeStepsForwardTextureCoordinate = inputTextureCoordinate.xy + 3.0 * directionalTexelStep;
     fourStepsForwardTextureCoordinate = inputTextureCoordinate.xy + 4.0 * directionalTexelStep;
 }

分段:

 precision highp float;

 uniform sampler2D inputImageTexture;

 varying vec2 textureCoordinate;
 varying vec2 oneStepBackTextureCoordinate;
 varying vec2 twoStepsBackTextureCoordinate;
 varying vec2 threeStepsBackTextureCoordinate;
 varying vec2 fourStepsBackTextureCoordinate;
 varying vec2 oneStepForwardTextureCoordinate;
 varying vec2 twoStepsForwardTextureCoordinate;
 varying vec2 threeStepsForwardTextureCoordinate;
 varying vec2 fourStepsForwardTextureCoordinate;

 void main()
 {
     lowp vec4 fragmentColor = texture2D(inputImageTexture, textureCoordinate) * 0.18;
     fragmentColor += texture2D(inputImageTexture, oneStepBackTextureCoordinate) * 0.15;
     fragmentColor += texture2D(inputImageTexture, twoStepsBackTextureCoordinate) *  0.12;
     fragmentColor += texture2D(inputImageTexture, threeStepsBackTextureCoordinate) * 0.09;
     fragmentColor += texture2D(inputImageTexture, fourStepsBackTextureCoordinate) * 0.05;
     fragmentColor += texture2D(inputImageTexture, oneStepForwardTextureCoordinate) * 0.15;
     fragmentColor += texture2D(inputImageTexture, twoStepsForwardTextureCoordinate) *  0.12;
     fragmentColor += texture2D(inputImageTexture, threeStepsForwardTextureCoordinate) * 0.09;
     fragmentColor += texture2D(inputImageTexture, fourStepsForwardTextureCoordinate) * 0.05;

     gl_FragColor = fragmentColor;
 }

作为优化,我使用角度、模糊大小和图像尺寸来计算片段着色器外部纹理样本之间的步长。然后将其传递到顶点着色器,以便我可以计算那里的纹理采样位置并在片段着色器中对它们进行插值。这可以避免 iOS 设备上的依赖纹理读取。

变焦模糊要慢得多,因为我仍然在片段着色器中进行这些计算。毫无疑问,有一种方法可以优化它,但我还没有尝试过。变焦模糊使用 9 命中高斯模糊,其中方向和每个样本的偏移距离根据像素位置与模糊中心的位置而变化。

它使用以下片段着色器(和标准直通顶点着色器):

 varying highp vec2 textureCoordinate;

 uniform sampler2D inputImageTexture;

 uniform highp vec2 blurCenter;
 uniform highp float blurSize;

 void main()
 {
     // TODO: Do a more intelligent scaling based on resolution here
     highp vec2 samplingOffset = 1.0/100.0 * (blurCenter - textureCoordinate) * blurSize;

     lowp vec4 fragmentColor = texture2D(inputImageTexture, textureCoordinate) * 0.18;
     fragmentColor += texture2D(inputImageTexture, textureCoordinate + samplingOffset) * 0.15;
     fragmentColor += texture2D(inputImageTexture, textureCoordinate + (2.0 * samplingOffset)) *  0.12;
     fragmentColor += texture2D(inputImageTexture, textureCoordinate + (3.0 * samplingOffset)) * 0.09;
     fragmentColor += texture2D(inputImageTexture, textureCoordinate + (4.0 * samplingOffset)) * 0.05;
     fragmentColor += texture2D(inputImageTexture, textureCoordinate - samplingOffset) * 0.15;
     fragmentColor += texture2D(inputImageTexture, textureCoordinate - (2.0 * samplingOffset)) *  0.12;
     fragmentColor += texture2D(inputImageTexture, textureCoordinate - (3.0 * samplingOffset)) * 0.09;
     fragmentColor += texture2D(inputImageTexture, textureCoordinate - (4.0 * samplingOffset)) * 0.05;

     gl_FragColor = fragmentColor;
 }

请注意,出于性能原因,这两种模糊都以 9 个样本进行硬编码。这意味着,在较大的模糊尺寸下,您将开始看到来自此处有限样本的伪影。对于较大的模糊,您需要多次运行这些滤镜或扩展它们以支持更多高斯样本。然而,由于 iOS 设备上的纹理采样带宽有限,更多样本将导致渲染时间变慢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 上 UIImage 的运动模糊效果 的相关文章

  • ios - 在哪里放置 s.static_framework = true

    我在 CocoaPods 中的级别为 0 当我使用pod install有一个错误说 The Pods App target has transitive dependencies that include static framework
  • 企业发行版在 Swift 应用程序中与 iOS8 配合不佳

    我在使用 swift 应用程序在 iOS 8 设备上运行 Enterprise 版本时遇到问题 如果我使用非企业帐户进行代码签名 它似乎工作正常 有人遇到这个问题吗 以下是我在尝试使用企业帐户运行构建以进行协同设计时在 iOS 设备上收到的
  • 在 HTML5 iOS 7 / iOS 8 中显示十进制键盘

    经过几个小时的搜索后 我只是有一个简单的问题 是否有可能在网络浏览器输入字段中显示小数键盘 input type number 只显示数字 但我需要在左下角使用逗号或点 我尝试过任何事情 pattern step等等 但没有显示十进制键盘
  • iOS 电池监控 Swift

    我已将监控设置为启用 但模拟器和设备中的电池电量仍然为 1 UIDevice currentDevice batteryMonitoringEnabled true var level UIDevice currentDevice batt
  • iOS 上的 UIBezierPath 操作

    我从一条直线开始 我希望用户能够触摸并拖动该线 使其弯曲 实际上 他们有能力将线条操纵成波浪形状 我不确定从技术上实现这一目标的最简单方法 我首先创建了三次曲线的 UIBezierPaths 数组 目的是操纵控制点 但似乎一旦绘制了 UIB
  • UIDocumentInteractionController 阻止“打开方式”表中的空投

    在我的应用程序中 我允许用户通过 Instagram 分享照片 这需要使用 UIDocumentInteractionController 如果手机支持 则会自动检测空投 如何将其从 打开方式 操作表中删除 即使我使用 UIActivity
  • 在 SwiftUI 中使用分段式选取器在两个页面之间滑动

    我有一个Picker with pickerStyle SegmentedPickerStyle 使其成为分段控件 我想让页面在之间平滑滑动 而不是使用条件语句替换视图 这是我迄今为止所做的 gif 这是到目前为止的代码 由if 而不是在不
  • 如何防止Apple Watch进入睡眠状态?

    我们正在开发一个 Apple Watch 项目 但如果不被打扰 手表就会进入睡眠状态 有什么办法可以阻止它进入睡眠状态吗 据我所知和有关该主题的其他搜索 目前还没有api可通过编程方式启用或禁用 Apple Watch 的睡眠模式
  • 如何在 iOS 中更改部分透明图像的颜色?

    我有一个具有部分透明度的单色图像 我有正常版本和 2X 版本的图像 我希望能够用代码将图像着色为不同的颜色 下面的代码适用于普通图像 但 2X 最终会出现伪影 正常图像可能有类似的问题如果是这样 由于分辨率的原因我无法检测到它 UIImag
  • iOS 中的构建对象文件扩展名是什么?

    当我在项目中构建java对象类时 将创建带有 class扩展名的构建文件 并且人类不可读 快速构建文件怎么样 example car java gt build gt car class 构建后会是什么 car swift gt build
  • SiriKit 错误:此应用程序不支持捐赠意图

    我在 Xcode 10 iOS 12 Beta 中捐赠自定义意图时遇到问题 我创建了一个在我的主应用程序目标和 OrderIntent 目标之间共享的自定义框架 我创建了一个 intentdefinition 文件 并将目标成员资格设置为我
  • 致命错误:在字典中发现“地理编码地标”类型的重复键。 (Mapbox 地理编码器)

    我引用 这通常意味着要么该类型违反了 Hashable 的要求 要么此类字典的成员在插入后发生了变化 我正在使用 Mapbox Geocoder 当发生此运行时错误时 我的 XCode 将我带到线程 1 0 swift runtime on
  • iOS 循环对象的属性并添加操作

    我有一个具有几个类似属性的类 UISliders 我想添加用户开始和结束使用每个滑块时的操作 每个滑块都将链接到同一个选择器 因此我考虑只是迭代它们 而不是编写 10 个几乎相同的代码块 问题是 最有效的方法是什么 我尝试过这样的事情 在运
  • iphone:如何停止快门动画?

    我有两个问题 1 我想知道如何在相机加载时停止快门动画 我正在使用 UIImagePickerController 我已经参考了堆栈溢出的许多答案 但没有成功 2 我在相机中有一个自定义按钮 使用cameraOverlayView并想通过单
  • 指定访问组时出现 KeychainItemWrapper 错误

    相当长一段时间以来 我一直在使用 KeychainItemWrapper 的 ARC 版本成功读取和写入私有钥匙串项目 我现在正在努力将我的 iOS 应用程序转换为使用共享访问组 以便我的 2 个共享相同应用程序前缀的应用程序可以访问钥匙串
  • 为什么我的视图仍然以横向呈现?

    我的视图是由导航控制器控制的 因此我将导航控制器支持的方向设置为明确的纵向和纵向UpSideDown 这可以工作 但是如果调用视图时前一个视图处于横向状态 它将以横向方式呈现并保持横向状态 直到设备旋转 如何防止这种情况发生 这是我的代码
  • UIWebView Bug:-[UIWebView cut:]:无法识别的选择器发送到实例

    In the UIWebView 如果包含文本的输入元素具有焦点 并且按下按钮导致输入失去焦点 则随后双击输入以重新获得焦点并从出现的弹出栏中选择 剪切 或 复制 或 粘贴 会导致这UIWebView因错误而崩溃 UIWebView cut
  • Swift 中的 UIAlert 自动消失?

    我有以下代码 Creates Alerts on screen for user func notifyUser title String message String gt Void let alert UIAlertController
  • RemoteIO 音频单元播放回调中的 AudioBufferList 内容

    我想 拦截 音频数据传送到 iOS 设备扬声器的过程 我相信这可以使用 RemoteIO 音频单元和回调来完成 在下面的playbackCallback中 ioData实际上包含任何音频数据吗 static OSStatus playbac
  • IPV6 快速可达性

    我是 swift 和 xcode 的新手 并且我的应用程序因 IPV6 而被拒绝 性能 2 1 当我们执行以下操作时 您的应用程序会在运行 iOS 9 3 5 并连接到 IPv6 网络的 iPad 和 iPhone 上崩溃 具体来说 当我们

随机推荐

  • 多次限制获得公共服务

    我有这样的情况 想象一下有一个公共 REST 服务 我们不希望某人能够在短时间内多次访问此服务 因为他们将能够阻止我们的数据库 我认为本质上是 DDOS 攻击 有没有办法有效防范此类攻击 我们使用的技术是 Spring Spring Sec
  • 如何在不使用 Mapbox 的情况下使用 OpenStreetMap?

    我想使用 OSM OpenStreetMap 数据 但有一种方法 Mapbox 可以使用吗 如果有其他解决方案可以在不使用 MapBox 的情况下使用 OSM OpenStreetMap 那对我会有帮助 由于这是用 Swift 标记的 我假
  • 使用 django-storages 和 S3boto 后端保存到 S3 时如何设置“Content-Type”?

    我在用django storages with s3boto作为后端 我有一个桶 里面有两个文件夹 一个用于static和一个用于media 我使用以下方法实现了这一点django s3 folder storage 除了使用模型保存到 S
  • Visual Studio 2010 编译 C 代码

    我有以下代码片段 这是 Visual Studio 2010 中的一个 C 文件 如果我尝试使用以下行编译它 int hello 10 注释掉它会编译得很好 如果我评论其中的那一行将无法编译 我是否遗漏了某些内容 或者我不应该使用 Visu
  • 为偶数和奇数 div 添加不同的类

    我有一段 PHP 代码 如下所示 flag false if empty links echo h1 You have no uploaded images h1 br foreach links as link extension sub
  • 如何设置工作项的必填字段和默认值

    我正在为我的项目使用 Visual Studio Team Services 并通过网络访问它 我正在使用 Scrum 模板 我试图弄清楚如何设置任务字段的默认值 例如 对于任务的 活动 字段 我希望将其设为必填字段 并在每次添加新任务时将
  • 如何隐藏按钮轮廓

    我的这个页面有很多按钮 https jsfiddle net Android272 c150305z https jsfiddle net Android272 c150305z 我已经尝试了以下代码的每种组合 但没有任何方法可以摆脱轮廓
  • 具有动态维度的数组的子集部分

    我想对一个具有动态维数 k 的数组进行子集化 举个例子 A lt array 1 3 4 dim c 3 3 3 3 因为尺寸可能会有所不同 此处未显示 所以我不能简单地定义 a b c d 并通过以下方式进行查询 a lt 1 2 b l
  • 调试时 Epplus Save()、SaveAs() 等方法运行速度非常慢

    环境 Windows 10 Visual Studio 2017 netcore2 0 调试版本 在调试时使用 Epplus 4 1 1 保存 Excel 文件时 保存操作花费的时间比我预期的要长得多 这是使用 调试 gt 开始调试 运行时
  • 将每个 R for 循环迭代保存在新列表中

    我正在使用dataprepSynth 包的功能 参见https cran r project org web packages Synth Synth pdf https cran r project org web packages Sy
  • 算法优化[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 这里是link https www
  • 将参数传递给 Laravel 作业不起作用

    我之前读过这个问题的解决方案 但似乎我做错了其他事情 这就是我问的原因 通常解决方案是将参数添加到类的主体以及 construct 方法中 但甚至这样做它不起作用
  • 释放R中的内存

    在 R 中 我尝试将几组时间序列数据组合并转换为 xtshttp www truefx com page downloads http www truefx com page downloads但是 这些文件很大并且有很多文件 因此这导致我
  • 正确记录日志

    所以我的问题是关于日志记录 以及如何处理可能影响您的代码和运行时行为的日志语句 日志文件 每个程序都应该编写这些文件以正确解决问题 但如何正确执行呢 大多数日志语句的获取成本非常高 因为它们应该提供有用的信息 并且即使完全禁用日志记录 它们
  • 了解 Lambda 闭包类型如何删除默认构造函数

    从5 1 2开始 19 与 lambda 表达式关联的闭包类型有一个已删除的 8 4 3 默认构造函数和一个被删除的 复制赋值运算符 它有一个隐式声明的复制构造函数 12 8 并且可能有一个隐式声明的 移动构造函数 12 8 注意 复制 移
  • '已溢出其堆栈”' aria-label='构造大树时“线程'
    '已溢出其堆栈”'> 构造大树时“线程'
    '已溢出其堆栈”

    我实现了一个树结构 use std collections VecDeque use std rc Rc Weak use std cell RefCell struct A children Option
  • 中心标签还有效吗?

    我主要使用 HTML
  • 切换/切换 div (jQuery)

    我希望完成一项相当简单的任务 我希望 我有两个 div 标签和一个锚标签 如下所示 a href forgot password a div div div style display none div 我希望使用锚标记在两个 div 标记
  • 如何使用终端运行特定的 Android 应用程序? [复制]

    这个问题在这里已经有答案了 我已经安装了 Eclipse 和 Android SDK 一切都运行良好 我想安装 apk 文件 因此我已按照说明进行操作 但问题是 当我启动模拟器时 它不会自动运行我的应用程序 终端中是否有命令允许我运行我要求
  • iOS 上 UIImage 的运动模糊效果

    有没有办法在 UIImage 上获得运动模糊效果 我尝试了 GPUImage Filtrr 和 iOS Core Image 但所有这些都有常规模糊 没有运动模糊 我也尝试过 UIImage DSP 但它的运动模糊几乎不可见 我需要更强大的