Лабораторная работа № 3
Тема: Работа с изображениями. Понятие палитры. Стандартные видеорежимы.
Цель: Знакомство с методами выделения памяти под выводимое изображение, видами и назначением палитры, принятыми стандартами для видеоадаптеров.
Ход работы.
1. Включить ПЗВМ.
2. Запустить компилятор С++.
3. Работа с изображениями.
При выполнении графических операций бывает необходимо запоминать определенный фрагмент в буфере ОЗУ и выводить его на экран (например при мультипликации, демонстрации слайдов и пр.). Библиотека это позволяет, однако требует выполнения некоторых действий. Рассмотрим их.
а) Определение требуемого объема ОЗУ (в байтах) для запоминания картинки выполняет функция imagesize. Границы картинки определены т.1 (левый верхний угол) и т.2 (верхний правый):
void far imagesize ( int x1, int y1, int x2, int y2 )
б) Выполнение процедуры запоминания изображения getimage:
void far getimage (int x1, int y1, int x2, int y2, void far * Image );
Примечание! В последнем случае, прямоугольный фрагмент определяемый точками 1 и 2 будет записан в область пямяти, задаваемую параметром — Image.
в) Операция вывода изображения на экран с помощью функции putimage:
void far putimage ( int x, int y, void far * Image, int op);
Примечание! Изображение выводится так, что точка (x,y) — верхний левый угол изображения. Последний параметр определяет способ наложения нового изображения по отношению к имеющемуся (см. функцию setwritemode). Поскольку каждый пиксел характеризуется определенным количеством битов, то в качестве вариантов выступают разные побитовые логические операции. Значения для параметра (ор) таковы:
* COPY_PUT — происходит простой вывод (замена изображения);
* NOT_PUT — вывод в инверсном режиме;
* OR_PUT — выполнение побитовой операции ИЛИ;
* XOR_PUT — используется побитовая операция ИСКЛЮЧАЮЩАЯ ИЛИ;
* AND_PUT — побитовая операция И.
Пример 1. Запоминание фрагмента изображения и вывод в новое место с замещением.
//examp1.cpp
unsigned ImageSize = imagesize ( x1, y1, x2, y2 ); /*выделение памяти под фрагмент 1-2*/
void * Image = malloc ( Imagesize ); /*запоминание фрагмента*/
. . .
if ( Image != NULL ) /*если фрагмент что-то содержит,*/
getimage ( x1, y1, x2, y2, Image ); /*то записать его в область Image*/
. . .
if ( Image !=NULL ) /*если фрагмент не пуст,*/
{ /*то выполнить процедуру вывода в */
putimage ( x, y, Image, COPY_PUT ); /*точку (x,y) с замещением*/
free (Image); /*освободить отведенную память
}
4. Понятие режима (способа) вывода.
При формировании изображения на экране обычно происходит замена одного пиксела другим. Но существует также вариант, когда новый пиксел будет накладываться на имеющийся, и в видеопамяти будет результирующая информация. Поскольку каждые пиксел представлен комбинацией битов, то будем иметь дело с побитовой операцией. Для установки вида используемой операции используют функцию setwritemode:
void far setwritemode ( int Mode );
где параметр Mode определяет способ наложения и может принимать следующие формы:
— COPY_PUT — для простого вывода (замещения);
-XOR_PUT — побитовая операция ИСКЛЮЧАЮЩАЯ ИЛИ.
Следует учесть, что режим XOR_PUT удобен тем, что повторный вывод одного и того же изображения уничтожает результат первого вывода, восстанавливая старое изображение. Кроме этого надлежит знать, что не все функции графической библиотеки поддерживают используемый режим вывода (например функции закраски игнорируют установленный режим наложения). Возможны сложности с использованием режима XOR_PUT.
5. Создание индивидуального окна вывода.
Смысл состоит в том, чтобы создать на экране окно (типа миниэкрана) со своей локальной системой координат. Для этого существует функция setviewport:
void far setviewport ( int x1, int y1, int x2, int y2, int Clip);
Здесь начало координат перемещается в точку (x1,y1). Окно имеет размеры, определяемые диагональю (x1,y1) — (x2,y2). Параметр Clip определяет нужно ли проводить отсечение изображения, не помещающееся в рамки окна, или нет.
Примечание! Все процедуры рисования работают только с локальными координатами (за исключением самой setviewport). При выполнении отсечения в качестве границ могут выступать разные элементы. Так для функции outtextxy используются символы, а не пикселы.
6. Понятие палитры.
Для образования всего многообразия цветов с помощью видеоустройств применяют RGB представление (Red, Green, Blue) с заданной интенсивностью. Она изменяется в диапазоне 0-1. Так 1,1,1 — белый цвет, 0,0,0 — радикально черный. Все остальные — между. Под хранение каждой из компонент отводится определенное количество (n) бит. Поэтому допустимый диапазон значений для цветовой гаммы [0, 2n-1].
• П а л и т р а — это массив, в котором каждому возможному значению пиксела сопоставлено значение цвета (RGB), выводимого на экран. Размер палитры и параметры зависят от используемого видеоадаптера.
Примечание! Истории известны следующие виды адаптеров:
MDA (Monochrome Display Array) — монохромный адаптер фирмы IBM c разрешением 720 х 350 точек. Не работает с графикой и цветом.
HGA (Hercules Graphics Adaptor) — монохромный адаптер, обеспечивающий разрешение 720 х 348 точек. Является разработкой фирмы Hercules Technology, Inc., как дальнейшее развитие MDA для графических приложений.
СGA (Color Graphics Adaptor) — адаптер, обеспечивающий разрешение дисплея 640 х 200 точек с 4 цветами для графики (8 цветов для текста). Символы имеют размер 8 пикселов по ширине и 8 по высоте.
EGA (Enhanced Graphics Adaptor) — адаптер дисплея, обеспечивающий разрешающую способность 640 х 350 точек с 16 цветами (из 64). Является улучшенной модификацией чем CGA. Символы имеют размер 8 пикселов по ширине и 14 — по высоте.
VGA (Video Graphics Array) — адаптер дисплея, обеспечивающий разрешающую способность 640 х 480 точек с 16 цветами (или градациями черного). Разработан фирмой IBM.
XGA — адаптер дисплея, обеспечивающий разрешение 1024 х 768.
SVGA (SuperVGA) — адаптер, обеспечивающий работу в режимах 800 х 600 точек и более.
Практическое задание.
Создать программу, которая запоминает в памяти созданное изображение (на собственный выбор), и позволяет вывести его на экране, поверх имеющегося.
