Готовый плагин не так интересен, как его внутренняя реализация. Впрочем, Вы бы могли представить результат его работы на примере изображения из рабочего задания: картинка до, картинка после.
Я предложил готовый плагин лишь потому, что в теме участвовали люди, которые программируют на С/С++ и др. языках в полноценном смысле. одним словом-знающие.
А модуль CodeLab, собственно на чем и была реализована задача, никто даже не упомянул.
Тем не менее я готов поделиться, может кому пригодится...
// Name: Edge 4.0
// Submenu: Advanced
// Author: PapooAss
// Title: Edge 4.0
// Version: 4.0
// Desc:
// Keywords:
// URL:
// Help:
#region UICode
IntSliderControl Amount1 = 0; // [-100,100] Голубой-Красный
IntSliderControl Amount2 = 0; // [-100,100] Пурпурный-Зеленый
IntSliderControl Amount3 = 0; // [-100,100] Желтый-Синий
#endregion
private byte Clamp2Byte(int iValue) //процедура , которая возвращает "0" если получается отрицательное значение переменной и "255" если больше 255
{
if (iValue<0) return 0;
if (iValue>255) return 255;
return (byte)iValue;
}//взята из Урока
void Render(Surface dst, Surface src, Rectangle rect)
{
ColorBgra CurrentPixel;
ColorBgra VerifyPixel;
int R,G,B;
int Rv, Gv, Bv;
for (int y = rect.Top; y < rect.Bottom; y++)
{
if (IsCancelRequested) return;
for (int x = rect.Left; x < (rect.Right - 1); x++) //стандартный перебор -1 по координатам Х
{
CurrentPixel = src[x,y]; //присвоили переменной CurrentPixel текущий пиксель [x,y]
VerifyPixel = src[(x+1),y]; //присвоили переменной VerifyPixel текущий пиксель [x+1,y]
if (CurrentPixel.Bgra != VerifyPixel.Bgra) //сравниваем эти переменные. (!=)-означает НЕ равно
{
// сдвиг гаммы цвета основного пикселя
R = (int)CurrentPixel.R;
G = (int)CurrentPixel.G;
B = (int)CurrentPixel.B;
R = R + Amount1;
G = G -(Amount1 / 2);
B = B -(Amount1 / 2);
G = G + Amount2;
R = R - (Amount2 / 2);
B = B - (Amount2 / 2);
B = B + Amount3;
R = R - (Amount3 / 2);
G = G - (Amount3 / 2);
// сдвиг гаммы цвета вспомогательного пикселя
Rv = (int)VerifyPixel.R;
Gv = (int)VerifyPixel.G;
Bv = (int)VerifyPixel.B;
Rv = Rv + Amount1;
Gv = Gv -(Amount1 / 2);
Bv = Bv -(Amount1 / 2);
Gv = Gv + Amount2;
Rv = Rv - (Amount2 / 2);
Bv = Bv - (Amount2 / 2);
Bv = Bv + Amount3;
Rv = Rv - (Amount3 / 2);
Gv = Gv - (Amount3 / 2);
// Собираем цвет заново по каналам R, G, and B с привлечением процедуры Clamp2Byte
CurrentPixel = ColorBgra.FromBgra(Clamp2Byte(B),Clamp2Byte(G),Clamp2Byte(R),CurrentPixel.A);
VerifyPixel = ColorBgra.FromBgra(Clamp2Byte(Bv),Clamp2Byte(Gv),Clamp2Byte(Rv),CurrentPixel.A);
dst[x,y] = CurrentPixel; //Записали собранный пиксель по координатам [x,y]
dst[(x+1),y] = VerifyPixel; //записали собранный пиксель по координатам [x+1,y]
}
}
}
}
Картинка ДО
Картинка ПОСЛЕ