Обрисую вкратце свою ситуацию.
На работе по роду деятельности работаю с программой Paint.Net.
Возникла необходимость особенной обработки изображения.
А именно: необходимо перебрать каждый пискель сверху вниз слева направо (ну это легко)
и в местах где один цвет меняется на другой-с обоих сторон заменить на 2 других цвета.
Алгоритм мне видится таким:
Вот пример картинки.
Допустим программно мы определили каждому (основному) цвету на картинке - свой добавочный и это будет так:
Серый = зелёный
Красный = бордовый
Син ий = фиолетовый
Начинаем проход сверху вниз :
Серый? - Да! - запомнили
Сер?- да!- дальше ( повторяем)
Сер?- нет! Красный, заносим в эту ячейку добавочный цвет- бордовый, и в предыдущую ячейку заносим доп.цвет- зелёный.
Идём дальше:
Следующая ячейка Серая ( опять поменялось)- значит туда зеленую, заносим в предыдущую (какая там была? Красная? Ок!) бордо туда!
Следующая опять серая? - начинай с начала цикла.
PS:
Теперь к делу.
В программировании на С# я не силен, (поэтому собственно и обращаюсь).
Написал вот такой код: (пробный). Без привязки к конкретным цветам. Просто, чтобы понять как работает SRC и DST. В этом плагине если есть граница-переход-то он на следующий пиксель ставит лаймовый цвет.
Код: Выделить всё
// Name: ТЕСТ 3.2
// Submenu: Artistic
// Author:
// Title: ТЕСТ 3.2
// Version:
// Desc:
// Keywords:
// URL:
// Help:
#region UICode
ColorWheelControl Amount4 = ColorBgra.FromBgr(0,0,0); // Main COlor
#endregion
private byte Clamp2Byte(int iValue)
{
if (iValue<0) return 0;
if (iValue>255) return 255;
return (byte)iValue;
}
void Render(Surface dst, Surface src, Rectangle rect)
{
// Удалите любую из этих строк, в которых вы не нуждаетесь
//Rectangle selection = EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt();
ColorBgra PrimaryColor = (ColorBgra)EnvironmentParameters.PrimaryColor;
ColorBgra CurrentPixel;
ColorBgra VerifyPixel;
int R,G,B;
for (int x = rect.Left; x < rect.Right; x++)
{
if (IsCancelRequested) return;
for (int y = rect.Top; y < (rect.Bottom - 1); y++)
{
CurrentPixel = src[x,y];
VerifyPixel = src[x,y+1];
if (CurrentPixel.Bgra != VerifyPixel.Bgra)
{
//dst[x,y] = CurrentPixel;
dst[x,y+1] = ColorBgra.LimeGreen;
}
// ВЫПОЛНЕНИЕ: Добавьте здесь код обработки пикселей
}
}
}
но стоит нарисовать маленькую картинку например 10х10 пикселей и поставить кое-где черные точки-плагин не работает.
Не могу понять почему.
Надеюсь на вашу помощь.