| 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 (окончание)
19.6.2. Работа с фрагментами изображений
Следующие две процедуры и одна функция используются для запоминания в буфере и восстановления из него прямоугольных фрагментов графического изображения. Это зачастую удобно, так как дает возможность оперировать уже готовыми элементами изображений. При работе с фрагментом всегда важно знать его объем в байтах (который может меняться на разных адаптерах). Функция
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 }
В фигурных скобках написаны операторы ассемблера, которыми реализуется соответствующий алгоритм.