unit bmpread; {процедуры для работы с Bmp}
interface
type
artype = array[0..0]of byte;
arptr = ^artype;
bmFileHeader = record	{заголовок файла}
Typf	:	word;     {сигнатура «BM»}
Size	:	longint;  {длина файла в байтах}
Res1	:	word;     {зарезервировано}
Res2	:	word;     {зарезервировано}
OfBm	:	longint;
		   {смещение изображения в байтах (1078)}
end;
bmInfoHeader = record    {информационный заголовок}
Size	:	longint;	{длина заголовка в байтах (40)}
Widt	:	longint;	{ширина изображения (в точках)}
Heig	:	longint;	{высота изображения (в точках)}
Plan	:	word;	{число плоскостей (1)}
BitC	:	word;	{глубина цвета (бит на точку) (8)}
Comp	:	longint;	{тип компрессии (0 — нет)}
SizI	:	longint;	{размер изображения в байтах}
XppM	:	longint;	{горизонтальное разрешение}
			     {(точек на метр — обычно 0)}
YppM : longint; {вертикальное разрешение}
			{(точек на метр — обычно 0)}
NCoL : longint; {число цветов}
			{(если максимально допустимое — 0)}
NCoI : longint; число основных цветов
end;
bmHeader = record    {полный заголовок файла}
f : bmFileHeader;	{заголовок файла}
i : bmInfoHeader;	{информационный заголовок}
p : array[0..255,0..3]of byte; {таблица палитры}
end;
bmhptr = ^bmHeader;
procedure ReadBMP(image:arptr;  {массив с изображением}
xim,yim:word;	{размеры}
pal:arptr;	{палитра}
filename:string);	{имя файла}
                        {чтение изображения из Bmp-файла}
procedure ReadBMPheader(header:bmhptr;filename:string);
                        {чтение заголовка Bmp-файла}
implementation
$R-
 {чтение изображения из Bmp-файла}
procedure ReadBMP(image:arptr; xim,yim:word;
pal:arptr; filename:string);
var
h	: bmHeader;
i	: integer;
bmpfile : file;
s	: longint;
begin
assign(bmpfile,filename);
reset(bmpfile,1);
blockread(bmpfile,h,sizeof(h));   {чтение заголовка}
for i := 0 to yim-1 do begin	{построчное чтение}
blockread(bmpfile,image^[(yim-i-1)*xim],xim);
if (xim mod 4) <> 0 then
blockread(bmpfile,s,4 — (xim mod 4));
end;
close(bmpfile);
for i ^= 0 to 255 do begin  {преобразование палитры}
pal^[i*3+2] := h.p[i,0] shr 2; {синий}
pal^[i*3+1] := h.p[i,1] shr 2; {зеленый}
pal^[i*3+0] := h.p[i,2] shr 2; {красный}
end;
end;
{чтение заголовка Bmp-файла}
procedure ReadBMPheader(header:bmhptr;filename:string);
var
bmpfile:file;
begin
assign(bmpfile,filename);
reset(bmpfile,1);
blockread(bmpfile,header^,sizeof(header^));
close(bmpfile);
end;
end.