Основные цветовые эффекты - RGB эффекты.

Эта ветка форума посвящена вопросу, как самому сделать свой плагин (эффект) для Paint.NET. Для публикации своих эффектов используйте основной форум "Эффекты и плагины к Paint.NET"
Ответить
Аватара пользователя
xmario
Администратор
Сообщения: 3402
Зарегистрирован: 03 апр 2010, 20:12
Репутация: 45
Пол: Мужской
Откуда: Москва

Основные цветовые эффекты - RGB эффекты.

Сообщение xmario » 29 апр 2010, 15:55

Как сделать основные RGB эффекты - основные цветовые эффекты.

На предыдущих уроках мы научились писать простые и более сложные эффекты для Paint.NET.

Скачать готовый эффект из этого урока, а так же посмотреть что делает этот эффект вы можете здесь.

Если вы попали на этот урок случайно, но он вас заинтересовал и вы хотите сделать подобный эффект, но не знаете как, то рекомендуем сначала прочитать на этом форуме, как пользоваться Codelab от BoltBait. А потом пройти два базовых урока как делать эффекты для Paint.NET, а именно Урок №1 и Урок №2.

На этом уроке мы разберем, что такое цвета в Paint.NET и как ими можно управлять.

Что такое RGB?

RGB – это аббревиатура из английских слов Red, Green, Blue — красный, зелёный, синий.
RGB – это аддитивная цветовая модель, описывающая способ образования цвета. Слово «аддитивная» означает, что различные цвета получаются путём добавления их (англ. addition) к черному. Т.е. цвет в модели RGB описывается тремя значениями Red, Green, Blue — красный, зелёный, синий. Т.е. для того что бы определить цвет нужно знать три числа – три цветовых канала – R, G и B, каждый из которых может изменяться от 0 до 255. Поскольку все цвета получаются добавлением к черному цвету, то вполне логично, что черный цвет имеет значения трех этих параметров R=0, G=0 и B=0. Очевидно, что противоположный ему цвет – белый, имеет максимальные значения всех трех каналов R=255, G=255 и B=255. Остальные цвета имеют какие-то промежуточные значения.

Как несложно догадаться, что если мы отключим два канала, например G и B, а оставим только R, то получим цвет R=255, G=0 и B=0 – это ярко-красный цвет. Поэкспериментировать с цветами вы можете сами в палитре Paint.NET. В верхнем правом углу можно задать значения RGB прямо с клавиатуры. Не забудьте только переключить окно палитры в расширенный режим.

Изображение

Итак, мы знаем, что такое RGB, и умеем делать простые эффекты – это все что нам нужно.

Придумаем некоторую дополнительную переменную, в которая будет означать какое-нибудь придуманное нами число. Поскольку это наша переменная, то как мы захотим так её и назовем, например, V. Представьте себе, например, что V=30. На это значение мы будем увеличивать или уменьшать значения наших цветов RGB.

Итак, если мы знаем, что (0,0,0) – это черный цвет, а (255,255,255) – белый, то чем ближе значения RGB к 0, тем цвет будет темнее. И, наоборот, чем ближе значения RGB к 255 (255 – это максимум), тем цвет светлее.

Логически получаются формулы:

Осветление

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

R= R + V; G=G + V; B=B + V;
Затемнение

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

R= R - V; G=G - V; B=B - V;
Изменение яркости

Если вместо добавления константы, мы будем умножать на это значение, то получим эффект изменения яркости. Только обратите внимание? Что максимальное значение RGB 255, а минимальное 0, поэтому придуманное нами число V = 30 подойдет для очень небольшого количества темных цветов, большинство же из них, скорее всего, станет белым.

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

R= R*V; G=G*V; B=B*V;
Инвертировать цвета

Как инвертировать цвета RGB? Для этого надо просто вычесть текущее значение из максимального, которое равно 255.

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

R=255-R; G=255-G; B=255-B;
Оттенки серого цвета

Черно-белые цвета и серые тона – это те цвета, у которых R = G = B. Значит, нам надо уравнять значения всех трех каналов. Какое поставить значение? Самый очевидный ответ среднеарифметическое значение.

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

R=(R+G+B)/3; G=R; B=R;
Огрубление

Огрубление, это когда в изображении используется не огромное количество цветов, а меньшее их количество. В нашем случае мы можем ограничить количество цветов нашим параметром V=30. Используем для этого остаток от деления.

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

