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

问题描述

我有两个图像,它们都有 alpha 通道。我想把它们放在一起。它确实适用于 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

封面,这是一张中间有一个白色圆圈的图片,其他是透明的:

enter image description here

结果:

enter image description here

解决方法

首先反转掩码:

cgImage 遮罩的规则是 delete carsObj.car2

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

    {
      car1: { brand: 'Ford',model: '556',licensePlate: 55555 },car3: { brand: 'Ford',licensePlate: 55557 },car5: { brand: 'Ford',licensePlate: 55559 }
    }

结果:

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...