Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ как структурировать таблицу цветов 16 бит

Автор: maniac 3.03.2003 23:06

я проинициализировал графику через ассемблер в 32, и 16 битах. Но в 16 битах цвета расположены(в смысле номериа) как-то  странно. В 32 битах (режим 115h) при, допустим выводе на экран(в смысле проверки) цветов, а точнее перехода цвета из ,например, синего в красный она(программа) плавно вырисовывает все цвета, А в 16 битах (113h) она рисует переход, НО разбивает при этом область вывода на восьми пиксельные куски в нутри каждго из которых цвет идет от синего до красного(яркость зависит от области). ЧТО ДЕЛАТЬ ведь при выводе BMP в 16 дитах получается полная лажа???

                 PLEASE HELP!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ответ хотелось бы получить на мыло(e-mail для тех кто не знает, хотя вряд ли такие есть)

Автор: Some1 10.03.2003 12:41

Значит, не уверен на все сто, потому что точно не помню, но скажу так:
в 16 битах 16 значимых единиц:
0000:0000  0000:0000

И они должны быть разбиты поровну на три части, чтобы создать три цветовые компоненты - красную, зелёную и синюю.
поделить 16 на три поровну нельзя, зато можно поделить 15 бит.
Получится пять бит. Тоесть на три компоненты уйдёт по пять бит на каждую - 15 бит. И ещё один остаётся.
Так вот насколько я помню зелёный цвет имеет не 5 бит а 6 бит, поскольку человеческий глаз наиболее чувствителен к изменениям в зелёном спектре, и следовательно для него наиболее всего необходимо дополнительное число тоновых градаций.
В общем получаем так:
RRRR:RGGG  GGGB:BBBB
это в битах.
Следовательно красная и синяя компонента цвета может менять свои значения от 0 до 31, а зелёная от 0 до 63.
Комбинируя яркости компонент при помощи побитовых операций можно собрать 16битный цвет.
Вот функции, конвертирующие как туда, так и назад:

Код
function _col(r,g,b:word):word; assembler;
asm
 mov ax,r
 and ax,31
 shl ax,11
 mov bx,g
 and bx,63
 shl bx,5
 add ax,bx
 mov bx,b
 and bx,31
 add ax,bx
 mov [bp-02],ax
end;

procedure col_(col:word;var r,g,b:byte);
var rr,gg,bb:byte;
begin
asm
 mov ax,col
 and ax,31
 mov bb,al
 mov ax,col
 shr ax,5
 and ax,63
 mov gg,al
 mov ax,col
 shr ax,11
 and ax,31
 mov rr,al
end;
 r:=rr;
 g:=gg;
 b:=bb;
end;