| size : Word; { размер файла в байтах }
| dataptr : Pointer; { указатель на начало }
| BEGIN
| Assign( PicFile, FileName ); { Открытие файла для }
| Reset( PicFile, 1 ); { чтения по одному байту. }
| size := FileSize( PicFile ); { размер файла в байтах }
| Reset( PicFile, size ); { смена буфера файла }
| GetMem( dataptr, size ); { выделение памяти }
| BlockRead(PicFile,dataptr^,1); { чтение картинки }
| PutImage(X,Y,dataptr^,put); { вывод картинки на экран }
| Close( PicFile ); { закрытие файла }
| FreeMem( dataptr, size ) { освобождение памяти }
| END;
| BEGIN { Пример вызовов процедуры }
| GrInit;
| LoadScreen( 0, 0, 'graph.scr', XORPut);
| LoadScreen(20, 20, 'graph.scr', XORPut);
| LoadScreen(40, 40, 'graph.scr', XORPut);
| LoadScreen(60, 60, 'graph.scr', XORPut } ;
| LoadScreen(80, 80, 'graph.scr', XORPut);
| ReadLn;
| CloseGraph
| END.
Рис. 22.12
При таком способе сохранения изображений существует ограничение на их размер. Это связано с тем, что функция ImageSize возвращает результат типа Word. Таким образом, картинка не должна занимать в памяти больше 65520 байт. Для адаптера EGA,
- 523 -
например, полностью весь экран можно записать на диск максимум в режиме 640x200, 16 цветов — это займет 64004 байта. Кроме того, если размеры картинки таковы, что она полностью не сможет поместиться на экран, то выводиться на него при чтении с диска она не будет.
У такого способа записи изображений есть одно удобное свойство: в каком бы графическом режиме картинка не была записана, она всегда сможет быть прочитана и показана в любом другом графическом режиме.
Другой способ сохранения и чтения картинок основан на знании устройства и работы графических адаптеров: каждая цветовая плоскость сохраняется в отдельном файле. При таком способе работы ограничений на размер картинки практически нет (рис. 22.13).
| USES Graph;
| {$I initgraf.pas} {процедура инициализации (см. гл. 19) }
| TYPE
| g_plan=Array [1..38400] of Byte; { массив-плоскость }
| {Процедура сохранения изображения всего экрана на диске.
| Для каждой битовой плоскости создается отдельный файл.
| Параметр file_name - имя файла без расширения. }
| PROCEDURE SaveBitPlanes( file name : String );
| VAR
| scr_buf:Pointer ; { указатель на буфер данных }
| scr_arr:g_plan absolute $A000:$0; { память адаптера }
| plen,mx,my:LongInt; { размер плоскости }
| { Вложенная процедура записи плоскости на диск }
| PROCEDURE WriteBlk( name : String );
| VAR
| image_file : File;
| BEGIN
| Assign( image_file, name );
| Rewrite( image_fite, plen );
| BlockWrite( image_file, scr_buf^, 1 );
| Close( image file )
| END;
| BEGIN
| mx := GetMaxX+1; my := GetMaxY+1; { размеры плоскости }
Рис. 22.13
- 524 -
| plen := mx*my div 8;
| { получение длины буфера }
| GetMem( scr_buf, plen );
| { память для буфера }
| Port[$3CE]:=4; Port[$3CF]:=0;
| { чтение плоскости Blue }
| Move(scr_arr,scr_buf^,plen); { копирование ее в буфер }
| WriteBlk(file_name+'.blu');
| { запись буфера на диск }
| Port[$3CE]:=4; Port[$3CF]:=1; { чтение плоскости Green }
| Move(scr_arr,scr_buf^,plen); { копирование ее в буфер }
| WriteBlk(file_name+'.grn'}; { запись буфера на диск }
| Port[$3CE]:=4; Port[$3CF]:=2; { чтение плоскости Red }