Урок №1 Как сделать свой первый плагин в Paint.NET

Эта ветка форума посвящена вопросу, как самому сделать свой плагин (эффект) для Paint.NET. Для публикации своих эффектов используйте основной форум "Эффекты и плагины к Paint.NET"
Аватара пользователя
xmario
Администратор
Сообщения: 3402
Зарегистрирован: 03 апр 2010, 20:12
Репутация: 45
Пол: Мужской
Откуда: Москва

Урок №1 Как сделать свой первый плагин в Paint.NET

Сообщение xmario » 22 апр 2010, 15:23

Урок №1 Как сделать свой первый эффект в Paint.NET

Этот урок представляет собой интерпретацию на русском языке англоязычного урока от автора плагина CodeLab под ником BoltBait. Исходный текст урока на английском языке можно найти здесь.

Итак, в качестве первого плагина Paint.NET мы будем создавать эффект, который рисует в Paint.NET точку в центре выделенной области.

Для создания собственного эффекта мы используем плагин CodeLab, описанию которого посвящена отдельная тема на этом форуме viewtopic.php?f=13&t=61.

Для начала создадим в Paint.NET новое изображение небольшого размера. Например, 9 на 9 пикселей. Лучше нечетное число, т.к. нам нужен будет центр. И увеличим его масштаб раз в пять, например 1200. Иначе, особенно на большом разрешении монитора можно не увидеть результат действия нашего первого эффекта. Как вы понимаете, создаваемый нами эффект носит скорее учебный характер, чем имеет какое-то практическое применение.

Итак, открываем эффект CodeLab. Изначально окно редактирования скрипта в CodeLab уже содержит текст учебного скрипта по умолчанию.

Немного теории. Принцип действия большинства эффектов и скриптов заключается в том, что они в большинстве своем содержат цикл, в котором эффект «пробегают» (перебирает, проходит) по всем пкселам выделенной в Paint.NET области и совершает какие-то действия с ними.

Авторы эффектов применяют два термина холст источник – это то изображение, которое вы видите на экране до выполнения какого-либо эффекта. И холст назначения – это то, изображение, которое получится после выполнения эффекта. Именно на холсте назначения мы и будем совершать действия над пикселами.

Вышеописанный принцип - получение исходной информации с хослта источника и перенос ее с использованием алгоритмов на холст назначения применяется практически во всех эффектах. Есть сложные эффекты, например, стандартный эффект Paint.NET «набросок тушью», а есть очень простые, типа, «точка в центре», который мы и будем сейчас делать.

Как уже упоминалось выше эффект CodeLab уже содержит текст учебного скрипта по умолчанию. Этот учебный скрипт пробегает все точки выделенной области холста источника и копирует их, без каких либо изменений, на холст назначения. Т.е. по сути ничего не делает. Точнее визуально результата у этого скрипта нет, потому что то, что было равно тому, что стало.

Тем не менее на примере этого скрипта сделаем наш эффект точка в центре. Вот текст учебного скрипта.

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

#region UICode
int Amount1=0;	//[0,100]Slider 1 Description
int Amount2=0;	//[0,100]Slider 2 Description
int Amount3=0;	//[0,100]Slider 3 Description
#endregion

void Render(Surface dst, Surface src, Rectangle rect)
{
    // Delete any of these lines you don't need
    Rectangle selection = this.EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt();
    long CenterX = (long)(((selection.Right - selection.Left) / 2)+selection.Left);
    long CenterY = (long)(((selection.Bottom - selection.Top) / 2)+selection.Top);
    ColorBgra PrimaryColor = (ColorBgra)EnvironmentParameters.PrimaryColor;
    ColorBgra SecondaryColor = (ColorBgra)EnvironmentParameters.SecondaryColor;
    int BrushWidth = (int)EnvironmentParameters.BrushWidth;

    ColorBgra CurrentPixel;
    for (int y = rect.Top; y < rect.Bottom; y++)
    {
        for (int x = rect.Left; x < rect.Right; x++)
        {
            CurrentPixel = src[x,y];
                // TODO: Add pixel processing code here
                // Access RGBA values this way, for example:
                // CurrentPixel.R = (byte)PrimaryColor.R;
                // CurrentPixel.G = (byte)PrimaryColor.G;
                // CurrentPixel.B = (byte)PrimaryColor.B;
                // CurrentPixel.A = (byte)PrimaryColor.A;
                dst[x,y] = CurrentPixel;
        }
    }
}
Первые три строки учебного скрипта описывают пользовательский интерфейс.

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

int Amount1=0;	//[0,100]Slider 1 Description
int Amount2=0;	//[0,100]Slider 2 Description
int Amount3=0;	//[0,100]Slider 3 Description
Нам для создания точки он не нужен, т.к. никакие внешние параметры для создания точки в центре выделенной области не нужны.

Нам не нужен дополнительный цвет и не нужна толщина кисти. Поэтому две строки, приведенные ниже тоже можно удалить.

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

ColorBgra SecondaryColor = (ColorBgra)EnvironmentParameters.SecondaryColor;
int BrushWidth = (int)EnvironmentParameters.BrushWidth;
Для рисования точки в центре выделенной области, нужно вычислить координаты центра. Учебный скрипт уже содержит эти вычисления. Их описывают следующие две строки.

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

long CenterX = (long)(((selection.Right - selection.Left) / 2)+selection.Left);
long CenterY = (long)(((selection.Bottom - selection.Top) / 2)+selection.Top);
Теперь внутри цикла, где мы перебираем пиксели холста назначения с координатам x и y, нам надо добавить условие, выполнение которого будет обозначать, что мы находимся в центре. Например так,

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

if ((y == CenterY) && (x == CenterX))
В случае выполнения этого условия, т.е. для точки, которая находится в центре, нужно выполнить какое-то действие. Мы решили, что покрасим эту точку цветом, который выбран в качестве основного в Paint.NET. Программный код для этого уже существует в учебном скрипте, но он закомментирован. Этот код содержит четыре строки и должен выглядеть так.

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

CurrentPixel.R = (byte)PrimaryColor.R;
CurrentPixel.G = (byte)PrimaryColor.G;
CurrentPixel.B = (byte)PrimaryColor.B;
CurrentPixel.A = (byte)PrimaryColor.A;
В итоге конечный скрипт должен выглядеть так

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

void Render(Surface dst, Surface src, Rectangle rect)
{
    // Delete any of these lines you don't need
    Rectangle selection = this.EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt();
    long CenterX = (long)(((selection.Right - selection.Left) / 2)+selection.Left);
    long CenterY = (long)(((selection.Bottom - selection.Top) / 2)+selection.Top);
    ColorBgra PrimaryColor = (ColorBgra)EnvironmentParameters.PrimaryColor;

    ColorBgra CurrentPixel;
    for(int y = rect.Top; y < rect.Bottom; y++)
    {
        for (int x = rect.Left; x < rect.Right; x++)
        {
            CurrentPixel = src[x,y];
            // TODO: Add pixel processing code here
            if ((y == CenterY) && (x == CenterX))
            {
            // Access RGBA values this way, for example:
                CurrentPixel.R = (byte)PrimaryColor.R;
                CurrentPixel.G = (byte)PrimaryColor.G;
                CurrentPixel.B = (byte)PrimaryColor.B;
                CurrentPixel.A = (byte)PrimaryColor.A;
            }
            dst[x,y] = CurrentPixel;
        }
    }
}
Ну вот ваш первый эффект готов. Можно отодвинуть окно плагина CodeLab в сторону и увидеть результат. Можно даже сделать DLL-файл своего первого эффекта.

Обратите внимание, что функция Render вашего эффекта выполняется Paint.NET несколько раз. Paint.NET разбивает выделенную область изображения на несколько квадратиков, которые обычно называют рабочими областями. Для каждой рабочей области выполняется ваша функция Render. Для чего это сделано? Для оптимизации работы. Особенно это заметно на двух и четырех ядерных процессорах.

Ну и результат в виде рисунка здесь.

Изображение

Аватара пользователя
BorzoyExist
Сообщения: 87
Зарегистрирован: 04 апр 2010, 19:42
Репутация: 0
Откуда: Петербург
Контактная информация:

Re: Урок №1 Как сделать свой первый плагин в Paint.NET

Сообщение BorzoyExist » 02 май 2010, 12:40

Вот этой темы нам, во всяком случае мне ;), не хватало так сильно! Если быть честным, то я весь инет перерыл в поисках подобной темы :good: :good: Но нигде не было или я слепой.
Изображение

Аватара пользователя
xmario
Администратор
Сообщения: 3402
Зарегистрирован: 03 апр 2010, 20:12
Репутация: 45
Пол: Мужской
Откуда: Москва

Re: Урок №1 Как сделать свой первый плагин в Paint.NET

