CodeLab - первые шаги (Цветной эскиз)

Эта ветка форума посвящена инструкции по работе с лабораторией скриптов CodeLab от BoltBait. С её помощью можно делать свои плагины для Paint.NET. Все вопросы по CodeLab размещаются здесь.
Ответить
ReMake
Сообщения: 244
Зарегистрирован: 10 сен 2014, 01:25
Репутация: 69
Пол: Мужской
Откуда: Брест, Беларусь

CodeLab - первые шаги (Цветной эскиз)

Сообщение ReMake » 17 фев 2016, 23:25

Очень простой эффект, имитирующий рисунок цветными карандашами.

Откройте какое-либо изображение. Я использовал измененную стоковую фотографию с 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;
        }
    }
}
Сохраните этот код с именем ColorSketch (меню Файл -> Сохранить или комбинация клавиш Ctrl+S).

Вновь откройте меню Файл и выберите Новый. В открывшемся окне выберите Контрастность и нажмите кнопку Генерировать код. В сгенерированном сценарии выделите и скопируйте (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)
Загрузите сохраненный ранее сценарий ColorSketch.cs (меню Файл -> Открыть или комбинация клавиш Ctrl+O) и вставьте этот код перед строкой

Код: Выделить всё

    for (int y = rect.Top; y < rect.Bottom; y++)
Откройте Конструктор интерфейса (меню Файл -> Конструктор интерфейса или комбинация клавиш Ctrl+I).
В поле Имя элемента замените Радиус на Толщина карандаша. В поле Минимум впишите 1, в поле По умолчанию - 2 и в поле Максимум - 20. Нажмите кнопку Обновить.
Теперь в поле Имя элемента впишите Диапазон. В поле Минимум впишите -20, в поле По умолчанию - 0 и нажмите кнопку Добавить. Нажмите кнопку OK.

В строке

Код: Выделить всё

    bacParameters.SetPropertyValue(BrightnessAndContrastAdjustment.PropertyNames.Brightness, Amount1);
замените Amount1 на Amount2.

В строке

Код: Выделить всё

    bacParameters.SetPropertyValue(BrightnessAndContrastAdjustment.PropertyNames.Contrast, Amount2);
вставьте знак минус перед Amount2:

Код: Выделить всё

    bacParameters.SetPropertyValue(BrightnessAndContrastAdjustment.PropertyNames.Contrast, -Amount2);
В строке

Код: Выделить всё

    bacAdjustment.SetRenderInfo(bacParameters, new RenderArgs(dst), new RenderArgs(src));
замените src на dst:

Код: Выделить всё

    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;
        }
    }
}
Сохраните его с тем же именем (ColorSketch.cs).

Создайте для этого эффекта значок в формате PNG размером 16x16 пикселей. Я использовал измененный значок встроенного эффекта Набросок карандашом: Изображение

Сохраните ваш эффект как DLL файл (меню Файл -> Сохранить как DLL или комбинация клавиш Ctrl+B). Проверьте работу эффекта в Paint.NET.

Интерфейс эффекта:

Изображение

Надеюсь, этот эффект не вызвал затруднений.

Ответить

Вернуться в «CodeLab от BoltBait»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость