| 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 }

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

Поиск

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