ios - 使用 cgImage.mask 屏蔽两个 UIImage 不起作用,但适用于 imageview.layer.mask

标签 ios calayer cgimage

我有两张图像,它们都有 Alpha channel 。我想把它们结合在一起。它确实适用于 UIImageView,但我想通过使用 cgimage 来实现,而无需创建 UIImageView。 我尝试了 cgimage,这样不起作用:

    func  combine3(_ bg: UIImage, cover: UIImage) -> UIImage?{
        let size = CGSize(width: self.view.frame.width, height: self.view.frame.height)
        UIGraphicsBeginImageContext(size)
        
        let maskRef = cover.cgImage!
        let mask = CGImage.init(maskWidth: maskRef.width, height: maskRef.height, bitsPerComponent: maskRef.bitsPerComponent, bitsPerPixel: maskRef.bitsPerPixel, bytesPerRow: maskRef.bytesPerRow, provider: maskRef.dataProvider!, decode: nil, shouldInterpolate: false)
        let masked = bg.cgImage?.masking(mask!)
        let outPutImage = UIImage(cgImage: masked!)
        
        UIGraphicsEndImageContext()
        return outPutImage
    }

但是对于 UIImageView 来说,它的效果非常好:

        let bg = creatBGImageFinal()!
        bgIV.image = bg

        let cover = createCoverImageFinal(progress: 0)!
        let layer = CALayer()
        layer.contents = cover.cgImage
        layer.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        maskIV.layer.mask = layer
背景: enter image description here cover,是一张中间有白圈的图片,其他都是透明的: enter image description here 结果: enter image description here

最佳答案

首先,反转蒙版:

cgImage屏蔽的规则是Dst = 1 - Src

然后将蒙版图像绘制到具有不透明度的图像上下文上:

func combine3(_ bg: UIImage, cover: UIImage, size: CGSize) -> UIImage? {
    UIGraphicsBeginImageContextWithOptions(size, true, 1)
    defer {
        UIGraphicsEndImageContext()
    }
    let context = UIGraphicsGetCurrentContext()!
    let maskRef = cover.cgImage!
    let mask = CGImage.init(maskWidth: maskRef.width, height: maskRef.height, bitsPerComponent: maskRef.bitsPerComponent, bitsPerPixel: maskRef.bitsPerPixel, bytesPerRow: maskRef.bytesPerRow, provider: maskRef.dataProvider!, decode: nil, shouldInterpolate: false)!
    let masked = bg.cgImage!.masking(mask)!
    // adjust for lower-left-origin CG coordinates
    context.translateBy(x: 0, y: size.height)
    context.scaleBy(x: 1, y: -1)
    context.draw(masked, in: CGRect(origin: .zero, size: size))
    return UIGraphicsGetImageFromCurrentImageContext()
}

结果:

关于ios - 使用 cgImage.mask 屏蔽两个 UIImage 不起作用,但适用于 imageview.layer.mask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66468292/

相关文章:

objective-c - iOS CoreGraphics : Draw arc, 根据相交弦定理确定弧角

iphone - CATiledLayer 高于正常 CALayer

iphone - Calier子类问题

iphone - 加载较小图像表示的最有效方法

ios - 为照片添加多种效果

ios - 通过单击应用程序图标直接启动应用程序时未获取推送通知数据

ios - Web View 加载HTMLString :baseURL: not loading css

ios - 切换 CALayer 时如何设置动画

iPhone - 获取指向 CGDataProvider 背后数据的指针?

iOS:tableview 应用程序和数据库