簡體   English   中英

反轉 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

在此輸入圖像描述

好吧,我本可以更好地選擇我的圖像,但這就是我躺在那里的東西。 您可以看到,無論徽標中有黑色,我們都會在前景圖像上打一個洞並看到背景圖像,我相信這正是您所說的想要做的。

關鍵步驟是最后一步,即將徽標( 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"

在此處輸入圖像描述

然后,您可以將該層用作其他一些CALayermask 例如,在這里我將它用作一個藍色小矩形的蒙版:

smallBlueRectangle.mask = largeOpaqueLayer

在此處輸入圖像描述

所以你可以看到面具是倒置的! 另一方面,如果您只是將未反轉的maskLayer直接用作mask ,則可以看到掩碼未反轉:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM