Основные размытия

Плагины и эффекты для Paint.NET с интерфейсом на русском языке. Поскольку этот сайт посвящен в первую очередь обсуждению Paint.NET на русском языке, то необходимость создания этого раздела очевидна. Если вы хотите опубликовать свой собственный русскоязычный эффект, то вам сюда.
Ответить
Аватара пользователя
xmario
Администратор
Сообщения: 3384
Зарегистрирован: 03 апр 2010, 20:12
Репутация: 32
Пол: Мужской
Откуда: Москва

Основные размытия

Сообщение xmario » 30 апр 2010, 12:49

Предлагаю вашему вниманию плагин «Основные размытия».

15.03.2011 Выпущена версия 2.2 плагина "Основные размытия (xMario)" Добавлена опция Toon.


Скачать файл с эффектами можно по ссылке внизу этой темы. О том, как устанавливать эффекты для Paint.NET можно прочитать на этом сайте. После установки эффект доступен в меню «Эффекты» - «Размытие».

Этот плагин для Paint.NET объединяет несколько эффектов размытия, точнее все известные мне формулы размытия. Некоторые способы имеют пока условные названия, например «Заострение 1» или «Заострение 2».

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

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

Вот несколько примеров применения эффекта.

Изображение

Изображение

Для тех, кто привык пользоваться английской терминологией:

размытие = blur
заострение = sharpen
выделение краев = edge detection
рельефность = emboss
диагональное разбиение = diagonal shatter
горизонтальное размытие = horizontal motion blur
Вложения
xmario_blurs_2_2.rar
Эффект для Paint.NET "Основные размытия" 2.2
(6.03 КБ) 1627 скачиваний
xmario_blurs.rar
Эффект для Paint.NET "Основные размытия" 2.0 (старая версия)
(5.44 КБ) 1070 скачиваний

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

Re: Основные размытия

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

