如何仅为 UIImage 的非白色部分设置色调颜色?

Posted

技术标签:

【中文标题】如何仅为 UIImage 的非白色部分设置色调颜色?【英文标题】:How do I set tint color only for non white parts of the UIImage? 【发布时间】:2017-04-07 20:43:39 【问题描述】:

简单我有两个人的 UIImageView 图标,它看起来像这样:

但是当我将tintColor 设置为红色时,它看起来像这样:

有什么方法可以避免覆盖每个非 zero-alpha 像素?我需要真正在那里展示领带。一次我需要红色的人,另一次是绿色的。

图标是简单的png文件。圆角是 UIImageView 的简单背景色。所以图片中带tie的部分不能是zero-alpha

有没有什么方法可以实现这种效果为每种颜色创建图像?

【问题讨论】:

为什么不用两张图? 因为我需要动态改变颜色。一次可能是绿色,一次是红色或黑色...... 核心图像。具体来说,使用 GLSL 编写自己的 CIKernel。这实际上非常简单。 @dfd 很简单?请帮忙...我完全不知道核心图像...:) 我明白了,那么您必须将人物图像与圆形图像分开,并通过 autlayout 将其设置在该圆形图像中,现在您可以为您的人物图像设置色调。 【参考方案1】:

这与我一直在玩的另一个想法相似,所以我做了更多的摆弄......

从这 3 张图片开始:

然后将它们用作.withRenderingMode(.alwaysTemplate) 以提供所需的颜色...然后通过CALayer 将它们分层以获得:

为了清晰起见,还有一个“分解”视图......

创建一个“人物”100% 透明的图像 - 实际上是图像中的“洞”。

将 UIImageView 的背景颜色设置为“填充”颜色。

如果您不想将白色边界框作为图像的一部分,您仍然可以使用圆形(例如 CAShapeLayer)对其进行遮盖。

原图: https://i.stack.imgur.com/eFrmB.png https://i.stack.imgur.com/2GNDX.png

【讨论】:

看起来还不错;) 但是……如果我需要改变圆圈的背景怎么办?我实际上做什么?原因?需要显示它在哪里被选中...没有其他方法可以做到这一点?现在 +1 您可以通过多层图像和蒙版组合获得“花哨”...需要一点时间来玩,但并非不可能。另一种选择...由于您的图像非常简单,因此从 png 切换到几个 Bezier 路径 + 填充操作根本不需要太多。也可以很好地扩展。【参考方案2】:

使用 CISpotColor 滤镜:

https://developer.apple.com/library/content/documentation/GraphicsImaging/Reference/CoreImageFilterReference/#//apple_ref/doc/filter/ci/CISpotColor

这允许您在图像中指定要更改为另一种颜色的颜色。因此,由于您知道领带的原始颜色和背景,您可以一次更改其中任何一个,或同时更改两者。

【讨论】:

以上是关于如何仅为 UIImage 的非白色部分设置色调颜色?的主要内容,如果未能解决你的问题,请参考以下文章

我可以更改 UIButton 上的色调颜色,但不能更改 UIImage

如何只在几个部分中以编程方式更改UIImage的色调?

如何在 WatchKit 中为模式界面设置导航标题的色调颜色?

设置 UIImage 颜色

XIB中UIImage的色调颜色

UIActivityViewController:呈现的视图控制器的色调颜色