Подскажите новичку

В этом разделе обсуждаются и публикуются эффекты и плагины для Paint.NET. При публикации плагинов других разработчиков обязательно указывайте источник или сайт автора.
Ответить
PapooAss
Сообщения: 5
Зарегистрирован: 31 янв 2017, 13:52
Репутация: 0
Пол: Мужской

Подскажите новичку

Сообщение PapooAss » 31 янв 2017, 14:57

Всем доброго времени суток.
Обрисую вкратце свою ситуацию.

На работе по роду деятельности работаю с программой 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 пикселей и поставить кое-где черные точки-плагин не работает.
Не могу понять почему.
Надеюсь на вашу помощь.

ReMake
Сообщения: 344
Зарегистрирован: 10 сен 2014, 01:25
Репутация: 108
Пол: Мужской
Откуда: Брест, Беларусь

Re: Подскажите новичку

Сообщение ReMake » 31 янв 2017, 21:55

В Справочнике CodeLab посмотрите часть 4 - некоторые детали. Возможно это окажется полезным для вас. Справочник в формате .chm.

PapooAss
Сообщения: 5
Зарегистрирован: 31 янв 2017, 13:52
Репутация: 0
Пол: Мужской

Re: Подскажите новичку

Сообщение PapooAss » 02 фев 2017, 16:50

Справочник я уже прочел на английском. но некоторые моменты все же стали понятнее при прочтении на английском.
Задачу решил самостоятельно методом проб и ошибок.
Если кому интересно-могу выложить готовый плагин. :)

ReMake
Сообщения: 344
Зарегистрирован: 10 сен 2014, 01:25
Репутация: 108
Пол: Мужской
Откуда: Брест, Беларусь

Re: Подскажите новичку

Сообщение ReMake » 02 фев 2017, 19:44

Было бы интересно узнать, как вы решили эту проблему. Ждем код плагина.
PapooAss писал(а):Справочник я уже прочел на английском. но некоторые моменты все же стали понятнее при прочтении на английском.
Вы заметили неточности перевода на русский язык, возможно у вас есть предложения по улучшению русской версии справочника?

PapooAss
Сообщения: 5
Зарегистрирован: 31 янв 2017, 13:52
Репутация: 0
Пол: Мужской

Re: Подскажите новичку

Сообщение PapooAss » 02 фев 2017, 22:48

ReMake писал(а):Было бы интересно узнать, как вы решили эту проблему. Ждем код плагина.
PapooAss писал(а):Справочник я уже прочел на английском. но некоторые моменты все же стали понятнее при прочтении на английском.

на русском, конечно же на русском. ))))

Вот код плагина, может кому пригодится. (хотя я сомневаюсь. Уж очень специфична задачка)

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

// 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]
           }
         }
    }
}

ReMake
Сообщения: 344
Зарегистрирован: 10 сен 2014, 01:25
Репутация: 108
Пол: Мужской
Откуда: Брест, Беларусь

Re: Подскажите новичку

Сообщение ReMake » 02 фев 2017, 23:26

Спасибо.

Ответить

Вернуться в «Эффекты и плагины (plugins) к Paint.NET»

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей