以下代码:
let skView = SKView()
let scene = SKScene()
override func viewDidLoad() {
super.viewDidLoad()
self.scene.scaleMode = .resizeFill
self.skView.presentScene(self.scene)
self.scene.backgroundColor = UIColor.black
self.view.addSubview(skView)
self.scene.shouldEnableEffects = true
let sprite = SKSpriteNode(imageNamed: "NAME_THAT_PIC")
sprite.position = CGPoint(x: 300, y: 400)
let effectNode = SKEffectNode()
effectNode.filter = MyFilter()
effectNode.addChild(sprite)
将调用此自定义过滤器,除了从CIImage创建CGImage之外什么都不做,正如许多人报告的那样正确调用context.createCGImage()
(CIImages不是像素缓冲的。)
MyFilter
简化为简单的重复测试:
class MyFilter: CIFilter {
var inputImage: CIImage?
var inputImageRect: CGRect? {
guard let image = self.inputImage else {
return nil
}
return image.extent
}
public override init() {
super.init()
}
required public init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override open var outputImage: CIImage? {
guard let inputImage = self.inputImage else {
return nil
}
let context = CIContext(options:nil)
let cgImage = context.createCGImage(inputImage, from: inputImageRect!)
// ... DO SOMETHING WITH CGIMAGE DATA ...
return CIImage(cgImage: cgImage!)
}
}
如果我用另一个内置过滤器替换MyFilter()
,它可以工作并显示更改的图像,以便viewcontroller代码工作。如果相反,我直接从过滤器输出调用返回inputImage
,它可以工作,并且将显示传入的图像。
当我转储CGImage时,图像的尺寸是正确的,但每个像素都设置为黑色。
我尝试使用UIImage(cgImage: cgImage!)
创建UIImage,但同样的情况也会发生。
什么导致像素无法加载到我从inputImage生成的cgImage中?