反转CALayer面具

arv*_*urs 7 mask calayer ios swift

在此输入图像描述我正在尝试使用带有图像的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. // <---
Run Code Online (Sandbox Code Playgroud)

我在反向CAShapeLayers和Mutable路径上看到了几个帖子,但我无法反转CALayer.我可以做的是在Photoshop中反转图像以便反转alpha,但问题是我将无法创建具有适合所有屏幕尺寸的确切大小的图像.我希望它确实有意义.

mat*_*att 7

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

所以,来说明一下.这是背景图片:这是我们想要在前台打孔的地方看到的:

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

最后,这是相同的图像转换为Mask To Alpha CIFilter的掩码,并附加到前景图像视图,如下所示mask:

在此输入图像描述

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

关键步骤是最后一步,即将徽标(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
Run Code Online (Sandbox Code Playgroud)

  • 老兄,你应该在那些变量命名中更具说明性 (4认同)

Cal*_*ens 6

如果您使用 aCALayer作为另一个 的蒙版CALayer,则可以通过创建一个大的不透明图层并使用混合模式减去蒙版形状来反转蒙版xor

例如,此代码从大的不透明层中减去给定层以创建遮罩层:

// Create a large opaque layer to serve as the inverted mask
let largeOpaqueLayer = CALayer()
largeOpaqueLayer.bounds = CGRect(x: -10_000_000, y: -10_000_000, width: 20_000_000, height: 20_000_000)
largeOpaqueLayer.backgroundColor = UIColor.black.cgColor

// Subtract out the mask shape using the `xor` blend mode
let maskLayer = ...
largeOpaqueLayer.addSublayer(maskLayer)
maskLayer.compositingFilter = "xor"
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然后您可以将该图层用作mask其他图层的图层CALayer。例如,我在这里使用它作为一个小蓝色矩形的遮罩:

smallBlueRectangle.mask = largeOpaqueLayer
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

所以你可以看到面具是倒置的!另一方面,如果您maskLayer直接使用未反转的 a mask,您可以看到掩码未反转:

在此输入图像描述

  • 很好的答案。正是我一直在寻找的东西。 (2认同)