Сообщение xmario » 02 май 2010, 13:09

А ее и нет на русском :) Это наше ноу-хау :Yahoo!:

Аватара пользователя
BorzoyExist
Сообщения: 87
Зарегистрирован: 04 апр 2010, 19:42
Репутация: 0
Откуда: Петербург
Контактная информация:

Re: Урок №1 Как сделать свой первый плагин в Paint.NET

Сообщение BorzoyExist » 02 май 2010, 13:24

:Yahoo!: ТОЧНО!
Изображение

Аватара пользователя
chas
Сообщения: 300
Зарегистрирован: 28 июн 2010, 14:48
Репутация: 0
Откуда: г. Саратов

Re: Урок №1 Как сделать свой первый плагин в Paint.NET

Сообщение chas » 02 июл 2010, 11:40

Это наверно написано на C#?

Аватара пользователя
xmario
Администратор
Сообщения: 3402
Зарегистрирован: 03 апр 2010, 20:12
Репутация: 45
Пол: Мужской
Откуда: Москва

Re: Урок №1 Как сделать свой первый плагин в Paint.NET

Сообщение xmario » 02 июл 2010, 13:01

Совершенно верно! В качестве языка программирования используется C# [си шарп].

Аватара пользователя
chas
Сообщения: 300
Зарегистрирован: 28 июн 2010, 14:48
Репутация: 0
Откуда: г. Саратов

Re: Урок №1 Как сделать свой первый плагин в Paint.NET

Сообщение chas » 02 июл 2010, 14:47

Жаль шо я тока в VB6 и VBA силён, а то ба плагины фигачил, но их и так создано предостаточно....
Дело не в плагинах, а в применении того что имеется.
Вон яблоко, лишь встроенными средствами можно нарисовать, так же, как и многое, естественно другое.
Но эффекты - облегчают нам жизнь.... :D ;) :D

Чёрная Звезда
Сообщения: 101
Зарегистрирован: 16 мар 2012, 09:06
Репутация: 0
Пол: Женский

Re: Урок №1 Как сделать свой первый плагин в Paint.NET

Сообщение Чёрная Звезда » 11 апр 2013, 13:47

Не знаю, что я там напутала. но у меня вот что получилось:
Изображение
А это код:

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

void Render(Surface dst, Surface src, Rectangle rect)
{
    // Delete any of these lines you don't need
    Rectangle selection = EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt();
    int CenterX = ((selection.Right - selection.Left) / 2)+selection.Left;
    int CenterY = ((selection.Bottom - selection.Top) / 2)+selection.Top;
    ColorBgra PrimaryColor = (ColorBgra)EnvironmentParameters.PrimaryColor;
    ColorBgra SecondaryColor = (ColorBgra)EnvironmentParameters.SecondaryColor;
    int BrushWidth = (int)EnvironmentParameters.BrushWidth;

    ColorBgra CurrentPixel;
    for (int y = rect.Top; y < rect.Bottom; y++)
    {
        for (int x = rect.Left; x < rect.Right; x++)
        {
            CurrentPixel = src[x,y];
            // TODO: Add pixel processing code here
            if ((y == CenterY) && (x == CenterX))
            (
            // Access RGBA values this way, for example:
               CurrentPixel.R = (byte)PrimaryColor.R;
               CurrentPixel.G = (byte)PrimaryColor.G;
               CurrentPixel.B = (byte)PrimaryColor.B;
               CurrentPixel.A = (byte)PrimaryColor.A;
            dst[x,y] = CurrentPixel;
        }
    }
}

Аватара пользователя
xmario
Администратор
Сообщения: 3402
Зарегистрирован: 03 апр 2010, 20:12
Репутация: 45
Пол: Мужской
Откуда: Москва

Re: Урок №1 Как сделать свой первый плагин в Paint.NET

Сообщение xmario » 11 апр 2013, 15:08

Ничего не напутали - отличный плагин.

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

if ((y == CenterY) && (x == CenterX)) ... 
Рисует точку по центру.

Чёрная Звезда
Сообщения: 101
Зарегистрирован: 16 мар 2012, 09:06
Репутация: 0
Пол: Женский

Re: Урок №1 Как сделать свой первый плагин в Paint.NET

Сообщение Чёрная Звезда » 11 апр 2013, 16:08

Просто красный фон...

Ответить

Вернуться в «Как сделать свой эффект (плагин) для Paint.NET»

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

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