Код: Выделить всё
// Submenu: Blurs
// Name: Основные размытия (Xmario)
// Author: XMario
// Title: http://paint-net.ru - Основные размытия - 2.2
// URL: https://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;
}
}
}