ios - 在 iOS 上,可以将多个 CIFilter 添加到 SpriteKit 节点吗?

标签 ios sprite-kit core-image cifilter skeffectnode

在 iOS 上,您可以向 SKEffectsNode 添加多个 CIFilter 吗?

CIFilterGenerator似乎是我想要的,但它在 iOS 上不可用。

我知道你可以使用multiple filters on an image通过将一个的输出作为下一个的输入传递,但如果您想影响非图像节点,这没有帮助。

这是否意味着我必须创建一个 SKEffectNode 的人工层次结构,并向每个层次结构添加一个过滤器,而我的实际内容位于最底部?有更好的办法吗?

最佳答案

根据 dfd 的有用建议,我最终选择了这个简单的子类。我将他的答案标记为正确,因为 a) 他建议了这种方法,我想给予他信任,b) 它有更多关于使用 CIFilterConstructor 注册过滤器的一般使用信息。

有用的引用: -Apple Docs -Related Question -Free Core Image eBook

class MyChainFilter: CIFilter {
    let chainedFilters: [CIFilter]
    @objc dynamic var inputImage: CIImage?

    init(filters: [CIFilter]) {
        self.chainedFilters = filters
        super.init()
    }

    // run filters in order on the specified source image
    override var outputImage: CIImage? {
        get {
            let imageKey = "inputImage"
            var workingImage = self.inputImage
            for filter in chainedFilters {
                assert(filter.inputKeys.contains(imageKey))
                filter.setValue(workingImage, forKey: imageKey)
                guard let result = filter.outputImage else {
                    assertionFailure("filter failed: \(filter.name)")
                    return nil
                }
                workingImage = result
            }
            return workingImage
        }
    }

    required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
}

关于ios - 在 iOS 上,可以将多个 CIFilter 添加到 SpriteKit 节点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55553869/

相关文章:

android - 如何在chrome手机浏览器中查看网络选项卡相关信息

ios - 延迟一段时间后如何从父 View 中隐藏 subview

ios - Swift:检查 SKActions 的进度

ios - SpriteKit : How to prevent two SKSpriteNodes from colliding (in Swift)

objective-c - 使用 CoreImage 过滤图像会导致图像旋转

ios - Swift UI 相机显示纵向 View ,但图像变成横向 View

ios - Swift 中的 "do-catch"语句执行四次?

ios - 如何更改 Sprite 套件中 Sprite 节点的大小以适应不同的屏幕(Swift)

ios - CIImage 滤镜正在垂直拉伸(stretch)我的图像

objective-c - 使用 CIImage 使所有黑色像素透明