Как добавить пользовательский фильтр в 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. Глава "Основные строительные блоки" содержит описание цепочки, которую необходимо настроить. Также есть глава, посвященная пользовательским эффектам.