无法将自定义Core Image Filter应用于CALayer的Filters属性

时间:2016-03-03 16:32:15

标签: macos cocoa xamarin core-image cifilter

注意:我正在使用Xamarin.Mac,但我相信对于大多数快速的Cocoa开发人员来说,意图和/或失误应该足够明确。

问题: 我的自定义过滤器未应用于它所支持的视图。

示例

global_step

问题不在于我的自定义过滤器无法执行任何操作。当我分配其Image属性并绘制其OutputImage时,它按预期工作。

这告诉我Kernel和OutputImage方法正常运行。

源代码

HazeFilter.cs

class SuperCoolClassSerializer < ActiveModel::Serializer
  attributes :foo, :bar, :price
end

Canvas.cs

var builtInFilter = new CIColorInvert();
builtInFilter.SetDefaults();

var customFilter = new HazeFilter(); 
customFilter.SetDefaults(); 

//In both cases here, the Image and OutputImage properties will have a null value
Layer.Filters = new CIFilter[1]{builtInFilter}; //Works
Layer.Filters = new CIFilter[1]{customFilter}; //Does nothing

实例化

public class HazeFilter : CIFilter
{
    static CIKernel hazeRemovalKernel;

    public HazeFilter () : base()
    {
        if (hazeRemovalKernel == null) {
            hazeRemovalKernel = CIKernel.FromProgramSingle(@"
                kernel vec4 myHazeRemovalKernel(sampler src, __color color, float distance, float slope)
                {

                    vec4 t;
                    float d;

                    d = destCoord().y * slope + distance;
                    t = unpremultiply(sample(src, samplerCoord(src)));
                    t = (t-d*color)/(1.0-d);

                    return premultiply(t);
                }");
        }
    }

    public override void SetDefaults ()
    {
        base.SetDefaults ();
        inputColor = CIColor.FromCGColor (NSColor.Purple.CGColor); 
        inputDistance = 0.8; 
        inputSlope = 0.002; 
    }

    CIImage image; 
    [Export("inputImage")]
    public new CIImage Image
    {
        get { return image; }
        set {
            WillChangeValue ("inputImage");
            image = value; 
            DidChangeValue ("inputImage");
        }
    }

    CIColor color; 
    [Export("inputColor")]
    public CIColor inputColor
    {
        get { return color; }
        set {
            WillChangeValue ("inputColor");
            color = value; 
            DidChangeValue ("inputColor");
        }
    }

    NSNumber distance; 
    [Export("inputDistance")]
    public NSNumber inputDistance{
        get { return distance; }
        set { 
            WillChangeValue ("inputDistance");
            distance = value;
            DidChangeValue ("inputDistance");
        }
    }

    NSNumber slope; 
    [Export("inputSlope")]
    public NSNumber inputSlope{
        get { return slope; }
        set { 
            WillChangeValue ("inputSlope");
            slope = value;
            DidChangeValue ("inputSlope");
        }
    }

    [Export("outputImage")]
    public new CIImage OutputImage
    {
        get
        {
            if (Image == null)
                return null; 

            var inputSampler = new CISampler (Image); 
            var argumentArray = NSArray.FromNSObjects (new NSObject[] {
                inputSampler,
                Runtime.GetNSObject (inputColor.Handle), 
                inputDistance,
                inputSlope
            });

            return Apply (hazeRemovalKernel, argumentArray, null);
        }
    }

}

0 个答案:

没有答案