| Npixels = Nx+Ny; {число пикселов в области }

- 451 -

| VAR

| countpixels, color : Word; {счетчик точек и их цвет }

| x, y : Integer; {координаты текущей точки }

| BEGIN

| GrInit; {инициализация графики }

| color := GetMaxColor; {цвет выводимых точек }

| countpixels := 0; {обнуление счетчика точек }

| {Повторение до тех пор, пока значение счетчика не равно }

| repeat {количеству точек в фигуре: }

| x := minx+Random(Nx); {Случайные координаты }

| y := miny+Random(Ny); {точки в прямоугольнике. }

| if GetPixel(X, Y)=Black then {Если в точке (X, Y) }

| begin {ничего нет, то }

| PutPixel(x, y, color); {подсветить ее и }

| Inc(countpixels) {увеличить счетчик. }

| end;

| until countpixels=Npixels;

| repeat until KeyPressed; {пауза до нажатия клавиши }

| {Повторение до тех пор, пока значение счетчика не станет }

| repeat {равным нулю: }

| x := minx+Random(Nx); {Случайные координаты }

| y := miny+Random(Ny); {точки в прямоугольнике. }

| if GetPixel(x, y) = color then

| begin {Если точка (X, Y) светится, }

| PutPixel(x, y, Black); {то «потушить» ее и }

| Dec(countpixels) {уменьшить счетчик. }

| end;

| until countpixels=0;

| CloseGraph {закрытие режима графики }

| END.

Рис. 19.28 (окончание)

<p>19.6.2. Работа с фрагментами изображений</p>

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

ImageSize(X1, Y1, X2, Y2 : Integer) : Word;

Возвращает размер памяти в байтах, необходимый для сохранения прямоугольной области экрана. Прямоугольник определяется координатами левого верхнего (X1, Y1) и правого нижнего (X2, Y2) углов. Эта функция обычно используется совместно с процедурой GetMem.

- 452 -

Записать изображение в буфер можно, используя процедуру

GetImage ( Х1, Y1, Х2, Y2 : Integer; VAR BitMap)

в которой параметры X1, Y1, X2, Y2 имеют то же значение, что и в ImageSize, а вместо бестипового параметра BitMap должна подставляться переменная-буфер, занимающая область памяти размера, необходимого для полного сохранения изображения (т.е. равного значению ImageSize). Отметим, что максимальный размер сохраняемого изображения не должен превышать 64K.

Процедура

PutImage( X1, Y1 : Integer; VAR BitMap; Mode : Word )

восстанавливает изображение из буфера BitMap в прямоугольник, левый верхний угол которого определен координатами (X, Y). Обратите внимание на то, что в отличие от процедуры GetImage здесь нужна всего одна точка. Объясняется это тем, что в структуре BitMap первые два слова (четыре байта) содержат ширину и высоту в пикселах запомненного изображения. Наиболее интересным в этой процедуре является возможность определять режим вывода изображения: можно суммировать изображение на экране и изображение в буфере, можно уничтожать изображение, находящееся в определяемой области, можно инвертировать изображение, содержащееся в буфере. Эти операции задаются параметром Mode, для которого в модуле Graph определены константы, уже названные при описании процедуры SetWriteMode. Напишем их еще раз:

CONST

CopyPut =0; { операция MOV (замещение) }

XORPut =1; { операция XOR }

ORPut = 2; { операция OR }

ANDPut = 3; { операция AND }

NOTPut = 4; { операция NOT }

В фигурных скобках написаны операторы ассемблера, которыми реализуется соответствующий алгоритм.

Перейти на страницу:

Поиск

Похожие книги