C# 如何在诺基亚图像SDK的过滤器浏览器示例项目中添加自定义过滤器

C# 如何在诺基亚图像SDK的过滤器浏览器示例项目中添加自定义过滤器,c#,windows-phone-8,nokia-imaging-sdk,lumia-imaging-sdk,C#,Windows Phone 8,Nokia Imaging Sdk,Lumia Imaging Sdk,我一直在研究诺基亚图像SDK上的CustomEffectBase类,并在他们的RealtimeFilterDemo示例中添加了这些类,但我也想在他们的Filter Explorer演示中添加一个效果。我不知道该怎么做。我已经使用CustomEffectBase创建了自定义效果 反向效应 public class InvertCustomEffect : CustomEffectBase { public InvertCustomEffect(IImageProvider source)

我一直在研究诺基亚图像SDK上的
CustomEffectBase
类,并在他们的RealtimeFilterDemo示例中添加了这些类,但我也想在他们的Filter Explorer演示中添加一个效果。我不知道该怎么做。我已经使用CustomEffectBase创建了自定义效果

反向效应

public class InvertCustomEffect : CustomEffectBase
{
    public InvertCustomEffect(IImageProvider source) : base(source)
    {
    }

    protected override void OnProcess(PixelRegion sourcePixelRegion, PixelRegion targetPixelRegion)
    {
        var sourcePixels = sourcePixelRegion.ImagePixels;
        var targetPixels = targetPixelRegion.ImagePixels;

        sourcePixelRegion.ForEachRow((index, width, position) =>
        {
            for (int x = 0; x < width; ++x, ++index)
            {

                uint pixel = sourcePixels[index];
                uint blue = pixel & 0x000000ff; // blue color component
                uint green = (pixel & 0x0000ff00) >> 8; // green color component
                uint red = (pixel & 0x00ff0000) >> 16; // red color component
                uint average = (uint)(0.0722 * blue + 0.7152 * green + 0.2126 * red); // weighted average component
                uint grayscale = 0xff000000 | average | (average << 8) | (average << 16); // use average for each color component

                targetPixels[index] = ~grayscale; // use inverse grayscale
            }
        });
    }
}

你在处理两件不同的事情。您试图在FilterModel.cs中添加到的组件队列正在存储IFilter集合,换句话说,不同的过滤器可以通过添加对FilterEffect队列的引用应用于图像

在您的例子中,自定义效果不是过滤器,而是(自定义)效果。这意味着它与FilterEffect在链中处于同一级别。这意味着您将无法仅将其与其他过滤器组合,您需要将其作为新元素添加到顶链中,在渲染器之前的某个位置

您可能需要重新安排示例的体系结构以使其正常工作

  • 您可以创建InvertCustomEffect的新实例,并将FilterEffect的现有实例作为源传递
  • 或者,您可以在链中创建一个单独的分支,将CameraPreviewImageSource作为源传递给InvertCustomEffect并单独渲染,而无需应用任何过滤器
  • 第三个选项是有两个FilterEffect实例,一个在自定义效果之前,一个在自定义效果之后。这将允许您在应用效果之前应用一些过滤器,在应用效果之后应用一些过滤器

我强烈建议你看一下这本书。“基本构建块”一章对需要设置的链进行了解释。它还有一章专门介绍自定义效果。

请提供指向您所指示例的链接。感谢您的深入了解。听起来,您讨论的第三种选择将是最好的选择,保持现有功能不变。我想我必须弄清楚如何将自定义效果添加到过滤效果链中。我可以结合你的第二个和第三个解决方案,将相机预览传递到InvertCustomEffect,使用组件将其添加到链中的任意位置。不知何故,Enque?我希望仍然能够以与其他过滤器相同的方式在屏幕上显示预览,这是另一个需要解决的问题。在撰写本文时,我假设您将使用CameraPreview作为源代码。因此,最通用的链将是CameraSource->FilterEffect->Custom Effect(反转CustomEffect)->FilterEffect->Render。然后可以向第一个或第二个FilterEffect添加过滤器。
public class InvertGrayscaleFilterModel : FilterModel
{
    public InvertGrayscaleFilterModel()
    {
        Name = "Invert Grayscale";
    }

    [XmlIgnore]
    public override Queue<IFilter> Components
    {
        get
        {
            Queue<IFilter> components = new Queue<IFilter>();

            components.Enqueue(new FilterAppTest.Filters.InvertCustomEffect()); //error requiring IImageProvider source

            return components;
        }
    }
}