Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Работа с цветом. Ранее использовались функции setcolor()/getcolor() для установки/выяснения текущего цвета рисования




 

Ранее использовались функции setcolor() / getcolor() для установки/выяснения текущего цвета рисования. Рассмотрим работу с цветом более подробно.


Известно, что любой цвет является композицией трех основных цветов: Red (красный), Green (зеленый), Blue (синий). Дополнительные цвета – смесь основных:

 

При различной аппаратной настройке монитора magenta, например, может быть пурпурным, сиреневым, малиновым, вишневым; голубой - бирюзовым.

В зависимости от интенсивности (яркости) каждого из основных цветов в смеси получаем различные оттенки. Следовательно, 4-битовая комбинация позволяет закодировать 15 базовых цветов. Кодирование стандартно: I – интенсивность, RGB – цвета.

 

I R G B Название Компоненты I R G B Название Компоненты
  0 0 0 0 Черный Нет   0 0 0 1 Синий Синий
  0 0 1 0 Зеленый Зеленый   0 0 1 1 Голубой Зеленый + Синий
  0 1 0 0 Красный Красный   0 1 0 1 Фиолетовый Красный + Синий
  0 1 1 0 Коричневый Красный + Зеленый   0 1 1 1 Белый Красный + Зеленый + Синий
  1 0 0 0 Серый     1 0 0 1 Ярко- синий  
  1 0 1 0 Ярко- зеленый     1 0 1 1 Ярко- голубой  
  1 1 0 0 Ярко- красный     1 1 0 1 Ярко- фиолетовый  
  1 1 1 0 Желтый     1 1 1 1 Ярко- белый  

 

В языках программирования обычно можно указывать как номер цвета, так и его буквенное обозначение по первым буквам. В языке С(С++) в соответствующем заголовочном файле задается сопоставление букв и чисел по вышеприведенной таблице.

Т.к. емкость видеопамяти ограничена, в ряде случаев возникает конфликт между цветностью и разрешающей способностью. Этим объясняется возможность цветных видеоадаптеров работать в разных режимах (модах), позволяющих увеличивать разрешающую способность (количество точек) за счет уменьшения количества цветов и наоборот. (См. параметр graphmode функции initgraph()). Например, в простейшем случае для адаптера CGA возможны 2 варианта представления изображений: 2 бита на каждый пиксел (4 цвета, 320*200 точек) и 1 бит на каждый пиксел (2 цвета, 640*200 точек).

 

 

           
   
 
   

 


белый светло- темно- черный белый и черный

серый серый

цвета условны

 

Для VGA можно получить 640*350 точек при воспроизведении 16 цветов из палитры 4096 оттенков (о палитре – далее) или 320*200 точек при воспроизведении одновременно 256 цветов. Если видеопамять VGA - 256 К, можно уменьшить число страниц видеобуфера (вместо 2 получить 1, 16 цветов, 640х480 точек).

Практически любой видеоадаптер способен отобразить гораздо больше цветов, чем определяется количеством бит, отведенным под один пиксел. Например, монитор EGA адаптера способен отображать 64 цвета, т.к. имеет 6-битовый видеосигнал. Видеоадаптер переводит 4-битовый цвет пиксела в 6-битовый видеосигнал. Для перевода используется некоторое подобие таблицы, называемое палитрой. Фактически адаптер имеет 16 специальных внутренних регистров, где для каждого логического цвета хранится его 6-битовое значение видеосигнала (6 бит, т.к. 3 основных цвета + бит интенсивности, следовательно, на каждый цвет - 2 бита). Цвет в палитре задается байтом вида 00rgbRGB. Малые буквы обозначают бит интенсивности соответствующего цвета.

Существует возможность менять в таблице соответствие логического цвета и видеосигнала, выбирая его из 64 возможных цветов.

4-битовый атрибут
Регистр используемой цветовой матрицы
Логическое И

 
 

 


6-битовый сигнал, подаваемый на дисплей

 

void far setpalette(int color, int colorvalue);

Для логического цвета color устанавливается физический цвет colorvalue.

Обратная функция void far getpalette(struct palettetype far * palette)

заполняет структуру palette, формат которой описан в заголовочном файле, данными о текущей палитре.

Пример – BGI\ex8.c

 

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

 

int main(void)

{

int gdriver = DETECT, gmode, errorcode;

int color, maxcolor, ht;

int y = 10;

char msg[80];

/* инициализация графики, автоопределение */

initgraph(&gdriver, &gmode, "c:\\tcpp\\bgi");

errorcode = graphresult(); /* анализ результатов инициализации */

if (errorcode!= grOk) /* обнаружена ошибка */

{

printf("Ошибка графики: %s\n", grapherrormsg(errorcode));

printf("Для выхода из программы нажмите любую клавишу");

getch();

exit(1); /* выход с кодом ошибки */

}

maxcolor = getmaxcolor();

ht = 2 * textheight("W");

/* показать цвета по умолчанию */

for (color=1; color<=maxcolor; color++)

{

setcolor(color);

sprintf(msg, "Цвет: %d", color);

outtextxy(1, y, msg);

y += ht;

}

getch(); /* ожидание нажатия клавиши */

/* смена палитры */

for (color=1; color<=maxcolor; color++)

setpalette(color, RED);

getch();

for (color=1; color<=maxcolor; color++)

setpalette(color, GREEN);

getch();

for (color=1; color<=maxcolor; color++)

setpalette(color, WHITE);

getch();

/* гашение цветов одного за другим */

for (color=1; color<=maxcolor; color++)

{

setpalette(color, BLACK);

getch();

}

closegraph();

return 0;

}

