И снов нестандартная задача...

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

И снов нестандартная задача...

Сообщение PapooAss » 06 мар 2019, 23:45

Всем доброго времени суток.
снова вернулся к вам ))
Дано: картинка, у которой есть в некоторых местах последовательность из пикселей одного цвета.
Надо: выделить другим цветом идущие последовательно пиксели, более или равное заданному значению.

Привожу код, как я это вижу, но у меня выскакивает постоянно одна ошибка, что то ему там по координатам не нравится.

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

// Name: Repeater 1.0
// Submenu: Advanced
// Author: PapooAss
// Title: Repeater 1.0
// Version: 1.0
// Desc: 
// Keywords: 
// URL: 
// Help:
#region UICode
int Amount1 = 0; // [-100,100] Голубой-Красный
int Amount2 = 100; // [-100,100] Пурпурный-Зеленый
int Amount3 = 0; // [-100,100] Желтый-Синий 
int Amount4 = 20; // [2,20] Пикселей подряд
#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 PrimaryColor = (ColorBgra)EnvironmentParameters.PrimaryColor;
    ColorBgra CurrentPixel;
    ColorBgra VerifyPixel;
    //ColorBgra FirstPixel;
    //ColorBgra LastPixel;
    int R,G,B;
    int Rv, Gv, Bv;
    //int Rf, Gf, Bf;
    //int Rl, Gl, Bl;
    int Xtec;
    int Xmax;
    int M;
    M=0;
    Xmax = rect.Right;
    
    for (int y = rect.Top; y < rect.Bottom; y++) 
    {
        // if (IsCancelRequested) return;
        for (int x = rect.Left; x < Xmax; x++) //стандартный перебор -1 по координатам Х
        {
            Label asd;
            asd:
            M = M + 1;
            if ((x+M)> rect.Right)
                Xtec = x+M-rect.Right;
            else Xtec = x+M;
          
            CurrentPixel = src[x,y]; //присвоили переменной CurrentPixel текущий пиксель [x,y]
            VerifyPixel = src[Xtec,y]; //присвоили переменной VerifyPixel текущий пиксель [x+1,y]
           if (PrimaryColor.Bgra == CurrentPixel.Bgra) 
            {
             if (CurrentPixel.Bgra == VerifyPixel.Bgra) //сравниваем эти переменные. (!=)-означает НЕ равно 
                {
                 goto asd;
                }
            }
            
            if ((M-1)>=Amount4)
            {
                for (int j=0; j<M; j++)
                {
                     if ((x + j) > rect.Right)
                        Xtec = x+j-rect.Right;
                     else Xtec = x+j;
#if DEBUG
Console.WriteLine({Xtec});
Console.ReadKey();
#endif
                       //// сдвиг гаммы цвета основного пикселя 
                       //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);
             //Debug.WriteLine (int Xtec);
                       
                       VerifyPixel = src[Xtec,y]; //присвоили переменной VerifyPixel текущий пиксель [x+1,y]
                       // сдвиг гаммы цвета вспомогательного пикселя
                       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[Xtec,y] = VerifyPixel; //записали собранный пиксель по координатам [x+1,y]                   
                }
            }
         
         M = 0;
         }
    }
}


           
Логика в моем алгоритме следующая:
Изображение

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

В общем, буду рад любой помощи.))

Аватара пользователя
xmario
Администратор
Сообщения: 3386
Зарегистрирован: 03 апр 2010, 20:12
Репутация: 33
Пол: Мужской
Откуда: Москва

Re: И снов нестандартная задача...

Сообщение xmario » 07 мар 2019, 09:27

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

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

Re: И снов нестандартная задача...

Сообщение PapooAss » 07 мар 2019, 11:40

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

Ответить

Вернуться в «Как сделать свой эффект (плагин) для Paint.NET»

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

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