首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >核心镜像框架复制结果`函数掩码(_ mask: CGImage) -> CGImage?`

核心镜像框架复制结果`函数掩码(_ mask: CGImage) -> CGImage?`
EN

Stack Overflow用户
提问于 2020-10-12 03:03:22
回答 2查看 69关注 0票数 1

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

代码语言:javascript
复制
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
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-14 00:09:19

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

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

代码语言:javascript
复制
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
    }
}
票数 1
EN

Stack Overflow用户

发布于 2020-10-12 03:28:22

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

Apple Docs

Apple Docs 2

Raywenderlich.com Tutorial

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64307971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档