Страница 1 из 1

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

Добавлено: 30 апр 2010, 12:49
xmario
Предлагаю вашему вниманию плагин «Основные размытия».

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


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

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

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

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

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

Изображение

Изображение

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

размытие = blur
заострение = sharpen
выделение краев = edge detection
рельефность = emboss
диагональное разбиение = diagonal shatter
горизонтальное размытие = horizontal motion blur

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

Добавлено: 02 май 2010, 16:56
BorzoyExist
Жалко но при смене типа размытия у меня он выдаёт ошибку :(

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

Добавлено: 02 май 2010, 23:01
xmario
Текст ошибки огласите?

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

Добавлено: 02 май 2010, 23:25
BorzoyExist
Это правда от основных цветовых эффектов, но у меня полюбому все ломаются :(

Файл: 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)

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

Добавлено: 02 май 2010, 23:29
xmario
Я так и думал. Проблемы в версии 3.3. Ответ здесь.

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

Добавлено: 02 май 2010, 23:33
BorzoyExist
Да говорю же не устанавливается!! :O:

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

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

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

Добавлено: 02 май 2010, 23:46
BorzoyExist
:D

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

Добавлено: 15 мар 2011, 21:09
xmario
Исходный код плагина Основные размытия 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;
        }
    }
}