![]() |
![]() ![]() ![]() | |
|
Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|| Форумы Здесь вы можете задать свой вопрос и наверняка получите ответ |
ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
| ||
![]() | ||
|
Чтобы не потерять эту дискуссию, сделайте закладку
« предыдущая ветвь | форум | следующая ветвь »
Изменение яркости цвета/битмапа [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]
> Если всё работает, как задумывалось, то формула записана
> правильно.
Склоняюсь к этой же мысли.
Тестирую уже несколько часов. Пока все устраивает.
Просто полагал, что кто-нибудь из местных (если таковые еще остались) подметит чего-нибудь, что можно поправить.
Разрешается использование тегов форматирования текста:
версия для печати
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)
|
![]() ![]() ![]() |