Жалко но при смене типа размытия у меня он выдаёт ошибку :(
Изображение

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

Re: Основные размытия

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

Текст ошибки огласите?

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

Re: Основные размытия

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

Это правда от основных цветовых эффектов, но у меня полюбому все ломаются :(

Файл: C:\Program Files (x86)\Paint.NET\Effects\xmario_basic_color_effects.dll
Имя: xmario_basic_color_effectsEffect.xmario_basic_color_effectsEffectPlugin
Версия: 1.0.3771.23332
Автор: XMario
Copyright: Copyright © XMario
Вебсайт: http://paint-net.ru/
Полное сообщение об ошибке: PaintDotNet.WorkerThreadException: Worker thread threw an exception ---> System.TypeLoadException: Не удалось загрузить тип "PaintDotNet.Int32Util" из сборки "PaintDotNet.Base, Version=3.36.3158.38062, Culture=neutral, PublicKeyToken=null".
в xmario_basic_color_effectsEffect.xmario_basic_color_effectsEffectPlugin.Render(Surface dst, Surface src, Rectangle rect)
в xmario_basic_color_effectsEffect.xmario_basic_color_effectsEffectPlugin.OnRender(Rectangle[] rois, Int32 startIndex, Int32 length)
в PaintDotNet.Effects.Effect`1.Render(Rectangle[] renderRects, Int32 startIndex, Int32 length)
в PaintDotNet.Effects.Effect`1.Render(EffectConfigToken parameters, RenderArgs dstArgs, RenderArgs srcArgs, Rectangle[] rois, Int32 startIndex, Int32 length)
в PaintDotNet.Effects.BackgroundEffectRenderer.ThreadFunction()
--- Конец трассировки внутреннего стека исключений ---
в PaintDotNet.Effects.BackgroundEffectRenderer.Join()
в PaintDotNet.Effects.BackgroundEffectRenderer.Abort()
в PaintDotNet.Effects.BackgroundEffectRenderer.Start()
в PaintDotNet.Menus.EffectMenuBase.<>c__DisplayClassb.<RunEffect>b__8(Object sender, EventArgs e)
Изображение

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

Re: Основные размытия

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

Я так и думал. Проблемы в версии 3.3. Ответ здесь.

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

Re: Основные размытия

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

Да говорю же не устанавливается!! :O:
Изображение

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

Re: Основные размытия

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

Заводи тему в "обсуждение Paint.NET" давай решать проблему. Использовать старые версии - это не спортивно! :no:

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

Re: Основные размытия

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

:D
Изображение

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

Re: Основные размытия

Сообщение xmario » 15 мар 2011, 21:09

Исходный код плагина Основные размытия xMario версии 2.2

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

// Submenu: Blurs
// Name: Основные размытия (Xmario)
// Author: XMario
// Title: http://paint-net.ru - Основные размытия - 2.2
// URL: http://paint-net.ru/

#region UICode
byte Amount1 = 18; // Тип смягчения|Смягчение smooth|Смягчение soften|Смягчение blur|Размытие Гаусса|Заострение 1|Заострение 2|Заострение 3|Заострение 4|Заострение 5|выделение краев 1|выделение краев 2|выделение краев 3|рельефность 1|рельефность 2|рельефность 3|рельефность 4|Диагональное разбиение|Горизонтальное размытие|Toon
int Amount2 = 2; // [2,50] Радиус
bool Amount3 = false; // [0,1] Только прозрачность
#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();
    ColorBgra CurrentPixel;

    int radius = Amount2;
    int delta = 0;
    int delta_sum = 0;
    int[,] matrix = new int[radius*2+1,radius*2+1];
    
    if (Amount1==0)
    {
//Смягчение smooth    
    matrix[0,0]=0;matrix[0,1]=0;matrix[0,2]=0;matrix[0,3]=0;matrix[0,4]=0;    
    matrix[1,0]=0;matrix[1,1]=1;matrix[1,2]=3;matrix[1,3]=1;matrix[1,4]=0;    
    matrix[2,0]=0;matrix[2,1]=3;matrix[2,2]=9;matrix[2,3]=3;matrix[2,4]=0;    
    matrix[3,0]=0;matrix[3,1]=1;matrix[3,2]=3;matrix[3,3]=1;matrix[3,4]=0;    
    matrix[4,0]=0;matrix[4,1]=0;matrix[4,2]=0;matrix[4,3]=0;matrix[4,4]=0;    
    }
    else if (Amount1==1)
    {
//Смягчение soften    
        for (int i=0; i<=(radius*2); i++)
        for (int j=0; j<=(radius*2); j++)
        {
            matrix[i,j]=1;
        }
    }

    else if (Amount1==2)
    {
//Смягчение blur    
    matrix[0,0]=0;matrix[0,1]=1;matrix[0,2]=2;matrix[0,3]=1;matrix[0,4]=0;    
    matrix[1,0]=1;matrix[1,1]=3;matrix[1,2]=10;matrix[1,3]=3;matrix[1,4]=1;    
    matrix[2,0]=2;matrix[2,1]=10;matrix[2,2]=90;matrix[2,3]=10;matrix[2,4]=2;    
    matrix[3,0]=1;matrix[3,1]=3;matrix[3,2]=10;matrix[3,3]=3;matrix[3,4]=1;    
    matrix[4,0]=0;matrix[4,1]=1;matrix[4,2]=2;matrix[4,3]=1;matrix[4,4]=0;    
    }
    if (Amount1==3)
    {
//Размытие Гаусса    
        for (int i=0; i<=(radius*2); i++)
        for (int j=0; j<=(radius*2); j++)
        {
            int temp = radius - Math.Abs(radius-i) - 2*Math.Abs(radius-j);
            if (temp>0) {matrix[i,j]=temp;} else {matrix[i,j]=0;}
        }
    }
    if (Amount1==4)
    {
//Заострение 1
        for (int i=0; i<=(radius*2); i++)
        for (int j=0; j<=(radius*2); j++)
        {
            matrix[i,j]=0;
        }
        matrix[radius-1,radius-1]=-radius;matrix[radius-1,radius]=-3*radius;matrix[radius-1,radius+1]=-radius;
        matrix[radius,radius-1]=-3*radius;matrix[radius,radius]=-41*radius;matrix[radius,radius+1]=-3*radius;
        matrix[radius+1,radius-1]=-radius;matrix[radius+1,radius]=-3*radius;matrix[radius+1,radius+1]=-radius;
    }
    if (Amount1==5)
    {
//Заострение 2    
        for (int i=0; i<=(radius*2); i++)
        for (int j=0; j<=(radius*2); j++)
        {
            matrix[i,j]=-1;
        }
    }
    
    if (Amount1==6)
    {
//Заострение 3    
    matrix[0,0]=-1;matrix[0,1]=-1;matrix[0,2]=-1;matrix[0,3]=-1;matrix[0,4]=-1;    
    matrix[1,0]=-1;matrix[1,1]=3;matrix[1,2]=4;matrix[1,3]=3;matrix[1,4]=-1;    
    matrix[2,0]=-1;matrix[2,1]=-1;matrix[2,2]=13;matrix[2,3]=4;matrix[2,4]=-1;    
    matrix[3,0]=-1;matrix[3,1]=4;matrix[3,2]=4;matrix[3,3]=3;matrix[3,4]=-1;    
    matrix[4,0]=-1;matrix[4,1]=-1;matrix[4,2]=-1;matrix[4,3]=-1;matrix[4,4]=-1;    
    }
    if (Amount1==7)
    {
//Заострение 4    
        for (int i=0; i<=(radius*2); i++)
        for (int j=0; j<=(radius*2); j++)
        {
            matrix[i,j]=0;
        }

    matrix[radius-1,radius-1]=-radius;matrix[radius-1,radius]=-radius;matrix[radius-1,radius+1]=-radius;
    matrix[radius,radius-1]=-radius;matrix[radius,radius]=radius*8;matrix[radius,radius+1]=-radius;
    matrix[radius+1,radius-1]=-radius;matrix[radius+1,radius]=-radius;matrix[radius+1,radius+1]=-radius;
    delta_sum = 1;    
    }
    if (Amount1==8)
    {
//Заострение 5    
    matrix[0,0]=0;matrix[0,1]=0;matrix[0,2]=0;matrix[0,3]=0;matrix[0,4]=0;    
    matrix[1,0]=0;matrix[1,1]=1;matrix[1,2]=-2;matrix[1,3]=1;matrix[1,4]=0;    
    matrix[2,0]=0;matrix[2,1]=-2;matrix[2,2]=5;matrix[2,3]=-2;matrix[2,4]=0;    
    matrix[3,0]=0;matrix[3,1]=1;matrix[3,2]=-2;matrix[3,3]=1;matrix[3,4]=0;    
    matrix[4,0]=0;matrix[4,1]=0;matrix[4,2]=0;matrix[4,3]=0;matrix[4,4]=0;    
    }
//выделение краев 1    
    if (Amount1==9)
    {
    matrix[0,0]=0;matrix[0,1]=0;matrix[0,2]=0;matrix[0,3]=0;matrix[0,4]=0;    
    matrix[1,0]=0;matrix[1,1]=-1;matrix[1,2]=-1;matrix[1,3]=-1;matrix[1,4]=0;    
    matrix[2,0]=0;matrix[2,1]=-1;matrix[2,2]=9;matrix[2,3]=-1;matrix[2,4]=0;    
    matrix[3,0]=0;matrix[3,1]=-1;matrix[3,2]=-1;matrix[3,3]=-1;matrix[3,4]=0;    
    matrix[4,0]=0;matrix[4,1]=0;matrix[4,2]=0;matrix[4,3]=0;matrix[4,4]=0;    
    //delta_sum = 1;
    }
//выделение краев 2    
    if (Amount1==10)
    {
    matrix[0,0]=0;matrix[0,1]=0;matrix[0,2]=0;matrix[0,3]=0;matrix[0,4]=0;    
    matrix[1,0]=0;matrix[1,1]=-1;matrix[1,2]=-1;matrix[1,3]=-1;matrix[1,4]=0;    
    matrix[2,0]=0;matrix[2,1]=0;matrix[2,2]=0;matrix[2,3]=0;matrix[2,4]=0;    
    matrix[3,0]=0;matrix[3,1]=1;matrix[3,2]=1;matrix[3,3]=1;matrix[3,4]=0;    
    matrix[4,0]=0;matrix[4,1]=0;matrix[4,2]=0;matrix[4,3]=0;matrix[4,4]=0;    
    delta_sum = 1;    
    }    
//выделение краев 3    
    if (Amount1==11)
    {
    matrix[0,0]=0;matrix[0,1]=0;matrix[0,2]=0;matrix[0,3]=0;matrix[0,4]=0;    
    matrix[1,0]=0;matrix[1,1]=-5;matrix[1,2]=0;matrix[1,3]=0;matrix[1,4]=0;    
    matrix[2,0]=0;matrix[2,1]=0;matrix[2,2]=1;matrix[2,3]=0;matrix[2,4]=0;    
    matrix[3,0]=0;matrix[3,1]=0;matrix[3,2]=0;matrix[3,3]=5;matrix[3,4]=0;    
    matrix[4,0]=0;matrix[4,1]=0;matrix[4,2]=0;matrix[4,3]=0;matrix[4,4]=0;    
    //delta_sum = 1;
    }    
//рельефность 1
    if (Amount1==12)
    {
    matrix[0,0]=0;matrix[0,1]=0;matrix[0,2]=0;matrix[0,3]=0;matrix[0,4]=0;    
    matrix[1,0]=0;matrix[1,1]=-2;matrix[1,2]=-1;matrix[1,3]=0;matrix[1,4]=0;    
    matrix[2,0]=0;matrix[2,1]=-1;matrix[2,2]=1;matrix[2,3]=1;matrix[2,4]=0;    
    matrix[3,0]=0;matrix[3,1]=0;matrix[3,2]=1;matrix[3,3]=2;matrix[3,4]=0;    
    matrix[4,0]=0;matrix[4,1]=0;matrix[4,2]=0;matrix[4,3]=0;matrix[4,4]=0;    
    }    
//рельефность 2
    if (Amount1==13)
    {

        for (int i=0; i<=(radius*2); i++)
        for (int j=0; j<=(radius*2); j++)
        {
            int temp = Math.Abs(i+j-radius*2);
            if (temp==0){temp = 1;}
            if ((j==j)&&(i>0)&&(i<radius*2)) {matrix[i,j]=temp;} else {matrix[i,j]=0;}
        }
    }    
//рельефность 3
    if (Amount1==14)
    {
    matrix[0,0]=0;matrix[0,1]=0;matrix[0,2]=0;matrix[0,3]=0;matrix[0,4]=0;    
    matrix[1,0]=0;matrix[1,1]=0;matrix[1,2]=0;matrix[1,3]=0;matrix[1,4]=0;    
    matrix[2,0]=0;matrix[2,1]=0;matrix[2,2]=1;matrix[2,3]=0;matrix[2,4]=0;    
    matrix[3,0]=0;matrix[3,1]=0;matrix[3,2]=0;matrix[3,3]=-1;matrix[3,4]=0;    
    matrix[4,0]=0;matrix[4,1]=0;matrix[4,2]=0;matrix[4,3]=0;matrix[4,4]=0;
    delta_sum = 1;    
    delta = 128;
    }    
//рельефность 4
    if (Amount1==15)
    {
        for (int i=0; i<=(radius*2); i++)
        for (int j=0; j<=(radius*2); j++)
        {
            if ((i==j)) 
            {
                if (i<(radius-1)) {matrix[i,j]=0;}
                else if (i==(radius-1)) {matrix[i,j]=radius;}
                else if (i==(radius*2)) {matrix[i,j]=0;}
                else {matrix[i,j]=-1;}
            }
            else {matrix[i,j]=0;}
        }
    matrix[0,0]=0;matrix[0,1]=0;matrix[0,2]=0;matrix[0,3]=0;matrix[0,4]=0;    
    matrix[1,0]=0;matrix[1,1]=2;matrix[1,2]=0;matrix[1,3]=0;matrix[1,4]=0;    
    matrix[2,0]=0;matrix[2,1]=0;matrix[2,2]=-1;matrix[2,3]=0;matrix[2,4]=0;    
    matrix[3,0]=0;matrix[3,1]=0;matrix[3,2]=0;matrix[3,3]=-1;matrix[3,4]=0;    
    matrix[4,0]=0;matrix[4,1]=0;matrix[4,2]=0;matrix[4,3]=0;matrix[4,4]=0;
    delta_sum = 1;    
    delta = 128;    
    }    
//диагональное разбиение
    if (Amount1==16)
    {
        for (int i=0; i<=(radius*2); i++)
        for (int j=0; j<=(radius*2); j++)
        {
            if ((i==0)&&(j==0)) {matrix[i,j]=1;}
            else if ((i==0)&&(j==radius*2)) {matrix[i,j]=1;}
            else if ((j==0)&&(i==radius*2)) {matrix[i,j]=1;}
            else if ((j==radius*2)&&(i==radius*2)) {matrix[i,j]=1;}
            else {matrix[i,j]=0;}
        }
    }    
//Горизонтальное размытие
    if (Amount1==17)
    {
        for (int i=0; i<=(radius*2); i++)
        for (int j=0; j<=(radius*2); j++)
        {
            if (i==radius)
            {
               matrix[i,j]=radius*2 + (j-radius);
            }
            else {matrix[i,j]=0;}
        }
    }    

//Toon
    if (Amount1==18)
    {
    matrix[0,0]=-1;matrix[0,1]=-1;matrix[0,2]=-1;matrix[0,3]=-1;matrix[0,4]=-1;    
    matrix[1,0]=-1;matrix[1,1]=-1;matrix[1,2]=-1;matrix[1,3]=-1;matrix[1,4]=-1;    
    matrix[2,0]=-1;matrix[2,1]=-1;matrix[2,2]=30;matrix[2,3]=-1;matrix[2,4]=-1;    
    matrix[3,0]=-1;matrix[3,1]=-1;matrix[3,2]=-1;matrix[3,3]=-1;matrix[3,4]=-1;    
    matrix[4,0]=-1;matrix[4,1]=-1;matrix[4,2]=-5;matrix[4,3]=-1;matrix[4,4]=-1;
    delta_sum = 1;    
    }    

    int maxx = selection.Right-1;
    int maxy = selection.Bottom-1;
    int minx = selection.Left;
    int miny = selection.Top;
    
    for (int y = rect.Top; y < rect.Bottom; y++)
    {
        for (int x = rect.Left; x < rect.Right; x++)
        {
            CurrentPixel = src[x,y];
            
            int R=0;
            int G=0;
            int B=0;
            int A=0;
            int Sum=delta_sum;
            //
            for (int i=0; i<=(radius*2); i++)
            {
                for (int j=0; j<=(radius*2); j++)
                {
                   int curx = x-radius+i;
                   int cury = y-radius+j;
                   if (curx<minx) {curx=minx;}
                   if (curx>maxx) {curx=maxx;}
                   if (cury<miny) {cury=miny;}
                   if (cury>maxy) {cury=maxy;}
                   { 
                       R+=matrix[i,j]*src[curx,cury].R;
                       G+=matrix[i,j]*src[curx,cury].G;
                       B+=matrix[i,j]*src[curx,cury].B;
                       A+=matrix[i,j]*src[curx,cury].A;
                       Sum+=matrix[i,j];
                   } 
                }
            }
            if (Amount1 == 18) {Sum = 1;}
            if (Sum>0)
            {
                if (Amount3 == false)
                {
                    CurrentPixel.R = Int32Util.ClampToByte(R/Sum+delta);
                    CurrentPixel.G = Int32Util.ClampToByte(G/Sum+delta);
                    CurrentPixel.B = Int32Util.ClampToByte(B/Sum+delta);
                }
                if (Sum==(radius*2+1)*(radius*2+1))
                {            
                CurrentPixel.A = Int32Util.ClampToByte(A/Sum+delta);
                }
            }
            dst[x,y] = CurrentPixel;
        }
    }
}

Ответить

Вернуться в «Эффекты и плагины для Paint.NET на русском языке»

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

Сейчас этот форум просматривают: Bing [Bot] и 1 гость