| VAR R : Registers; { требуется для прерываний }
| BEGIN
| with R do { действия с полями записи }
| begin
| AH := $13; { функция вывода строки }
| AL := 0; { цвет символов задан в BL }
| BH := page; { вывод на страницу page }
| BL := attr+$80, { цвет (+$80 для XOR) }
| DH:=Y; { DH и DL - позиция тексто- }
| DL := X; { вого курсора }
| CX := Length( str); { длина выводимой строки }
| BP := Ofs( str )+1; { Адрес выводимой строки в }
| ES := Seg( str ) { виде базы и сегмента, }
| end; { начиная со Str[1]. }
| Intr( $10, R ); { вызов прерывания 10Н }
| END;
Рис. 22.10
22.4. Работа с графическими образами на диске
Как уже говорилось, прямой доступ к памяти видеоадаптеров затруднен в связи с тем, что при этом необходимо обращаться к их специальным управляющим регистрам. Для тех, кому могут понадобиться манипуляции с изображением на экране, может быть полезна изложенная ниже информация.
Мы уже рассматривали, каким образом можно получить копию изображения с экрана на принтере (см. разд. 19.6.1). Теперь
- 521 -
попробуем записать изображение с экрана на диск. Казалось бы просто — достаточно немного изменить процедуру CopyToPrint. Однако при таком подходе место на диске будет расходоваться неэкономно: в каждом байте старшие четыре (как минимум) бита не используются. Исключение составляют все режимы с количеством цветов 256 и более (VGA, MCGA, IBM8514). Чтобы не заботиться об этом, можно воспользоваться функцией ImageSize (см. разд. 19.6.1) — она возвращает размер картинки в байтах, уже учтя все нюансы ее расположения в ОЗУВ. Воспользовавшись затем процедурой GetImage, можно сохранить изображение на диске (рис. 22.11).
| USES Graph;
| {$I initgraf.pas} {процедура инициализации (см. гл. 19) }
| { Процедура записи на диск картинки с экрана. }
| { Максимальный размер 640x200 при 16 цветах. }
| PROCEDURE SaveScreen( X1, Y1 { координаты картинки }
| X2, Y2 : Word;
| FileName : String ); { имя файла картинки }
| VAR
| PicFile : File; { бестиповый файл }
| size :Word; { размер файла }
| dataptr : Pointer; { указатель на буфер }
| BEGIN
| Size := ImageSize(X1,Y1, X2, Y2); { размер картинки }
| GetMem( dataptr, size ); { выделение памяти }
| GetImage(X1,Y1,X2,Y2,dataptr^); { картинку – в буфер }
| Assign( PicFile, FileName ); { Открытие файла для }
| Rewrite( PicFile, size ); { записи картинки. }
| BlockWrite(PicFile,dataptr^,1); { запись картинки }
| Close( PicFile ); { закрытие файла }
| FreeMem( dataptr, size ) { освобождение кучи }
| END;
| BEGIN { Пример вызова процедуры }
| GrInit;
| SetFillStyle(1,15); Bar( 0, 0, GetMaxX, GetMaxY );
| SetFillStyle(2, 2); Bar(40, 40, GetMaxX-40, GetMaxY-40 );
| SetFillStyle(3, 3); Bar(120, 120, GetMaxX-120, GetMaxY-120);
| SetFillStyle(4, 4);Bar(240, 180, GetMaxX-240, GetMaxY-180);
| ReadLn;
| SaveScreen(70,70, GetMaxX-70, GetMaxY-70, 'graph.scr');
| CloseGraph
| END.
Рис. 22.11
- 522 -
А с помощью процедуры PutImage можно восстановить это изображение (рис. 22.12).
| USES Graph;
| {$I initgraf.pas} {процедура инициализации (см. гл. 19) }
| {Процедура вывода на экран картинки, записанной на диск. }
| {Максимальный размер - экран в режиме 640x200, 16 цветов. }
| PROCEDURE LoadScreen(X,Y:Word; { координаты левого верх- }
| { него угла картинки }
| FileName : String; { имя файла картинки }
| Put : Word ); { режим вывода на экран }
| VAR
| PicFile :File; { бестиповый файл }