如何仅为 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