Как добавить пользовательский фильтр в Filter Explorer Sample Project из Nokia Imaging SDK

Я исследовал CustomEffectBase класс по Nokia Imaging SDK, и я работал над их добавлением в имеющийся у них пример RealtimeFilterDemo, но я бы хотел добавить эффект к их демонстрации Filter Explorer. Я не уверен, как это сделать. Я создал пользовательский эффект, используя 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 существует Model с именем FilterModel.cs, в которую вводится эффект, который нужно выполнить. Проблема в том, что стандартные эффекты, которые поставляются с SDK, имеют такие аргументы, как int и double, которые являются просто параметрами для настройки эффектов, но созданный мной класс, расширяющий CustomEffectBase, требует IImageProvider source в качестве аргумента. Это где я застрял, и я не знаю, как реализовать это в проекте Filter Explorer и прогресс отсюда?

FilterModel.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;
        }
    }
}

1 ответ

Вы имеете дело с двумя разными вещами здесь. Очередь компонентов, которую вы пытаетесь добавить в FilterModel.cs, хранит наборы фильтров IFilter, другими словами, различные фильтры, которые можно применить к изображению, добавив ссылку на очередь FilterEffect.

Пользовательский эффект, в вашем случае InvertGrayscale FilterModel, это не фильтр, это (пользовательский) эффект. Это означает, что он находится на том же уровне в цепочке, что и FilterEffect. Это означает, что вы не сможете просто объединить его с другими фильтрами, вам нужно будет добавить его как новый элемент в верхнюю цепочку, где-то перед рендерером.

Возможно, вам придется изменить архитектуру образца, чтобы это работало.

  • Вы можете создать новый экземпляр InvertCustomEffect и добавить существующий экземпляр FilterEffect в качестве источника.
  • Или вы можете создать отдельную ветвь в цепочке, передать CameraPreviewImageSource в качестве источника для вашего InvertCustomEffect и отобразить его отдельно, без применения каких-либо фильтров.
  • Третий вариант - иметь два экземпляра FilterEffect, один до и один после вашего пользовательского эффекта. Это позволит вам применить некоторые фильтры до применения вашего эффекта, а некоторые после.

Я настоятельно рекомендую вам взглянуть на документ "Основные концепции" Nokia Imaging SDK. Глава "Основные строительные блоки" содержит описание цепочки, которую необходимо настроить. Также есть глава, посвященная пользовательским эффектам.

Другие вопросы по тегам