在 Swift 中重写 CIImage 最终会导致处理器下降到 0% 并冻结

Posted

技术标签:

【中文标题】在 Swift 中重写 CIImage 最终会导致处理器下降到 0% 并冻结【英文标题】:Rewriting to CIImage in Swift eventually causes processor to go down to 0% and freeze 【发布时间】:2018-06-22 17:47:00 【问题描述】:

我想将 CIImage 与我拥有的最后一个 CIImage 混合。当我多次重复此操作时,输出图像最终冻结,我看到 CPU 降至 0%。我不确定是不是因为它是不可变的,但是我正在重新定义其他 CIImage 没有问题,所以我不确定这是否是问题所在。

我正在重写的 CIImage 是全局的,但我已经尝试了所有不同的范围。它也是可选的

var retainedCI:CIImage? = nil

我的功能

func createRetainedCI(ciImage:CIImage,
                      retainedCI:CIImage) -> CIImage 

    let colorMatrix = CIFilter(name: "CIColorMatrix")
    colorMatrix?.setDefaults()

    colorMatrix?.setValue(retainedCI, forKey: kCIInputImageKey)
    colorMatrix?.setValue(CIVector(x: 0, y: 0, z: 0, w: debugAlpha), forKey: "inputAVector")

    var dupeCI = colorMatrix?.outputImage

    dupeCI = dupeCI?.applyingFilter("CISourceOverCompositing", parameters: [kCIInputImageKey: dupeCI!,
                                                                                kCIInputBackgroundImageKey: ciImage])

    return dupeCI!


我怎么称呼它

if retainedCI == nil  retainedCI = ciImage 

retainedCI = hueCycleFilters.createRetainedCI(ciImage: ciImage, retainedCI: retainedCI!)

【问题讨论】:

【参考方案1】:

试试这个功能

func createRetainedCI(ciImage:CIImage,
                      retainedCI:CIImage) -> CIImage 

    let colorMatrix = CIFilter(name: "CIColorMatrix")
    colorMatrix?.setDefaults()

    colorMatrix?.setValue(retainedCI, forKey: kCIInputImageKey)
    colorMatrix?.setValue(CIVector(x: 0, y: 0, z: 0, w: debugAlpha), forKey: "inputAVector")

    var dupeCI = colorMatrix?.outputImage

    colorMatrix = nil

    dupeCI = dupeCI?.applyingFilter("CISourceOverCompositing", parameters: [kCIInputImageKey: dupeCI!,
                                                                                kCIInputBackgroundImageKey: ciImage])

    return dupeCI!


【讨论】:

唯一改变的是将 nil 分配给 colorMatrix 吗?这是一个错误,因为 colorMatrix 是用 let 定义的。我尝试将其更改为 var ,但我仍然遇到同样的问题。 即使我去掉 colorMatrix 并让 dupeCI 等于retainedCI,我仍然会遇到同样的问题。

以上是关于在 Swift 中重写 CIImage 最终会导致处理器下降到 0% 并冻结的主要内容,如果未能解决你的问题,请参考以下文章

从 UIImage (Swift) 获取 CIImage

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

swift中的UIImage,CIImage和CGImage有啥区别[重复]

如何在我的 CIImage Swift 上添加这个“扫描效果”

swift 为CIImage创建CVPixelBuffer

swift 对UIImage的CIImage