反转 CALayer 蒙版

Reverse a CALayer mask

我正在尝试使用带有图像的 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 反转,但问题是我无法创建具有适合所有屏幕尺寸的精确尺寸的图像。我希望它确实有意义。

我要做的是实时构建掩码。如果您有徽标的黑色图像,这很容易。使用标准技术,您可以将徽标图像绘制到您实时构建的图像中,这样您就可以控制图像的大小以及徽标在其中的大小和位置。使用 "Mask To Alpha" CIFilter,然后您可以将黑色转换为透明以用作图层蒙版。

所以,举例说明。这是背景图片:这是我们希望在前景中打孔的地方看到的:

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

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

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

最后,这是使用 Mask To Alpha CIFilter 将同一图像转换为蒙版并作为其 mask:

附加到前景图像视图

好吧,我本可以选择更好的图像,但这就是我所拥有的。你可以看到徽标中有黑色的地方,我们在前景图像上打了一个洞,看到了背景图像,我相信这正是你所说的你想做的。

关键的一步是最后一步,即将logo(im)的black-on-white图片转换为mask;我是这样做的:

    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