在CALayer上使用自定义CIFilter不会显示对CALayer的更改

Using custom CIFilter on CALayer shows no change to CALayer(在CALayer上使用自定义CIFilter不会显示对CALayer的更改)

本文介绍了在CALayer上使用自定义CIFilter不会显示对CALayer的更改的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正在尝试创建自定义CIFilter以添加到我们的CALayer's.上,但似乎只有默认CIFilter才能在CALayer.上工作

我们在ViewController.swift上创建了一个小项目,添加了:

import Cocoa
import CoreImage

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Create some layers to work with! (square with gradient color)
        let mainLayer = CALayer()
        let shapeLayer = CAShapeLayer()
        let gradientLayer = CAGradientLayer()
        gradientLayer.colors = [NSColor.red.cgColor, NSColor.white.cgColor, NSColor.yellow.cgColor, NSColor.black.cgColor]
        
        shapeLayer.path = CGPath(rect: CGRect(x: 0, y: 0, width: 500, height: 500), transform: nil)
        shapeLayer.fillColor = CGColor.black
        
        gradientLayer.frame = CGRect(x: 0, y: 0, width: 500, height: 500)
        gradientLayer.mask = shapeLayer
        
        gradientLayer.setAffineTransform(CGAffineTransform(translationX: 50, y: 50))
        mainLayer.addSublayer(gradientLayer)
        
        mainLayer.filters = []
        self.view.layer?.addSublayer(mainLayer)

        // Register the custom filter
        CustomFilterRegister.register()
        
        // Test with a normal image file, WORKS!
//      if let image = NSImage(named: "test"), let cgImage = image.cgImage(forProposedRect: nil, context: nil, hints: nil) {
//          if let filter = CIFilter(name: "CustomFilter") {
//              filter.setValue(CIImage(cgImage: cgImage), forKey: kCIInputImageKey)
//              let output = filter.outputImage
//              // WORKS! Image filtered as expected!
//          }
//      }
        
        // Does NOT work. No change in color of the layer!
        if let filter = CIFilter(name: "CustomFilter") {
            filter.name = "custom"
            mainLayer.filters?.append(filter)
        }

        // This works: mainLayer and sublayers are blurred!
//      if let filter = CIFilter(name: "CIGaussianBlur") {
//          filter.name = "blur"
//          mainLayer.filters?.append(filter)
//      }


    }
}
}

我们创建了一个简单的自定义CIFilter,以便在开始构建我们的自定义CIFilter.

之前进行第一次尝试
class CustomFilter: CIFilter {
    
    // Error in xcode if you don't add this in!
    override class var supportsSecureCoding: Bool {
        return true
    }
        
    @objc dynamic var inputImage: CIImage?
    @objc dynamic var inputSaturation: CGFloat = 1
    @objc dynamic var inputBrightness: CGFloat = 0
    @objc dynamic var inputContrast: CGFloat = 1
    override func setDefaults() {
        inputSaturation = 1
        inputBrightness = 0
        inputContrast = 2
    }
    
    override public var outputImage: CIImage? {
        guard let image = inputImage else {
            return nil
        }
        return image.applyingFilter("CIPhotoEffectProcess")
            .applyingFilter("CIColorControls", parameters: [
                kCIInputSaturationKey: inputSaturation,
                kCIInputBrightnessKey: inputBrightness,
                kCIInputContrastKey: inputContrast
            ])
    }
}

class CustomFilterRegister: CIFilterConstructor {
    static func register() {
        CIFilter.registerName(
            "CustomFilter", constructor: CustomFilterRegister(),
            classAttributes: [
                kCIAttributeFilterCategories: [kCICategoryBlur, kCICategoryVideo, kCICategoryStillImage]
            ])
    }
    func filter(withName name: String) -> CIFilter? {
        switch name {
        case "CustomFilter":
            return CustomFilter()
        default:
            return nil
        }
    }
}

在视图控制器中,我们添加了用普通图像进行测试的代码。这确实起作用了,所以过滤器看起来是正常的。我们还尝试了默认CIGaussianBlur,这在CALayer.

上确实有效

我们不知道需要什么才能获得自定义CIFilter使用CALayer,,并且似乎找不到有关它的任何信息。

请注意,我们不是在寻找这种类型的CIFilter或获取筛选器结果的其他方法。我们需要自定义CIFilter来处理CALayer.

推荐答案

正如@DonMag指出的那样,它应该适应他所描述的变化。多么不幸的是,我们今天收到了苹果的回复;

此时,CALayer上的自定义CIFilter出现错误,无法正常工作。目前没有解决此错误的方法。

当我们提交错误时,我会在这里为感兴趣的人添加链接。但目前您无法向MacOS 11上的CALayer添加自定义CIFilter。

让我们希望他们为你们所有阅读这篇文章的人解决这个问题。


编辑

那么坏消息..。目前在MacOS 12.2.1上,它仍然有同样的问题,基于我们的票证没有发生任何事情。看起来苹果并不想解决这个问题。对于那些正在寻找的人来说:这仍然不适用于CALayer,即使在其他答案中描述的所有选项都打开了。内置CIFilter按预期工作。

请注意,对于使用AVVideoCompositionCoreAnimationTool的导出,在CALayer上使用相同的自定义CIFilter确实有效!

这篇关于在CALayer上使用自定义CIFilter不会显示对CALayer的更改的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:在CALayer上使用自定义CIFilter不会显示对CALayer的更改

基础教程推荐