Using custom CIFilter on CALayer shows no change to 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的更改
基础教程推荐
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01