Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Grafika_Turbo-Pascal.doc
Скачиваний:
24
Добавлен:
08.03.2015
Размер:
362.5 Кб
Скачать

Сохранение и выдача изображений

Для сохранения и выдачи изображений в модуле Graph определены подпрограммы: ImageSize, GetMem, FreeMem, PutImage,GetImage.

ImageSize(X1,Y1,X2,Y2:integer):word - функция определения количества байтов, необходимых для хранения прямоугольной области экрана. X1,X2,Y1,Y2 - координаты области. Если память,необходимая для хранения области больше или равна 64К, фиксируется ошибка графики grError.

GetMem(var P:pointer; size:word) - функция создает новую динамическую переменную заданного размера и помещает адрес блока в переменную - указатель P. Size - необходимый размер памяти для динамической переменной. Если свободной памяти нет,фиксируется ошибка.

Для освобождения занимаемой памяти используется соответствующая функция :

FreeMem(var P:pointer; size:word),

где

P - переменная-указатель, которой было присвоено значение функцией GetMem или оператором присваивания;

size - размер в байтах уничтожаемой динамической переменной. Ее размер должен совпадать с числом байт в памяти, распределенной ранее под эту переменную процедурой GetMem.

После вызова FreeMem, значение P становится неопределенным и последующие ссылки P будут ошибочны.

GetImage(X1,Y1,X2,Y2:integer; var BitMap) - процедура сохранения в памяти копии прямоугольного фрагмента изображения. X1,Y1,X2,Y2 - координаты, определяющие прямоугольную область экрана;

BipMap - переменная, куда будет помещена копия изображения. Определение размера для BipMap выполняется функцией ImageSize.

PutImage( X,Y:integer; var BitMap; BitBit:word) - процедура вывода в заданное место экрана копии фрагмента изображения, ранее помещенного в память процедурой GetImage.

X,Y - переменные, определяющие координаты левого верхнего угла того места на экране, куда будет скопирован фрагмент изображения. Координаты правого нижнего угла не указываются, так как они полностью определяются размерами выводимой на экран копии из памяти. Координаты левого верхнего угла могут быть какими угодно, однако если выводимая копия не может разместиться на экране, она не выводится и экран остается без изменений.

BitMap - переменная , откуда будет копироваться изображение;

BitBit - переменная , определяющая способ копирования.

Параметр BitBit определяет способ взаимодействия вновь размещаемой копии с уже имеющимися на экране изображениями. Взаимодействие осуществляется путем применения кодируемых этим параметром логических операций к каждому биту копии и изображения.

Логическая операция определяется константами :

const

NortmalPut = 0; {замена существующего изображения на копию}

XorPut = 1; {исключительное ИЛИ}

OrPut = 2; {объединительное ИЛИ}

AndPut = 3; {логическое И}

NotPut = 4; {инверсия изображения}

Наиболее часто используются операции NormalPut, XorPut и NotPut. Первая из них просто стирает часть экрана и на это место помещает копию из памяти в том виде, как она там сохраняется.Операция NotPut делает то же самое, но копия выводится в инверсном виде, т.е. светящиеся пиксели заменяются на темные и наоборот. Повторный вывод с параметром XorPut фрагмента изображения на то же место экрана, откуда была получена копия, сотрет эту часть экрана.

Используя указанные процедуры можно создавать элементы движения графических изображений. Рассмотрим основные этапы построения движущихся изображений:

  1. определить прямоугольную область экрана, в которой пост-

роить изображение обьекта, используя стандартные подпрограммы модуля Graph;

  1. используя процедуру ImageSize, определить размер прямоугольной области в байтах для сохранения изображения;

  2. процедурой New создать динамическую переменную для хранения изображения обьекта ;

  3. поместить копию обьекта в динамическую память процедурой PutImage и удалить ее с экрана;

  4. переместить текущий указатель в нужную точку экрана и вывести на экран копию сохраненного обьекта процедурой GetImage.

Для создания иллюзии движения графического изображения в каждый отдельный момент времени можно перемещаясь по экрану

выводить копию изображения процедурой GetImage с предваритель-

ным удалением предыдущей копии с экрана.

Наилучшее изображение обьекта можно получить, создав

несколько копий имитации движения, сохранив их в динамической

памяти и выводя последовательно одну за другой.

Пример. Вывод "летающей " тарелки.

uses Graph,Crt;

var

x,y,Driver,Mode:integer;

p:pointer;

begin

Driver:=Detect;

InitGraph(Driver,Mode,'');

SetColor(2);

FillEllipse(30,40,25,10);

SetColor(3);

Line(38,40,15,10);

Line(22,40,51,10);

GetMem(p,ImageSize(0,0,60,60)); { создание динамической пе-

ременной для хранения прямоугольного фрагмента экрана}

GetImage(0,0,60,60,p^); { сохранение копии в динамической

x:=0; y:=0; памяти}

repeat

PutImage(x,y,p^,XORput);

x:=x+5;

y:=y+1;

PutImage(x,y,p^,XORput);

until KeyPressed;

CloseGraph

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]