uses Graph;
{ Выводит на экран шеснадцатицветную картинку (содержимое bmp-файла) }
function Draw(x0,y0: integer; fname: string): integer;
{ x0,y0 - координаты левого верхнего угла области вывода;
fname - имя файла картинки;
Значения функции:
высота иллюстрации;
-1 - не найден файл;
-2 - картинка не является шеснадцатицветной.
}
label
bye;
const
{ таблица преобразования кодировки цвета из Windows в DOS }
color: array[0..15] of byte = (0,4,2,6,1,5,3,7,8,12,10,14,9,13,11,15);
type
{ Прочитав из bmp-файла эту запись, можно получить информацию
о находящейся в файле картинке: размере и кол-ве цветов. }
bmpinfo = record
h1,h2: char; { файл должен начинаться буквами BM }
Size: longInt; { размер файла, байт }
Reserved: longint; { резерв, не используется }
Offset: longint; { смещение данных относительно начала файла }
b: longint; { не используется }
Width: longint; { ширина картинки }
Height: longint; { высота картинки }
Plans: word; { кол-во планов, должно содержать 1 }
bpp: word; { кол-во битов на пиксель (1, 4, 8 или 24 }
end;
var
f: file of bmpinfo; { для получения информации о картинке }
bmpf: file of byte; { для чтения картинки }
res: integer; { код ошибки открытия файла }
info: bmpinfo; { информация о картинке }
x,y:integer; { координаты пикселя }
b: byte; { байт, прочитанный из файла }
bh: byte; { сдвинутый на 4 разряда вправо старший полубайт }
bl: byte; { четыре младшие бита прочитанного байта }
nb: integer; { кол-во байт (кратное четырем) соответствующее строке }
np: integer; { кол-во выведенных пикселей строки }
i,j : integer;
begin
assign(f,fname);
{$I-}
reset(f);
{$I+}
res:=IOResult;
if res <> 0 then
begin
Draw:=-1; { не найден файл картинки }
goto bye;
end;
read(f,info); { читаем информацию о картинке }
close(f); { и закрываем файл }
if info.bpp <> 4 then
begin
Draw:=-2; { картинка не 16-ти цветная }
goto bye;
end;
x:=x0;
y:=y0+info.height;
nb:= (info.width div 8)*4;
if (info.width mod 8) <> 0 then nb:=nb+4;
assign(bmpf,fname);
reset(bmpf);
seek(bmpf,info.offset);
{ вывод иллюстрации }
for i:=1 to info.height do
begin
np:=0; {кол-во выведенных пикселей }
for j:=1 to nb do { вывод строки }
begin
{ if not EOF(bmpf) then }
read(bmpf,b);
if np < info.width then
begin
bh:= b shr 4;
putpixel(x,y,color[bh]);
inc(x);
inc(np);
end;
if np < info.width then
begin
bl:= b and 15;
putpixel(x,y,color[bl]);
inc(x);
inc(np);
end;
end;
x:=x0;
dec(y);
end;
close(bmpf);
Draw:=info.Height;
bye:
end; { Draw }
{ тестирование функции Draw}
var
grDriver: Integer;
grMode: Integer;
ErrCode: Integer;
res: integer;
begin
grDriver := detect;
InitGraph(grDriver, grMode,'e:\tp\bgi');
ErrCode := GraphResult;
if ErrCode = grOk then
begin
res:=Draw(0,20,'d:\pal16.bmp');
case res of
-1: writeln('Ошибка обращения к файлу.');
-2: writeln('Иллюстрация не является 16-ти цветной.');
end;
writeln('Для завершения работы с программой нажмите <Enter>.');
readln;
end;
CloseGraph;
end.