如何将两个 CIImages 与 alpha 结合起来?

问题描述

在我的项目中,我想将两个 CIImage 组合在一起。 为此,我使用“CISourceInCompositing”

if let currentFilter = CIFilter(name: "CISourceInCompositing") {


        let bgImage = inputImage
        var filterImage = resizeCIImage(image: filterImage,newWSize: bgImage.extent.size)

        filterImage = setOpacity(image: filterImage,alpha: opacity)

        currentFilter.setValue(filterImage,forKey: kCIInputImageKey)
        currentFilter.setValue(bgImage,forKey: kCIInputBackgroundImageKey)

        guard let outputImage = currentFilter.outputImage else {
            return CIImage()
        }
                        
        return outputImage
    }

但我想改变“kCIInputImageKey”的不透明度 所以我用这个方法:

func setOpacity (image : CIImage,alpha : Double) ->CIImage {
        
        guard let overlayFilter: CIFilter = CIFilter(name: "CIColorMatrix") else { fatalError() }
        let overlayRgba: [CGFloat] = [0,alpha]
        let alphaVector: CIVector = CIVector(values: overlayRgba,count: 4)
        overlayFilter.setValue(image,forKey: kCIInputImageKey)
        overlayFilter.setValue(alphaVector,forKey: "inputAVector")
        
        return overlayFilter.outputImage!
    }

但是我获得的图像与我想要的不同:

enter image description here

你有什么解决办法吗? 谢谢

解决方法

您应该使用 CISourceOverCompositing 而不是 CISourceInCompositing

CISourceInCompositing 的定义:

Uses the background image to define what to leave in the input image,effectively cropping the input image.

CISourceOverCompositing 的定义

Places the input image over the input background image.

在此处查看其他 CoreImage 复合操作的信息和示例输出:https://developer.apple.com/library/archive/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CISourceOverCompositing

相关问答

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