[英]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
:
好吧,我本可以更好地选择我的图像,但这就是我躺在那里的东西。 您可以看到,无论徽标中有黑色,我们都会在前景图像上打一个洞并看到背景图像,我相信这正是您所说的想要做的。
关键步骤是最后一步,即将徽标( 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
如果您使用CALayer
作为另一个CALayer
的蒙版,您可以通过创建一个大的不透明图层并使用xor
混合模式减去蒙版形状来反转蒙版。
例如,这段代码从一个大的不透明层中减去一个给定的层来创建一个遮罩层:
// Create a large opaque layer to serve as the inverted mask
let largeOpaqueLayer = CALayer()
largeOpaqueLayer.bounds = .veryLargeRect
largeOpaqueLayer.backgroundColor = UIColor.black.cgColor
// Subtract out the mask shape using the `xor` blend mode
let maskLayer = ...
largeOpaqueLayer.addSublayer(maskLayer)
maskLayer.compositingFilter = "xor"
然后,您可以将该层用作其他一些CALayer
的mask
。 例如,在这里我将它用作一个蓝色小矩形的蒙版:
smallBlueRectangle.mask = largeOpaqueLayer
所以你可以看到面具是倒置的! 另一方面,如果您只是将未反转的maskLayer
直接用作mask
,则可以看到掩码未反转:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.