Как сделать свой эффект для paint.net используя стандартные эффекты paint.net
На этом уроке мы рассмотрим, как вызвать стандартный эффект paint.net в коде скрипта вашего собственного плагина или эффекта paint.net. Оригинальная версия этого урока на английском языке есть здесь. Этот урок сложный, поэтому если вы не читали урок №1, урок №2 и урок №3, которые существенно проще, то рекомендую начать с них.
Итак, более сложные эффекты paint.net могут вызывать внутри себя стандартные плагины, которые есть в paint.net, вычислять результаты их действия, которые вы можете использовать как часть вашего собственного эффекта. Что делать, если вам для вашего собственного эффекта нужен, например, стандартный эффект paint.net «Гауссово размытие». Никаких проблем! Именно о подобных случаях мы сейчас и поговорим в этом уроке.
Как программно вызвать встроенный эффект paint.net внутри своего скрипта
Для создания собственных эффектов мы будем использовать Code Lab для paint.net. Прежде всего, конечно, надо сразу оговорить ограничения, которые есть у Code Lab и paint.net. У вас нет ограничений по количеству операций и количеству пользовательского кода. Но внутри своего скрипта вы можете вызвать только один стандартный эффект paint.net до выполнения собственного кода. Зато вы можете использовать различные расчеты к полученному в результате применения стандартного эффекта paint.net результату, а так же встроенные режимы наложения пикселей. Режимы наложения, такие как есть у слоев в paint.net – перекрытие, умножение осветление и т.д.
Принцип действия сложного эффекта в этом случае похож на работу со слоями в paint.net. Вы как бы применяете стандартный эффект на один слой, а потом накладываете результата эффекта на другой слой, используя доступные в paint.net режимы смешивания слоев или собственные алгоритмы.
Обратите внимание, что на самом деле вы работаете только с одним слоем! Эффект paint.net не может видеть содержимое других слоев изображения. Этот рисунок просто показывает технологию действия эффекта, и она очень похожа на пример работы со слоями в paint.net.
Если вы помните терминологию, использованную нами в предыдущих уроках, то у нас при программировании эффекта paint.net есть два холста – холст источник с исходным изображением и холст назначения, это результат выполнения нашего эффекта. Таким образом, вызывая в начале нашего собственного скрипта стандартный эффект paint.net, например, Гауссово размытие, мы получаем на холсте назначение размытое изображение, полученное применением «Гауссова размытия» к исходному изображению с холста источника. На холсте источнике остается исходное изображение.
Таким образом, после вызова стандартного эффекта paint.net, вы располагаете двумя наборами пикселей. На холсте источнике – исходное изображение, на холсте назначение – изображение после эффекта, например, размытое. Дальше вы можете в ходе своего скрипта обрабатывать эти значения любым способом, а так же можете применять к ним стандартные режимы смешивания paint.net.
Вызвать можно любой встроенный (стандартный) эффект paint.net. Ниже приведем коды для настроек параметров и коды вызовов основных встроенных эффектов paint.net.
Код: Выделить всё
// Настройка параметров для Гауссова размытия Gaussian Blur
GaussianBlurEffect blurEffect = new GaussianBlurEffect();
PropertyCollection bProps = blurEffect.CreatePropertyCollection();
PropertyBasedEffectConfigToken bParameters = new PropertyBasedEffectConfigToken(bProps);
bParameters.SetPropertyValue(GaussianBlurEffect.PropertyNames.Radius, Amount1); // fix
blurEffect.SetRenderInfo(bParameters, new RenderArgs(dst), new RenderArgs(src));
// Вызов эффекта Гауссово размытие Gaussian Blur
blurEffect.Render(new Rectangle[1] {rect},0,1);
Код: Выделить всё
// Настройка параметров для эффекта Барельеф Emboss
EmbossEffect embossEffect = new EmbossEffect();
PropertyCollection eProps = embossEffect.CreatePropertyCollection();
PropertyBasedEffectConfigToken eParameters = new PropertyBasedEffectConfigToken(eProps);
eParameters.SetPropertyValue(EmbossEffect.PropertyNames.Angle, (double)Amount1); // fix
embossEffect.SetRenderInfo(eParameters, new RenderArgs(dst), new RenderArgs(src));
// Вызов эффекта Барельеф - Emboss
embossEffect.Render(new Rectangle[1] {rect},0,1);
Код: Выделить всё
// Настройка параметров для эффекта Уменьшение шума Noise Reduction function
ReduceNoiseEffect noiseEffect = new ReduceNoiseEffect();
PropertyCollection nProps = noiseEffect.CreatePropertyCollection();
PropertyBasedEffectConfigToken nParameters = new PropertyBasedEffectConfigToken(nProps);
nParameters.SetPropertyValue(ReduceNoiseEffect.PropertyNames.Radius, 10); // fix
nParameters.SetPropertyValue(ReduceNoiseEffect.PropertyNames.Strength, Amount1); // fix
noiseEffect.SetRenderInfo(nParameters, new RenderArgs(dst), new RenderArgs(src));
// Вызов эффекта Уменьшение шума Reduce Noise function
noiseEffect.Render(new Rectangle[1] {rect},0,1);
Код: Выделить всё
// Настройка параметров для коррекции Яркость и контраст Brightness and Contrast Adjustment function
BrightnessAndContrastAdjustment bacAdjustment = new BrightnessAndContrastAdjustment();
PropertyCollection bacProps = bacAdjustment.CreatePropertyCollection();
PropertyBasedEffectConfigToken bacParameters = new PropertyBasedEffectConfigToken(bacProps);
bacParameters.SetPropertyValue(BrightnessAndContrastAdjustment.PropertyNames.Brightness, Amount1); // fix
bacParameters.SetPropertyValue(BrightnessAndContrastAdjustment.PropertyNames.Contrast, 45); // fix
bacAdjustment.SetRenderInfo(bacParameters, new RenderArgs(dst), new RenderArgs(src));
// Вызов коррекции Яркость и контраст Brightness and Contrast Adjustment
bacAdjustment.Render(new Rectangle[1] {rect},0,1);
Код: Выделить всё
// Настройка параметров для эффекта Размытие в движении Motion Blur effect
MotionblurEffect blurEffect = new MotionblurEffect();
PropertyCollection blurProps = blurEffect.CreatePropertyCollection();
PropertyBasedEffectConfigToken BlurParameters = new PropertyBasedEffectConfigToken(blurProps);
BlurParameters.SetPropertyValue(MotionblurEffect.PropertyNames.Angle, Amount1); // fix
BlurParameters.SetPropertyValue(MotionblurEffect.PropertyNames.Centered, Amount2); // fix
BlurParameters.SetPropertyValue(MotionblurEffect.PropertyNames.Distance, Amount3); // fix
blurEffect.SetRenderInfo(BlurParameters, new RenderArgs(dst), new RenderArgs(src));
// Вызов эффекта Размытие в движении Motion Blur function
blurEffect.Render(new Rectangle[1] {rect},0,1);
Код: Выделить всё
// Настройка параметров для эффекта Картина, масло Oil Painting effect
OilPaintingEffect oilpaintEffect = new OilPaintingEffect();
PropertyCollection oilpaintProps = oilpaintEffect.CreatePropertyCollection();
PropertyBasedEffectConfigToken oilpaintParameters = new PropertyBasedEffectConfigToken(oilpaintProps);
oilpaintParameters.SetPropertyValue(OilPaintingEffect.PropertyNames.BrushSize, Amount1); // fix
oilpaintParameters.SetPropertyValue(OilPaintingEffect.PropertyNames.Coarseness, Amount2); // fix
oilpaintEffect.SetRenderInfo(oilpaintParameters, new RenderArgs(dst), new RenderArgs(src));
// Вызов эффекта Картина, масло Oil Painting function
oilpaintEffect.Render(new Rectangle[1] {rect},0,1);
Код: Выделить всё
// Настройка параметров для эффекта Подсвеченные края Edge Detect effect
EdgeDetectEffect edgedetectEffect = new EdgeDetectEffect();
PropertyCollection edgeProps = edgedetectEffect.CreatePropertyCollection();
PropertyBasedEffectConfigToken EdgeParameters = new PropertyBasedEffectConfigToken(edgeProps);
EdgeParameters.SetPropertyValue(EdgeDetectEffect.PropertyNames.Angle, Amount1); // fix
edgedetectEffect.SetRenderInfo(EdgeParameters, new RenderArgs(dst), new RenderArgs(src));
// Вызов эффекта Подсвеченные края Edge Detect function
edgedetectEffect.Render(new Rectangle[1] {rect},0,1);
Код: Выделить всё
// Настройка параметров для эффекта Подсветка Relief effect
ReliefEffect reliefEffect = new ReliefEffect();
PropertyCollection reliefProps = reliefEffect.CreatePropertyCollection();
PropertyBasedEffectConfigToken ReliefParameters = new PropertyBasedEffectConfigToken(reliefProps);
ReliefParameters.SetPropertyValue(ReliefEffect.PropertyNames.Angle, Amount1); // fix
reliefEffect.SetRenderInfo(ReliefParameters, new RenderArgs(dst), new RenderArgs(src));
// Вызов эффекта Подсветка Relief function
reliefEffect.Render(new Rectangle[1] {rect},0,1);
Код: Выделить всё
// Настройка параметров для коррекции Сепия Sepia effect
SepiaEffect sepiaEffect = new SepiaEffect();
PropertyCollection sepiaProps = sepiaEffect.CreatePropertyCollection();
PropertyBasedEffectConfigToken SepiaParameters = new PropertyBasedEffectConfigToken(sepiaProps);
sepiaEffect.SetRenderInfo(SepiaParameters, new RenderArgs(dst), new RenderArgs(src));
// Вызов коррекции Сепия Sepia function
sepiaEffect.Render(new Rectangle[1] {rect},0,1);