| 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

<p>22.4. Работа с графическими образами на диске</p>

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

Мы уже рассматривали, каким образом можно получить копию изображения с экрана на принтере (см. разд. 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; { бестиповый файл }

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

Поиск

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