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

标签 ios swift uiimage cgimage ciimage

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

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
    }
}

最佳答案

我找到了解决方案。关键是要使用灰度格式的图像,rgb 等格式的图像不起作用。如果图像和制作具有相同的大小,则可以删除调整大小步骤。可以作为扩展,也可以作为 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
    }
}

关于ios - 通过 Core Image 框架复制结果 `func masking(_ mask: CGImage) -> CGImage?`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64307971/

相关文章:

ios - Xcode 10.1 模拟器突然响应非常非常慢

ios - 使用 swift 中的选项连接 socketIO

ios - 下拉菜单更新 View

ios - 委托(delegate)仍然为零

Swift 在 2 bool didset 调用后调用一个方法

ios - 在 Swift 中使用自定义类在数组中显示 UIImage

ios - NSData 对象因未知原因为空(保存图像)

ios - 无法从它的 super View 中删除 UILabel

iphone - UIImagePickerController imagePicker 不适合 iPhone 4 屏幕

iphone - 如何使用 MFMailComposerViewController 将 UIImage 添加到电子邮件中?