![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Конвертирование цветов
Evgeniy_K © (2004-07-28 17:11:00)Как оптимальней конвертировать RGB в любой: 8, 32 бит.
Evgeniy_K (2004-07-29 17:19:00) [1]Близко ведь был, что-то подобное в голове вертелось. Оч. благодарен.
Все гениальное - просто (с)
Darthman (2004-07-29 14:03:00) [2]function ColorBit32(Color: DWORD; BitCount: Integer; Intensity: Real): DWORD;
var
r, g, b: byte;
begin
//
if Intensity > 1 then Intensity:= 1;
r:= round(GetRValue(Color) * Intensity);
g:= round(GetGValue(Color) * Intensity);
b:= round(GetBValue(Color) * Intensity);
Result:= $FF000000 or b or (g shl 8) or (r shl 16);
end;
Ricks (2004-07-29 14:01:00) [3]32 битный цвет состоит из того-же RGB и Alpha канала.
То есть : $AARRGGBB
Evgeniy_K (2004-07-29 12:30:00) [4]поподробней, плз. Можно алгоритмически?
Drinkins (2004-07-29 09:48:00) [5]первый бит хранит номер палитры. остальные номер цвета в этой палитре.. кажется так... Или я ошибаюсь...
Evgeniy_K (2004-07-28 19:17:00) [6]Понятно, а как быть с 32 бит?
Zer0 (2004-07-28 19:11:00) [7]в формате 8-бит используются индексы вместо rgb компонент.
для преобразования придется подбирать наиболее подходящую палитру, и хитрить с комбинациями цветов для плавных переходов.
эта задача оч ресурсоемкая и не рассчитана на рилтайм-работу.
OSokin (2004-07-28 18:59:00) [8]Сделай не byte, а word (byte - 8 бит, word - 16) и умножь на два r, g и b. Имхо сработает.
Evgeniy_K (2004-07-28 18:53:00) [9]Нужно как-то взять старый цвет RGB и приписат к нему нужный альфа-канал. Как это сделать? И Как быть с 8 бит?
Evgeniy_K (2004-07-28 18:52:00) [10]не работает [3], по всякому пробовал
Evgeniy_K (2004-07-28 18:47:00) [11]что конкретно умножить? Подробней, плз, у себя проверь
OSokin (2004-07-28 18:40:00) [12]Дык умножь на два
Evgeniy_K (2004-07-28 18:32:00) [13]Ну вот пример, а точнее что я хочу:
function ColorBit(Color: DWORD; BitCount: Integer; Intensity: Real): DWORD;
var
r, g, b: byte;
begin
//
if Intensity > 1 then Intensity:= 1;
r:= round(GetRValue(Color) * Intensity);
g:= round(GetGValue(Color) * Intensity);
b:= round(GetBValue(Color) * Intensity);
Result:= b or (g shl 5) or (r shl 11);
end;
Мне надо, чтобы функция работала не только для 16 битного режима. Т.е. функция возвращает цвет. Если он был 16 битным красным, то и 32-битным надо, чтобы был красным.
OSokin (2004-07-28 18:15:00) [14]Не понял немного вопроса.