swift 反转CALayer遮罩

smdnsysy  于 2023-03-16  发布在  Swift
关注(0)|答案(2)|浏览(178)


我正在尝试使用一个CALayer,其中包含一个图像作为遮盖UIView的内容。对于这个遮罩,我有一个复杂的png图像。如果我将这个图像作为一个视图.层.遮罩来应用,我会得到与我想要的相反的行为。有没有一种方法可以反转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就被反转了,但是问题是我不能创建一个大小完全适合所有屏幕大小的图像。我希望这是有意义的。

gudnpqoy

gudnpqoy1#

我所要做的是真实的构造蒙版。如果你有一个黑色的徽标图像,这就很容易了。使用标准技术,你可以将徽标图像绘制成一个实时构造的图像,这样你就可以控制图像的大小以及徽标在图像中的大小和位置。使用“Mask To Alpha”CIFilter,然后你可以把黑色转换成透明的,用作图层蒙版。
为了说明,这是背景图片:这就是我们希望看到的,无论我们在前景上打了一个洞。

下面是前景图像,位于背景之上并将其完全隐藏:

下面是黑色的徽标(忽略代表透明的灰色):

下面是用代码绘制到正确大小的白色背景中的徽标:

最后,下面是使用“遮罩到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
yuvru6vn

yuvru6vn2#

如果使用CALayer作为另一个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"

然后你可以用这个图层作为其他CALayermask,例如这里我用它作为一个蓝色小矩形的遮罩:

smallBlueRectangle.mask = largeOpaqueLayer

所以你可以看到掩码是反转的!另一方面,如果你直接使用未反转的maskLayer作为mask,你可以看到掩码没有反转:

相关问题