具有CGImage转换的简单CIFilter Passthru返回黑色像素

时间:2018-05-18 01:04:36

标签: ios cifilter

以下代码:

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中?

0 个答案:

没有答案