通过 Core Image 框架复制结果 `func masking(_ mask: CGImage) -> CGImage?`

Posted

技术标签:

【中文标题】通过 Core Image 框架复制结果 `func masking(_ mask: CGImage) -> CGImage?`【英文标题】:Replicate result `func masking(_ mask: CGImage) -> CGImage?` by Core Image framework 【发布时间】:2020-10-11 19:03:22 【问题描述】:

是否可以选择使用 CoreImage 和 CIFilter 之一从 Core Graphics 复制 func masking(_ mask: CGImage) -> CGImage??我试过CIBlendWithMaskCIBlendWithAlphaMask 没有成功。最重要的是我需要保留 alpha 通道,所以我希望图像以这样的方式被遮罩,如果遮罩是黑色 - > 显示图像,如果遮罩是白色 - > 透明。 我的屏蔽码:

extension UIImage 
    
    func masked(by mask: UIImage) -> UIImage 
        guard let maskRef = mask.cgImage,
            let selfRef = cgImage,
            let dataProvider = maskRef.dataProvider,
            let mask = CGImage(
                maskWidth: maskRef.width,
                height: maskRef.height,
                bitsPerComponent: maskRef.bitsPerComponent,
                bitsPerPixel: maskRef.bitsPerPixel,
                bytesPerRow: maskRef.bytesPerRow,
                provider: dataProvider,
                decode: nil,
                shouldInterpolate: false),
            let masked = selfRef.masking(mask) else 
                    fatalError("couldnt create mask!")
        
        let maskedImage = UIImage(cgImage: masked)
        return maskedImage
    

【问题讨论】:

【参考方案1】:

我找到了解决方案。关键是使用具有灰度格式的图像,rgb 和其他将不起作用。如果 image 和 mak 具有相同的大小,则可以删除调整大小的步骤。可以作为扩展,也可以作为 CIImage 的子类。享受:)

当然可以修改为UIImageCIImageCIFilter的扩展名,随你喜欢。

extension CGImage 
    
    func masked(by cgMask: CGImage) -> CIImage 
        let selfCI = CIImage(cgImage: self)
        let maskCI = CIImage(cgImage: cgMask)
        
        let maskFilter = CIFilter(name: "CIMaskToAlpha")
        maskFilter?.setValue(maskCI, forKey: "inputImage")
        let scaleFilter = CIFilter(name: "CILanczosScaleTransform")
        scaleFilter?.setValue(maskFilter?.outputImage, forKey: "inputImage")
        scaleFilter?.setValue(selfCI.extent.height / maskCI.extent.height, forKey: "inputScale")
        let filter: CIFilter! = CIFilter(name: "CIBlendWithAlphaMask")
        filter.setValue(selfCI, forKey: "inputBackgroundImage")
        let maskOutput = scaleFilter?.outputImage
        filter.setValue(maskOutput, forKey: "inputMaskImage")
        let outputImage = filter.outputImage!
        return outputImage
    

【讨论】:

【参考方案2】:

您需要创建自己的自定义 CIFilter。教程:

Apple Docs

Apple Docs 2

Raywenderlich.com Tutorial

这不是微不足道的,但当你学会如何去做时,它就会得到回报:)

【讨论】:

哦该死的。真的。我尝试使用清晰的 ciimage 作为输入图像并使用图像作为背景进行过滤,结果为零。也许我的面具是错的。也许掩码必须是每个像素一个字节,掩码的灰度图像? 我让 CIImage 变得简单 :)

以上是关于通过 Core Image 框架复制结果 `func masking(_ mask: CGImage) -> CGImage?`的主要内容,如果未能解决你的问题,请参考以下文章

如何关联 UIKit、Core Image、Quartz 2D 以及 iOS 中的各种框架?

在 .NET Core 中设置自定义 <OutputPath> (停止添加框架目标)? [复制]

绘图与滤镜全面解析--Quartz 2D Core Image

iOS学习笔记9-Core Image

使用 Core Image 生成条码 C39

iOS 5.0 中的 Core Image 过滤器对于实时视频处理是不是足够快?