2

我一直在研究CustomEffectBaseNokia Imaging SDK 上的课程,并且我已经在他们拥有的 RealtimeFilterDemo 示例中添加了这些,但我也想在他们的 Filter Explorer Demo 中添加一个效果。我不知道该怎么做。我使用 CustomEffectBase 创建了自定义效果

InvertCustomEffect.cs

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
            }
        });
    }
}

这是一个基本的灰度反转效果。在Filter Explorer项目中,有一个名为FilterModel.cs的Model,其中输入了要执行的效果。问题是,SDK 附带的标准效果具有参数,例如 int 和 doubles,它们只是调整效果的参数,但我创建的扩展 CustomEffectBase 的类需要IImageProvider source作为参数。这就是我卡住的地方,我不知道如何在 Filter Explorer 项目中实现它并从这里取得进展?

过滤器模型.cs

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;
        }
    }
}
4

1 回答 1

1

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

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

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

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

我强烈建议您查看Nokia Imaging SDK 的核心概念文档。“基本构建块”一章包含您需要设置的链的说明。它还有一章专门介绍自定义效果。

于 2014-01-07T07:29:36.637 回答