Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Изменение яркости цвета/битмапа [D7, WinXP]


Игорян   (07.09.23 12:24


Всем привет!


Написал метод, который выполняет изменение яркости цветовых каналов битмапа.
Собственно, вроде все работает как и было задумано (как минимум, визуально ;))

Но меня интересует следующее: правильно ли сформулирована формула расчета яркости цветового канала?
Эту формулу я подбирал методом проб и ошибок, чтобы иметь возможность указывать значение яркости в диапазоне [0-200],
где 0 - это черный цвет; 100 - исходный цвет; 200 - белый цвет.
Не слишком силен в графических алгоритмах, поэтому пришлось выкручиваться таким образом.

Собственно, сама процедура:

procedure ChangeBmpColor(ABitmap: TBitmap; AValue: Word);
var
 RowInOut: PRGBArray;
 X, Y: Integer;
 R,G,B:Integer;
 A: Single;
begin
 if AValue = 0 then
   Exit;

 A := AValue / 120;

 for Y:=0 to ABitmap.Height - 1 do
   begin
     RowInOut := ABitmap.ScanLine[Y];
     for X:=0 to ABitmap.Width - 1 do
       begin
         R := RowInOut[X].Red;
         G := RowInOut[X].Green;
         B := RowInOut[X].Blue;

         R := Round(((Max(1, A)) * R) + (Min(A, A - 1) * 255));
         G := Round(((Max(1, A)) * G) + (Min(A, A - 1) * 255));
         B := Round(((Max(1, A)) * B) + (Min(A, A - 1) * 255));

         if R < 0 then
           R := 0
         else
         if R > MaxByte then
           R := MaxByte;
         if G < 0 then
           G := 0
         else
         if G > MaxByte then
           G := MaxByte;
         if B < 0 then
           B := 0
         else
         if B > MaxByte then
           B := MaxByte;

         RowInOut[X].Red := R;
         RowInOut[X].Green := G;
         RowInOut[X].Blue := B;
       end;
   end;
end;


зачем   (07.09.23 12:58[1]

познай пространство HSV.
там яркость - одна из координат.
Плюс конвертация в RGB и обратно


Игорян   (07.09.23 15:40[2]


> познай пространство HSV

Это я знаю)) Но дело в том, что параметр "V", отвечающий за яркость, делает цвет "слишком ярким", поскольку
...the HSV representation models how colors appear under light.
А при изменении параметра "S"  - цвет уходит практически в белый, а не в серый, что крайне неприемлемо.
Поэтому для насыщенности также написана "своя" процедура.

Я также пробовал модель HSL, но так и не сообразил, каким образом можно изменять S и L так, чтобы не получалась "каша" на конечном битмапе. Хотя для одиночного цвета все работает прекрасно.
Жаль, нельзя картинку прикрепить, это бы объяснило мои слова.

Вот и пришлось в итоге ваять "велосипед", т.к. он лучше подходит для решения.
Но не совсем уверен в правильности формулы, а посоветоваться не с кем :(


Dimka Maslov ©   (07.09.23 15:40[3]

Если всё работает, как задумывалось, то формула записана правильно. А вообще в предыдущем ответе всё верно сказано.


Игорян   (07.09.23 18:14[4]


> Если всё работает, как задумывалось, то формула записана
> правильно.

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


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо