Функция Draw- вывод иллюстрации, находящейся в bmp- файле — Pascal(Паскаль)

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.

Leave a Comment

− 1 = 1