Откройте какое-либо изображение. Я использовал измененную стоковую фотографию с FireStock.
Создайте копию фонового слоя (или примените комбинацию клавиш Ctrl+Shift+D).
Примените к этому слою эффект Инвертировать цвета (меню Коррекция -> Инвертировать цвета или примените комбинацию клавиш Ctrl+Shift+I).
Откройте Свойства слоя (клавиша F4) и установите режим смешивания Осветление основы.
При этом активное окно заполнится белым цветом. В зависимости от выбранного вами изображения, в некоторых местах могут оставаться темные области, но большинство документа будет заполнено белым.
Примените к активному слою эффект Гауссово размытие (меню Эффекты -> Размытие -> Гауссово размытие). Передвигайте слайдер Радиус вправо до получения необходимого результата. Для данного изображения я остановился на значении 3 пикселя.
Объедините оба слоя (комбинация клавиш Ctrl+M) и мы получили необходимый результат.
Попробуйте применить к полученному изображению эффект Яркость и контрастность (меню Коррекция -> Яркость и контрастность), при этом значения яркости и контрастности должны иметь одинаковые значения, но с противоположным знаком (например, при значении контрастности равной 10 яркость должна быть равна -10).
Кстати встроенный эффект Набросок карандашом построен по этому же алгоритму.
Теперь давайте начнем создавать эффект.
Откройте CodeLab (меню Эффекты -> Advanced -> CodeLab). В меню Файл выберите Новый (или комбинация клавиш Ctrl+N). В диалоговом окне Редактор сценария нажмите кнопку Нет. В открывшемся окне выберите Гауссово размытие. В верхнем выпадающем списке Обработка пикселя выберите Инвертировать цвета, в выпадающем списке Режим смешивания выберите Осветление основы. Нажмите кнопку Генерировать код.
Вам будет представлен следующий сценарий:
Код: Выделить всё
// Name:
// Submenu:
// Author:
// Title:
// Version:
// Desc:
// Keywords:
// URL:
// Help:
#region UICode
IntSliderControl Amount1=10; // [0,100] Радиус
#endregion
// Настройки использования операций с пикселями
private UnaryPixelOps.Invert invertOp = new UnaryPixelOps.Invert();
// Настройки использования режима смешивания Осветление основы
private BinaryPixelOp colordodgeOp = LayerBlendModeUtil.CreateCompositionOp(LayerBlendMode.ColorDodge);
// Это основной цикл функции обработки
void Render(Surface dst, Surface src, Rectangle rect)
{
// Настройки вызова эффекта Гауссово размытие
GaussianBlurEffect blurEffect = new GaussianBlurEffect();
PropertyCollection blurProps = blurEffect.CreatePropertyCollection();
PropertyBasedEffectConfigToken BlurParameters = new PropertyBasedEffectConfigToken(blurProps);
BlurParameters.SetPropertyValue(GaussianBlurEffect.PropertyNames.Radius, Amount1);
blurEffect.SetRenderInfo(BlurParameters, new RenderArgs(dst), new RenderArgs(src));
// Вызов функции Гауссово размытие
blurEffect.Render(new Rectangle[1] {rect},0,1);
// Теперь в основном цикле обработки холст назначения (dst) имеет размытую версию холста источника (src)
for (int y = rect.Top; y < rect.Bottom; y++)
{
if (IsCancelRequested) return;
for (int x = rect.Left; x < rect.Right; x++)
{
ColorBgra CurrentPixel = dst[x,y];
// ВЫПОЛНЕНИЕ: Добавьте здесь дополнительный код обработки пикселей
CurrentPixel = invertOp.Apply(CurrentPixel);
CurrentPixel = colordodgeOp.Apply(src[x,y], CurrentPixel);
dst[x,y] = CurrentPixel;
}
}
}
Вновь откройте меню Файл и выберите Новый. В открывшемся окне выберите Контрастность и нажмите кнопку Генерировать код. В сгенерированном сценарии выделите и скопируйте (Ctrl+C) следующий код:
Код: Выделить всё
// Настройки вызова корректирующей функции Яркость и контрастность
BrightnessAndContrastAdjustment bacAdjustment = new BrightnessAndContrastAdjustment();
PropertyCollection bacProps = bacAdjustment.CreatePropertyCollection();
PropertyBasedEffectConfigToken bacParameters = new PropertyBasedEffectConfigToken(bacProps);
bacParameters.SetPropertyValue(BrightnessAndContrastAdjustment.PropertyNames.Brightness, Amount1);
bacParameters.SetPropertyValue(BrightnessAndContrastAdjustment.PropertyNames.Contrast, Amount2);
bacAdjustment.SetRenderInfo(bacParameters, new RenderArgs(dst), new RenderArgs(src));
// Вызов корректирующей функции Яркость и контрастность
bacAdjustment.Render(new Rectangle[1] {rect},0,1);
// Теперь в основном цикле обработки холст назначения (dst) имеет скорректированную версию холста источника (src)
Код: Выделить всё
for (int y = rect.Top; y < rect.Bottom; y++)
В поле Имя элемента замените Радиус на Толщина карандаша. В поле Минимум впишите 1, в поле По умолчанию - 2 и в поле Максимум - 20. Нажмите кнопку Обновить.
Теперь в поле Имя элемента впишите Диапазон. В поле Минимум впишите -20, в поле По умолчанию - 0 и нажмите кнопку Добавить. Нажмите кнопку OK.
В строке
Код: Выделить всё
bacParameters.SetPropertyValue(BrightnessAndContrastAdjustment.PropertyNames.Brightness, Amount1);
В строке
Код: Выделить всё
bacParameters.SetPropertyValue(BrightnessAndContrastAdjustment.PropertyNames.Contrast, Amount2);
Код: Выделить всё
bacParameters.SetPropertyValue(BrightnessAndContrastAdjustment.PropertyNames.Contrast, -Amount2);
Код: Выделить всё
bacAdjustment.SetRenderInfo(bacParameters, new RenderArgs(dst), new RenderArgs(src));
Код: Выделить всё
bacAdjustment.SetRenderInfo(bacParameters, new RenderArgs(dst), new RenderArgs(dst));
Код: Выделить всё
// Теперь в основном цикле обработки холст назначения (dst) имеет скорректированную версию холста источника (src)
Код: Выделить всё
// Теперь в основном цикле обработки холст назначения (dst) имеет скорректированную версию
Код: Выделить всё
// Name: Цветной эскиз
// Submenu: Artistic
// Author: ReMake
// Title: Цветной эскиз v1.0 ReMake 2016
// Version: 1.0
// Desc: Paint.NET эффект, имитирующий эскиз цветными карандашами
// Keywords: paint.net|эффект|цветной|эскиз
// URL: http://www.getpaint.net/redirect/plugins.html
// Help:
Код: Выделить всё
// Name: Цветной эскиз
// Submenu: Artistic
// Author: ReMake
// Title: Цветной эскиз v1.0 ReMake 2016
// Desc: Paint.NET эффект, имитирующий эскиз цветными карандашами
// Keywords: paint.net|эффект|цветной|эскиз
// URL: http://www.getpaint.net/redirect/plugins.html
#region UICode
int Amount1=2; // [1,20] Толщина карандаша
int Amount2=0; // [-20,20] Диапазон
#endregion
// Настройки использования операций с пикселями
private UnaryPixelOps.Invert invertOp = new UnaryPixelOps.Invert();
// Настройки использования режима смешивания Осветление основы
private UserBlendOps.ColorDodgeBlendOp colordodgeOp = new UserBlendOps.ColorDodgeBlendOp();
// Это основной цикл функции обработки
void Render(Surface dst, Surface src, Rectangle rect)
{
// Настройки вызова эффекта Гауссово размытие
GaussianBlurEffect blurEffect = new GaussianBlurEffect();
PropertyCollection blurProps = blurEffect.CreatePropertyCollection();
PropertyBasedEffectConfigToken BlurParameters = new PropertyBasedEffectConfigToken(blurProps);
BlurParameters.SetPropertyValue(GaussianBlurEffect.PropertyNames.Radius, Amount1);
blurEffect.SetRenderInfo(BlurParameters, new RenderArgs(dst), new RenderArgs(src));
// Вызов функции Гауссово размытие
blurEffect.Render(new Rectangle[1] {rect},0,1);
// Теперь в основном цикле обработки холст назначения (dst) имеет размытую версию холста источника (src)
// Настройки вызова корректирующей функции Яркость и контрастность
BrightnessAndContrastAdjustment bacAdjustment = new BrightnessAndContrastAdjustment();
PropertyCollection bacProps = bacAdjustment.CreatePropertyCollection();
PropertyBasedEffectConfigToken bacParameters = new PropertyBasedEffectConfigToken(bacProps);
bacParameters.SetPropertyValue(BrightnessAndContrastAdjustment.PropertyNames.Brightness, Amount2);
bacParameters.SetPropertyValue(BrightnessAndContrastAdjustment.PropertyNames.Contrast, -Amount2);
bacAdjustment.SetRenderInfo(bacParameters, new RenderArgs(dst), new RenderArgs(dst));
// Вызов корректирующей функции Яркость и контрастность
bacAdjustment.Render(new Rectangle[1] {rect},0,1);
// Теперь в основном цикле обработки холст назначения (dst) имеет скорректированную версию
for (int y = rect.Top; y < rect.Bottom; y++)
{
for (int x = rect.Left; x < rect.Right; x++)
{
ColorBgra CurrentPixel = dst[x,y];
// ВЫПОЛНЕНИЕ: Добавьте здесь дополнительный код обработки пикселей
CurrentPixel = invertOp.Apply(CurrentPixel);
CurrentPixel = colordodgeOp.Apply(src[x,y], CurrentPixel);
dst[x,y] = CurrentPixel;
}
}
}
Создайте для этого эффекта значок в формате PNG размером 16x16 пикселей. Я использовал измененный значок встроенного эффекта Набросок карандашом:
Сохраните ваш эффект как DLL файл (меню Файл -> Сохранить как DLL или комбинация клавиш Ctrl+B). Проверьте работу эффекта в Paint.NET.
Интерфейс эффекта:
Надеюсь, этот эффект не вызвал затруднений.