Wyświetlanie BMP

musio

Wiem, że jest już coś takiego w faq, ale sami zobaczcie jak to było napisane.

Jest to mój pierwszy artykuł w ogóle, więc miejcie wyrozumiałość jakby coś było nie tak.

Mam zamiar napisac tu procedure, która wyświetla jakąś 256 kolorową bitmapke o rozdzielczości <=320X200 pixeli (13h) w w wybranym miejscu na ekranie.

A oto ona:
{Wszystko objaśnione jest w komentarzach}

Procedure BMPOpen (ax,ay:word; sciezka:string);
Type
 TNaglowek=
   Record
   bfType :             Word;
   bfSize :             LongInt;
   bfReserved :         LongInt;
   bfOffBits :          LongInt;
   biSize :             LongInt;
   biWidth :            LongInt;
   biHeight :           LongInt;
   biPlanes :           Word;
   biBitCount :         Word;
   biCompression :      LongInt;
   biSizeImage :        LongInt;
   biXPelsPerMeter :    LongInt;
   biYPelsPerMeter :    LongInt;
   biClrUsed :          LongInt;
   biClrImportant :     LongInt;
  End;
Var
   PlikNaglowek: file of Tnaglowek;
   Naglowek:Tnaglowek; 
   bitmapa:file of byte;
   z,a:byte;
   b,g,r:byte;
   x,y:integer;
   kolor:byte;
begin
   assign (PlikNaglowek,sciezka);      {skojarzenie z plikiem}
   reset (PlikNaglowek);                     {otwarcie do odczytu}
   read (PlikNaglowek,Naglowek);      {wczytanie nagłówka   }
{-------------------------------------------------------------------}
   assign (bitmapa,sciezka);
   reset (bitmapa);
asm                                  {włączenie trybu graficznego}
   mov ax,13h
   int 10h
end;
for x:=1 to 54 do read (bitmapa,z);     {pominięcie nagłówka}
for x:=0 to 255 do begin               {wczytanie palety kolorów}
   read (bitmapa,b,g,r,z);                       {wczytanie kolorów BGR i pominięcie pustego bajtu(a)}
   port[$3c8]:=x;                                {port $3c8 oczekuje na składowe dla koloru x}
   port[$3c9]:=r div 4;                          {przesyłamy}
   port[$3c9]:=g div 4;                          {te}
   port[$3c9]:=b div 4;                          {składowe}
end;                                             {mamy gotową paletę}
                                          
for y:=Naglowek.biHeight-1 downto 0 do        {a teraz wczytujemy kolory}
for x:=0 to Naglowek.biWidth do
begin
   read (bitmapa,kolor);
   mem[$A000:y shl 8+ y shl 6 + x+ay shl 8 +ay shl 6+ax]:=kolor;
end;
readln;
asm       {powracamy do normalnego trybu tekstowego}
   mov ah,3h 
   int 10h
end;
end;

Begin
  BMPOpen (30,20,'C:\beznazwy.bmp');
readln;
end.

13 komentarzy

@czubekone: jasne, jak sobie ręcznie samemu pobierzesz (i być może skompilujesz, nie wiem czy jest) FPC dla kilkudziesięcioletniego DOS'a.

a czy mógł ktoś powiedzieć czy takie coś jest do zrobienia w dev-pascal ?

a mam takie pytanko:

w jaki sposob mozna zmienic zeby rozdielczosc byla 640/480??

wiem ze temat jest starawy ale moze ktos odpowie z gory dzieki

Te fragmenty są niepotrzebne:

asm                                  {włączenie trybu graficznego}
   mov ax,13h
   int 10h
end;
readln;
asm       {powracamy do normalnego trybu tekstowego}
   mov ah,3h
   int 10h
end;

Wg mnie niepotrzebnie włączasz i wyłączasz tryb graficzny w procedurze. Możesz sobie przerobić to na osobne procedury inicjacji trybów graficznych. Dzięki temu zyskasz większą swobodę w programie.

...a zamiast tego:

for x:=1 to 54 do read (bitmapa,z);     {pominięcie nagłówka}

proponuję:

seek(bitmapa, sizeOf(Tnaglowek));

Jest to czytelniejsze, szybsze i mamy mniejszą prowizorkę :)
Objaśnienia:
'seek(f: zmienna plikowa; pozycja: longint)' przesuwa wskaźnik plikowy na element pliku 'f' określony zmienną 'pozycja'.
'sizeOf(element): word' zwraca ile bajtów zajmuje dany element

więc...

  1. Zamiast "for x:=0 to Naglowek.biWidth do" ma być "for x:=0 to Naglowek.biWidth-1 do", bo inaczej Disk read error murowany...
  2. Może by tak zamiast "for x:=0 to 255 do begin" dać "for x:=0 to Naglowek.bitCount-1 do begin ". Wtedy by przynajmniej działały takze bitmapy ktore maja np. 16 kolorow a nie 256. Pozatym art nawet fajny

Zagrożenie usunięte:) Co do linuxa i innych nie windowsowskich oczywiście nie :)

Eroor 100: Disk read error. w lini read(bitmapa,kolor);
Plik gawiczny jest o rozdzielczości takiej jak ma być posiada 256 kolorów jest w fomacie bmp ścieżka jest odpowiednia. Proszę o pomoc
linka jest trefna !!!

Nawet tym posiadającym Linuksa/BSD/etc?

cały kod programu otocz znacznikami <delphi> </delphi>

To jest mój pierwszy artykuł, i nie zabardzo wiem jak zrobić te wcięcia. Dałem wszedzie po trzy spacje ale i tak wyświetla tak jak gdyby ich nie było.

formatowanie kodu! wcięcia!

i popraw błędy ortograficzne!!

wez kod w znacznik Delphi...