Главная » Free Pascal » Управление точками и фрагментами графического экрана Free Pascal

0

Каждая точка на графическом экране (пиксел) характеризуется координатами (x, y) и кодом цветности. Программа имеет возможность узнать или изменить код цветности любого пиксела:

var

col: Word;

x, y: SmallInt;

col:=GetPixel(x,y); // опрос цвета пиксела

PutPixel(x,y,col);  // изменение цвета пиксела

Помните, что под кодом цветности (значение переменной col) здесь по- прежнему выступает номер регистра ЦАП, по содержимому которого был или бу- дет окрашен указанный пиксел.

Вывод на экран по одному пикселу может иметь смысл, когда общее количе- ство точек сравнительно невелико. Даже на достаточно скоростном компьютере (два ядра, тактовая частота более  2  ГГц)  время  заполнения  экрана  размером 800 600 составляет порядка 3—4 секунд. Гораздо больший интерес представля- ют процедуры группового копирования или восстановления пикселов, образую- щих на экране прямоугольный растровый фрагмент. Так как операция прямого обмена между байтами видеопамяти и оперативной памяти выполняется доста- точно быстро, то таким способом можно мгновенно обновить содержимое гра- фического экрана.

Перед копированием прямоугольного фрагмента, координаты которого задают-

ся углами противоположных точек — (x1, y1) и (x2, y2), необходимо определить объем в байтах оперативной памяти, необходимый для запоминания информации об указанных пикселах экрана. Для этой цели предназначена функция ImageSize:

var

x1, y1, x2, y2: SmallInt; size: LongInt;

size:=ImageSize(x1,y1,x2,y2);

Порядок задания координат важен — точка (x1,y1) должна соответствовать ле- вому верхнему углу растрового фрагмента, точка (x2, y2) — правому нижнему. По- сле определения размера буфера можно запросить память под соответствующий динамический массив и скопировать в него нужный фрагмент экрана:

var

buf: array of Byte;        // динамический массив s_b: Longint;

s_b:=ImageSize(0,0,799,599); // объем памяти под графический экран buf:=SetLength(s_b);         // запрос памяти GetImage(0,0,799,599,buf);   // копирование экрана

Обратная операция по копированию буфера оперативной памяти на графиче- ский экран выполняется с помощью процедуры PutImage:

PutImage(x1, y1, buf, mode);

В этом случае указываются только координаты левого верхнего угла фраг- мента, которые могут и не совпадать с его местоположением в момент копирова- ния. Размеры растрового изображения запоминаются в буфере при копировании фрагмента экрана, поэтому идентичность границ копировавшегося и восстана в- ливаемого участка экрана будет обеспечена. Последний аргумент процедуры Pu- tImage определяет способ взаимодействия прежнего и нового кодов цветности. Обычно значение параметра mode задают с помощью одной из следующих мне- монических констант:

± CopyPut — новый код цветности заменяет прежний;

± XORPut — новый код цветности поразрядно складывается с прежним по моду- лю 2;

± ORPut — новый код цветности логически складывается с прежним;

± ANDPut — новый код цветности логически умножается на прежний;

± NotPut — новый код цветности инвертируется и заменяет прежний.

Приведенная в листинге 15.2 программа копирует прямоугольный фрагмент, расположенный в левом верхнем углу, и повторяет его справа от исходного изо- бражения.

   Листинг 15.2. Программа  image1                                              

program image1; uses Graph;  var

gd, gm:SmallInt;

a: array of Byte; // динамический массив

// для хранения фрагмента (буфер) size: Byte;      // для размера буфера

begin

gd:=D8bit; gm:=m800x600; InitGraph(gd,gm,”); Rectangle(10,10,80,60); Circle(45,35,20);

size:=ImageSize(10,10,80,60); // запрос размера буфера SetLength(a,size);            // запрос памяти под буфер GetImage(10,10,80,60,a[0]);   // копирование изображения в буфер PutImage(100,10,a[0],CopyPut); // копирование буфера на экран readln;

CloseGraph;

end.

Результат ее работы приведен на рис. 15.3.

Рис. 15.3. Размножение фрагмента

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии