【问题标题】:Reverse a CALayer mask反转 CALayer 蒙版
【发布时间】:2017-07-03 11:28:03
【问题描述】:

我正在尝试使用带有图像的 CALayer 作为屏蔽 UIView 的内容。对于面具,我有复杂的 png 图像。如果我将图像作为 view.layer.mask 应用,我会得到与我想要的相反的行为。 有没有办法扭转CAlayer?这是我的代码:

layerMask = CALayer()
guard let layerMask = layerMask else { return }    
layerMask.contents = #imageLiteral(resourceName: "mask").cgImage
view.layer.mask = layerMask
// What I would like to to is
view.layer.mask = layerMask.inverse. // <---

我看过几篇关于反向 CAShapeLayers 和可变路径的帖子,但没有什么地方可以反转 CALayer。 我可以做的是在 Photoshop 中反转图像,以使 alpha 反转,但问题是我将无法创建具有精确尺寸以适合所有屏幕尺寸的图像。我希望它确实有意义。

【问题讨论】:

  • 问题在于掩码在关键窗口的中心有一个固定的大小。如果我要在 Photoshop 中绘制“正确”的蒙版,我将永远无法让蒙版适用于所有屏幕尺寸。所以我使用我的公司标志作为面具,我需要从主视图中模版出来
  • 不,我不关注。为什么如果你从 your 掩码开始会起作用,但如果你从 正确 掩码开始会不起作用?
  • 在 Photoshop 中反转你的蒙版。否则你可以在代码中反转它,但你为什么要通过 Photoshop 来做呢?
  • 我在主帖中添加了一个示例图片
  • 好吧,我的回答告诉你怎么做。如果您从用黑色绘制的三角形开始,您可以制作包含三角形的任何所需大小的图像,并将其变成完全符合您想要的蒙版。

标签: ios swift calayer mask


【解决方案1】:

我要做的是实时构建面具。如果您有徽标的黑色图像,这很容易。使用标准技术,您可以将徽标图像绘制成您实时构建的图像,以便您负责图像的大小以及徽标在其中的大小和位置。使用“Mask To Alpha”CIFilter,您可以将黑色转换为透明以用作图层蒙版。

所以,为了说明。这是背景图片:这是我们希望在前景打洞的任何地方看到的:

这是前景图像,位于背景之上并完全隐藏:

这是黑色的标志(忽略灰色,代表透明度):

这是用代码在正确大小的白色背景中绘制的徽标:

最后,这是使用 Mask To Alpha CIFilter 转换为遮罩的同一张图像,并作为其mask 附加到前景图像视图:

好的,我本可以选择更好的图像,但这就是我躺着的东西。您可以看到,无论徽标中有黑色,我们都在前景图像上打了一个洞并看到背景图像,我相信这正是您所说的想要做的。

关键步骤是最后一步,即将logo(im)的黑白图像转换为蒙版;我是这样做的:

    let cim = CIImage(image:im)
    let filter = CIFilter(name:"CIMaskToAlpha")!
    filter.setValue(cim, forKey: "inputImage")
    let out = filter.outputImage!
    let cgim = CIContext().createCGImage(out, from: out.extent)
    let lay = CALayer()
    lay.frame = self.iv.bounds
    lay.contents = cgim
    self.iv.layer.mask = lay

【讨论】:

  • 是的,就是这样!非常感谢!我只需要让代码工作。当我让它工作时会发布它。感谢您的宝贵时间!
  • 关键部分是将黑白图像转换为透明蒙版,我当然可以给你;等一下。
  • 你去。我已经添加了最后一步的代码,这是我假设你可能不知道该怎么做的部分。
  • 太棒了!!就是这样 :) 我在 C 中发现了一个类似的东西 ..但是很挣扎。再次感谢马特
  • 老兄,你应该在这些变量命名中更具声明性
猜你喜欢
  • 2016-12-08
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 2012-09-15
  • 2018-11-26
  • 1970-01-01
相关资源
最近更新 更多