在不混合的情况下使不透明的 UIView 变暗

Posted

技术标签:

【中文标题】在不混合的情况下使不透明的 UIView 变暗【英文标题】:Darken an opaque UIView without blending 【发布时间】:2014-10-13 17:14:52 【问题描述】:

我的应用程序的背景是不透明的UIImageView。在某些情况下,我想以动画方式将其从全亮度调暗到大约 50%。目前我降低了视图的 alpha 属性,这很好用。因为视图后面没有任何东西,所以背景图像只是变暗了。

但是,我一直在使用 Core Animation Instrument 进行分析,当我这样做时,我看到 整个背景显示为混合。如果可能的话,我想避免这种情况。

在我看来,这在合成过程中是可以实现的。如果视图是不透明的,则可以将其与黑色混合,而没有任何东西在后面透出。不需要混合,调整像素值即可。

我想知道这是否是 UIKit 的 GPU 合成支持的东西。虽然混合不是很好,但它可能比在 CPU 上更新图像要好得多,所以我认为 CPU 方法可能不是一个好的替代品。

Another question 询问了这个问题,并提出了一些想法,包括设置 Alpha。不过,没有人提出一种避免混合的机制。

【问题讨论】:

【参考方案1】:

这里的一个重要问题是,您是否希望更改为使用深色背景进行动画处理。

没有动画

准备两个不同的背景图像,然后在它们之间简单地交换。 UIImage+imageEffects 库可以帮助生成变暗的图像,或者给你一些线索。

动画。

看看GPUImage - “基于 GPU 的图像和视频处理的开源 ios 框架”。基于此,您可以将背景以较暗的方式渲染到场景中。

【讨论】:

动画。我应该提到这一点,所以我编辑了这个问题,感谢您提示我澄清。我看不出链接库有什么帮助? 我看了一下实现代码,谢谢。我还应该更清楚地说明我想将这一切都保留在 GPU 上。我已经修改过了。 @Benjohn,在这种情况下,请看一下这个框架 - “基于 GPU 的图像和视频处理的开源 iOS 框架”。 github.com/BradLarson/GPUImage 酷——这看起来像是一个有用的参考。我想知道我是否可以只使用一些 GLSlang 来定义背景如何组合在一起,然后我就可以一次完成整个事情并避免大量合成(它比我暗示的要复杂)。我认为这是正确的答案,我想我会把它留给 1.1 版 :-) 感谢您的编辑 - 我已经进一步构建它,使动画/非动画差异清晰。我打算暂时搁置这个问题,因为我希望有人会站出来说:“哦,你需要 UIView 上的 ... 参数”。谢谢。

以上是关于在不混合的情况下使不透明的 UIView 变暗的主要内容,如果未能解决你的问题,请参考以下文章

如何在不删除 Ionic 3 的情况下使 iOS 上的状态栏透明?

使 UIView 或 CALayer 变暗的最快方法(性能方面)

如何在不使用滤镜的情况下使图像变暗? [复制]

如何让 iPhone 屏幕变暗

如果我的 UIView 设置为不透明,为啥它仍然被模拟器着色为“混合”?

半透明混合中美术术语和程序术语的区别对照表