Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CGContext.normal和.color混合模式的CIFilter等效项_Ios_Sprite Kit_Cifilter - Fatal编程技术网

Ios CGContext.normal和.color混合模式的CIFilter等效项

Ios CGContext.normal和.color混合模式的CIFilter等效项,ios,sprite-kit,cifilter,Ios,Sprite Kit,Cifilter,我一直在尝试使用CIFilter复制SKSpriteNode着色方法,以便在另一种类型的SKNode(如SKEffectNode)上使用它。 在“着色”下,精灵节点提供了一种简单着色精灵的方法。我怎么能对任何雪碧做同样的事呢 我在CoreGraphics中为这种着色重新创建了一个模拟,在UIImage中添加了一个着色的函数(见下文)。它工作正常,并给出类似的结果。唯一的问题是CIImage和CGImage在许多版本的iOS上都表现不好(bug!) 我现在转向使用合成过滤器设置标准CIFilter

我一直在尝试使用CIFilter复制SKSpriteNode着色方法,以便在另一种类型的SKNode(如SKEffectNode)上使用它。 在“着色”下,精灵节点提供了一种简单着色精灵的方法。我怎么能对任何雪碧做同样的事呢

我在CoreGraphics中为这种着色重新创建了一个模拟,在UIImage中添加了一个
着色的
函数(见下文)。它工作正常,并给出类似的结果。唯一的问题是CIImage和CGImage在许多版本的iOS上都表现不好(bug!)

我现在转向使用合成过滤器设置标准CIFilter,但没有成功

提供多个选项,但在不知道公式的情况下,很难将我在CoreGraphics中的操作与CoreImage中的任何特定过滤器相匹配。有没有一种方法可以使CIFilter现有的复合过滤器链获得与SKSpriteNode中的着色算法类似的结果

extension UIImage {

    public func tinted(color: UIColor, colorBlendFactor: CGFloat) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        defer { UIGraphicsEndImageContext() }

        guard let context = UIGraphicsGetCurrentContext() else { return self }

        context.translateBy(x: 0, y: size.height)
        context.scaleBy(x: 1.0, y: -1.0)
        let rect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)

        context.setBlendMode(.normal)
        UIColor.black.setFill()
        context.fill(rect)
        context.setBlendMode(.normal)

        let cgImage = self.cgImage
        context.draw(cgImage!, in: rect)

        context.setBlendMode(.color)
        color.withAlphaComponent(colorBlendFactor).setFill()
        context.fill(rect)

        context.setBlendMode(.destinationIn)
        context.draw(cgImage!, in: rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        return image!
    }
}

我能够想出如何建立一个CIFilter来为图像着色,就像SKSpriteNode混合颜色一样。从下图来看,左边是苹果的混合算法。在右侧,我的CIFilter算法:

下面是用Swift4编写的代码:

import CoreImage
import UIKit

class TintFilter: CIFilter {

    @objc dynamic var inputImage: CIImage?

    var color = UIColor.black
    var colorBlendFactor: CGFloat = 1.0

    public init(color: UIColor, colorBlendFactor: CGFloat) {
        super.init()
        self.color = color
        self.colorBlendFactor = colorBlendFactor
    }

    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func computeBlendComponent(_ component: CGFloat) -> CGFloat {
        return 1.0 - (colorBlendFactor * (1.0 - component))
    }

    override open var outputImage: CIImage? {

        guard let inputImage = self.inputImage else {
            return nil
        }

        let colorGenerator = CIFilter(name:"CIConstantColorGenerator")

        var hue: CGFloat = 0.0, saturation: CGFloat = 0.0, brightness: CGFloat = 0.0, alpha: CGFloat = 0.0
        color.getHue(&hue, saturation: &saturation, brightness:&brightness, alpha:&alpha)
        brightness += colorBlendFactor - 1.0
        brightness = max(min(brightness, 1.0), 0.0)
        let newColor = UIColor(hue: hue, saturation: saturation, brightness:brightness, alpha:alpha)

        let inputColor = CIColor(cgColor: newColor.cgColor)
        colorGenerator?.setValue(inputColor, forKey: "inputColor")

        guard var colorOutputImage = colorGenerator?.outputImage else {
            return nil
        }

        colorOutputImage = CIImage(color: CIColor(color: self.color.withAlphaComponent(self.colorBlendFactor)))

        return colorOutputImage.applyingFilter("CIMultiplyCompositing", parameters: ["inputBackgroundImage": inputImage]).applyingFilter("CIMultiplyBlendMode", parameters: ["inputBackgroundImage": inputImage])
    }
}

如果您在sprite工具包中执行此操作,则不希望使用CGContext。您希望使用着色器。我不确定我是否在关注您的问题,但是为什么不将一个精灵节点作为效果节点的子节点呢?