Реализация 16-цветной палитры для VGA гораздо сложнее. Для каждого цвета имеется 18-битовая раскладка по компонентам (6 бит на каждый из 3 основных цветов - в EGA было по 2 бита на цвет). Дополнительные биты дают более тонкую раскладку по интенсивности, т.е. обеспечивают более разнообразное смешивание 3 основных цветов. Схема получения 18-битового сигнала на начальном этапе повторяет EGA, далее задействован еще ряд регистров, операции логического И.

Помимо поддержки EGA видеоадаптер VGA имеет 256 специальных регистров, где для каждого цвета хранится его 18-битное представление. Обычно BIOS записывает в эти регистры набор цветов, принимаемый по умолчанию. Этот режим используется для получения 256 цветов при разрешении 320*200. Распределение цветов по регистрам видеоадаптера VGA:

 

0h – 0Fh CGA-совместимые цвета (по умолчанию)  
10h – 1Fh Шкала серого  
Высокая интенсивность
20h – 67h

Синий, красный, зеленый Высокая интенсивность
  Синий, красный, зеленый Средняя интенсивность
  Синий, красный, зеленый Низкая интенсивность
Средняя интенсивность
68h – AFh

Синий, красный, зеленый Высокая интенсивность
  Синий, красный, зеленый Средняя интенсивность
  Синий, красный, зеленый Низкая интенсивность
Низкая интенсивность
B0h – F7h

Синий, красный, зеленый Высокая интенсивность
  Синий, красный, зеленый Средняя интенсивность
  Синий, красный, зеленый Низкая интенсивность
F8h – FFh Черный  

 

Регистры 0h - 0Fh (h – hex, 16-ричный) обеспечивают CGA-совместимый набор цветов, принимаемый по умолчанию. Регистры 10h - 1Fh содержат упорядоченный по возрастанию набор оттенков серого. Следующие 216 регистров (20h - F7h) содержат 3 группы по 72 цвета, где первая группа (20h - 67h) -цвета повышенной яркости, вторая группа (68h - AFh) - средней, третья (B0h - F7h) - пониженной. Каждая такая группа состоит из трех диапазонов цветов, упорядоченных по снижению яркости. Снижение яркости можно трактовать как увеличение количества белого цвета, подмешанного к основному. Цвета в каждом диапазоне располагаются в порядке перехода от синего через красный к зеленому.

При 16-цветной работе VGA исходному логическому номеру цвета для 6-битовой палитры EGA сопоставляется, как и ранее, значение от 0 до 63. Но это уже не RGB-разложение цвета, а номер одного из 256 регистров, содержащих физический цвет. Для установки значений регистров служит функция

 

void far setrgbpalette(int color, int red, int green, int blue);

color - логический номер цвета (от 0 до 15 или от 0 до 255 в зависимости от graphmode), остальное - его RGB-интенсивности (используются только младшие байты, только 6 битов каждого байта).

Функция setpalette() присваивает одному из 16 логических цветов значение физического цвета из диапазона 0 - 63. Функция setrgbpalette() делает то же самое, но диапазон цветов шире.

Пример – BGI\ex9.c. Здесь все 16 цветов адаптера VGA переопределяются в различные оттенки серого.

 

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

 

int main(void)

{

/* выбор драйвера и видеорежима, поддерживающих */

/* использование функции setrgbpalette() */

int gdriver = VGA, gmode = VGAHI, errorcode;

/* структура, где запоминается палитра для последующего восстановления */

struct palettetype pal;

int i, ht, y, xmax;

/* инициализация графики и локальных переменных */

initgraph(&gdriver, &gmode, "c:\\tcpp\\bgi");

errorcode = graphresult(); /* анализ результатов инициализации */

if (errorcode!= grOk) /* обнаружена ошибка */

{

printf("Ошибка графики: %s\n", grapherrormsg(errorcode));

printf("Для выхода из программы нажмите любую клавишу");

getch();

exit(1); /* выход с кодом ошибки */

}

getpalette(&pal); /* копируем палитру для последующего восстановления */

for (i=0; i<pal.size; i++) /* создаем палитру из оттенков серого */

setrgbpalette(pal.colors[i], i*4, i*4, i*4);

/*****************/

/* i*4=(63*i)/15 */

/*****************/

/* ИЗМЕНИТЕ любое из 3 цветовых значений или все 3: */

/* i*8, i*8, i*8; i*8, i*4, i*4; i*4, i*4, i*8 *18; *108; *1008 и т.д. */

/* объясните полученный эффект */

 

/* отображение шкалы серого */

ht = getmaxy() / 16;

xmax = getmaxx();

y = 0;

for (i=0; i<pal.size; i++)

{

setfillstyle(SOLID_FILL, i);

bar(0, y, xmax, y+ht);

y += ht;

}

getch();

closegraph();

return 0;

}

 




Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 484; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.039 сек.