R= R%V; G=G%V; B=B%V;
Установка порога

Порог – это когда цвета меньше какого-то уровня становятся черными, а выше какого-то уровня – белыми. Используем для верхнего и нижнего порога наш любимый параметр V. В этом случае мы не обойдемся одной формулой, а придется написать условия.

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

                if (R<V) {R=0;} 
                if (R>(255-V)) {R=255;} 
                if (G<V) {G=0;} 
                if (G>(255-V)) {G=255;} 
                if (B<V) {B=0;} 
                if (B>(255-V)) {B=255;} 
Ну вот и все. Осталось вставить эти формулы в эффект. Для ленивых привожу текст кода эффекта ниже. Как уже говорилось выше, для совсем ленивых, скачать готовый эффект из этого урока, а так же посмотреть что делает этот эффект можно здесь. Если что-то все-таки не понятно, можно же задать вопрос в этом форуме ;)

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

#region UICode
byte Amount1 = 0; // Тип эффекта|Осветление|Затемнение|Изменение яркости|Инвертировать цвета|Оттенки серого|Огрубление|Установка порога
int Amount2 = 0; // [0,255] Шкала настройки
#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();
    long CenterX = (long)(((selection.Right - selection.Left) / 2)+selection.Left);
    long CenterY = (long)(((selection.Bottom - selection.Top) / 2)+selection.Top);
    ColorBgra PrimaryColor = (ColorBgra)EnvironmentParameters.PrimaryColor;
    ColorBgra SecondaryColor = (ColorBgra)EnvironmentParameters.SecondaryColor;
    int BrushWidth = (int)EnvironmentParameters.BrushWidth;

    ColorBgra CurrentPixel;
    for (int y = rect.Top; y < rect.Bottom; y++)
    {
        for (int x = rect.Left; x < rect.Right; x++)
        {
            CurrentPixel = src[x,y];
            int R = CurrentPixel.R;
            int G = CurrentPixel.G;
            int B = CurrentPixel.B;
            int V = Amount2;
            
            if (Amount1 == 0)
            {
                R= R + V; G=G + V; B=И + V;
            }
            if (Amount1 == 1)
            {
                R= R - V; G=G - V; B=B - V;
            }
            if (Amount1 == 2)
            {
                R= R*V; G=G*V; B=B*V;
            }
            if (Amount1 == 3)
            {
                R=255-R; G=255-G; B=255-B;
            }
            if (Amount1 == 4)
            {
                R=(R+G+B)/3; G=R; B=R;
            }
            if (Amount1 == 5)
            {
                R= R%V; G=G%V; B=B%V;
            }
            if (Amount1 == 6)
            {
                if (R<V) {R=0;} 
                if (R>(255-V)) {R=255;} 
                if (G<V) {G=0;} 
                if (G>(255-V)) {G=255;} 
                if (B<V) {B=0;} 
                if (B>(255-V)) {B=255;} 

             }
            
            // TODO: Add pixel processing code here
            // Access RGBA values this way, for example:
             CurrentPixel.R = Int32Util.ClampToByte(R);
             CurrentPixel.G = Int32Util.ClampToByte(G);
             CurrentPixel.B = Int32Util.ClampToByte(B);

            dst[x,y] = CurrentPixel;
        }
    }
}


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

Re: Основные цветовые эффекты - RGB эффекты.

Сообщение ReMake » 23 мар 2015, 21:44

Для тех, кто будет повторять этот эффект в CodeLab.
Если Amount1 = 5 и Amount2 = 0, то при попытке увеличения Amount2 вы 'вылетите' из эффекта и получите сообщение об ошибке. Причина - попытка деления на ноль. Чтобы предотвратить эту ситуацию, необходимо перед строкой

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

                R= R%V; G=G%V; B=B%V;
добавить строку

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

                if (Amount2 == 0) {V = 1;}
Это позволит избежать деления на ноль.

Как вариант - замените строку

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

            if (Amount1 == 5)
на

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

            if (Amount1 == 5 && Amount2 != 0)
что также позволит избежать деления на ноль.
Последний раз редактировалось ReMake 21 апр 2017, 19:50, всего редактировалось 1 раз.
Причина: Добавлен вариант

Ответить

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

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

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