Wczytywanie pliku BMP

0

Posiadam 2 bitmapy jedną 100x100 pikseli drugą 10x10 pikseli.
Wczytuje te bitmapy do tablic takim oto kodem:

Kod dla bitmapy 100x100

Assign (BitMap,'models\MinaLand.bmp'); // Skojarzenie pliku
Reset (BitMap); // Otwarcie pliku
Seek (BitMap,1078); // Przeskok za nagłówek i  paletę kolorów (paleta kolorów wczytana wcześniej)
For x := 99 downto 0 Do // Pętla dla x
  For y := 0 to 99 Do  // Pętla dla y
  Begin
    Read (BitMap,Color); // Odczyt koloru z bitmapy
    PMina[1,x,y]^ := Color; // Wpisanie koloru do tablicy
  end;
Close (Bitmap); // Zamkniecie pliku

Kod dla bitmapy 10x10

Assign (BitMap,'models\MiniLand.bmp'); // Skojarzenie pliku
Reset (BitMap); // Otwarcie pliku
Seek (BitMap,1078); // Przeskok za nagłówek i  paletę kolorów (paleta kolorów wczytana wcześniej)
For x := 10 downto 0 Do // Pętla dla x
  For y := 0 to 10 Do // Pętla dla y
  Begin
    Read (BitMap,Color); // Odczyt koloru z bitmapy
    FMiniMap[1,x,y]^ := Color; // Wpisanie koloru do tablicy
  end;
Close (Bitmap); // Zamkniecie pliku

Kod pierwszy działa bez problemu. Po odczycie kolorów z tablicy bitmapa się normalnie wyświetla. Natomiast drugi kod nie działa.
Występują przekłamania po wyświetleniu bitmapy (skośna czarna linia od prawego górnego rogu do lewego dolnego). Ktoś wie dlaczego?

Obie bitmapy tworzyłem sam w paintcie i w paintcie obie wyświetlają się poprawnie.

Bitmapy dołączam jako załączniki (trzeba zmienić rozszerzenie z pas na bmp) do postu wraz z resztą kodu unitu (wiem że to co tam napisałem niektórych przyprawi o palpitacje serca ale od czegoś trzeba zacząć :P)
W razie jak ktoś zdecyduje się przejrzeć cały kod to wszystko co dotyczy bitmap 100x100 działa jak również wszystko co dotyczy bitmap 10x10 nie działa.

0

Skoro bitmapa ma rozmiar 10x10 to dlaczego robisz pętle

For x := 10 downto 0 Do // Pętla dla x
  For y := 0 to 10 Do // Pętla dla y

A tak w ogóle to po co kombinujesz a nie wczytujesz bitmapy ze strumienia?

0

PNiszczyciel : Array[1..3,0..99,0..99] of ^Byte;

Facepalm. Nie dość że robisz okrutną tablicę, to jeszcze sadystycznie robisz ^Byte co powoduje że wszystko zabiera 5x więcej.

wiem że to co tam napisałem niektórych przyprawi o palpitacje serca ale od czegoś trzeba zacząć

Problem w tym że zaczynasz nie od tej strony, czyli bazujesz się na czasach DOSa.

Polecam zacząć od nowa z tym:
http://wiki.lazarus.freepascal.org/OpenGL_Tutorial - Jak ograniesz OpenGL to ani 3D ani 2D ci nie będzie straszne i nie będziesz musiał się przejmować wczytywaniem BMP...

0

OpenGL sam obrazka nie wczyta

Ale jak w tamtym tutorialu podano, są do tego biblioteki pomocnicze które:

  1. Istnieją więc nie musisz ich pisać
  2. Robią dużo więcej niż wczytywanie cienkiego BMP

nie wiem dlaczego z tym linkiem wyskoczyłeś...

Bo nie żyjemy w czasach świetności DOSa i trybu 13h, tylko w dobie akceleratorów graficznych i CUDów i używanie DOSowych rozwiązań jest:

  1. Nieporęczne
  2. Wolne
  3. Przestarzałe

Więc mówię od czego lepiej zacząć zabawę w grafikę niż graph.

0
pelsta napisał(a)

Skoro bitmapa ma rozmiar 10x10 to dlaczego robisz pętle

For x := 10 downto 0 Do // Pętla dla x
  For y := 0 to 10 Do // Pętla dla y

A tak w ogóle to po co kombinujesz a nie wczytujesz bitmapy ze strumienia?

Mój błąd, bitmapa ma 11x11 pikseli i pętle sa poprawne.

PNiszczyciel : Array[1..3,0..99,0..99] of ^Byte;

Facepalm. Nie dość że robisz okrutną tablicę, to jeszcze sadystycznie robisz ^Byte co powoduje że wszystko zabiera 5x więcej.

wiem że to co tam napisałem niektórych przyprawi o palpitacje serca ale od czegoś trzeba zacząć

Problem w tym że zaczynasz nie od tej strony, czyli bazujesz się na czasach DOSa.

Z pascalem zaczynałem 12 lat temu oczywiście na Turbo Pascalu. Trochę podziubałem i przestałem. Teraz dokształcam się i chce zrobić dyplom technika informatyka i w szkole mam programowanie, a że zawsze lubiłem programować to teraz do tego wróciłem no i programuję tak jak pamiętam, a pamiętam przestarzałego Turbo Pascala 7.0.

Polecam zacząć od nowa z tym:
http://wiki.lazarus.freepascal.org/OpenGL_Tutorial - Jak ograniesz OpenGL to ani 3D ani 2D ci nie będzie straszne i nie będziesz musiał się przejmować wczytywaniem BMP...

Ech no cóż. To biorę się za naukę opengl. Pytanie: Są jakieś sensowne poradniki i tutoriale po polsku (Nie to że angielski mi przeszkadza ale jednak wole język ojczysty)? Ale mimo wszystko chciałbym się dowiedzieć czemu jedna bitmapa wczytuje się dobrze a druga nie.

0

Są jakieś sensowne poradniki i tutoriale po polsku?

Jak już pr0 powiedzieli nie raz: Nie bierz się za programowanie jeżeli nie znasz angielskiego bo nie uciągniesz. Ja polecam czytać to i szkolić się w angielskim (sam tak robiłem). Będziesz mieć dostęp do jednego z niewielu tutków pod Lazarusa i mniej problemów z czytaniem w przyszłości.
Możesz pogogolować o polskich tutkach i je lekko uzupełniać tym co dałem, ale generalnie mówiąc, kiedyś i tak dotrzesz do takich materiałów dostępnych tylko w ang. Więc jest to obejście problemów.

0

Ja wiem że tutki po angielsku lepsze i to mi nie przeszkadza. Po angielsku się dogadam ale w takich tutkach jest dużo fachowych pojęć więc dopóki nie poznam w miarę dobrze fachowego języka wole czytać po polsku a czego nie ma w polskich tutkach szukać po angielsku. Z samych angielskich tutkow też się nauczę tylko trochę dłużej mi zejdzie. (W końcu Turbo Pascala douczałem się z wbudowanego helpa po przerobieniu książki po polsku).

@Edit
Ktoś wie czemu ta bitmapa się źle wczytuje?

@EDIT2
Dobra problem rozwiązałem :P powiększyłem bitmapę do 12x12 pikseli a zostawiłem wczytywanie 11x11 i działa xD

0

A czy tego:

Begin
  Read (BitMap,Color); // Odczyt koloru z bitmapy
  PMina[1,x,y]^ := Color; // Wpisanie koloru do tablicy
end;

nie możesz zamienić na to:

Read(BitMap, PMina[1, X, Y]^);

?

Nie mam TP i wole nie mieć, ale powinno działać (ewentualnie małe rzutowanie);

0
Furious Programming napisał(a)

A czy tego:

Begin
  Read (BitMap,Color); // Odczyt koloru z bitmapy
  PMina[1,x,y]^ := Color; // Wpisanie koloru do tablicy
end;

nie możesz zamienić na to:

Read(BitMap, PMina[1, X, Y]^);

?

Nie mam TP i wole nie mieć, ale powinno działać (ewentualnie małe rzutowanie);

O popatrz dziwne że sam wcześniej na to nie wpadłem :P Dzięki na pewno wykorzystam :)

0

Jeszcze jedna sprawa:

Close (Bitmap); // Zamkniecie pliku

Procedury Close już się nie używa, jest zachowana tylko ze względów kompatybilności; Korzystaj z CloseFile; To samo tyczy się Assign - zmień ją na AssignFile;


Poza tym cały kod wczytujący bitmap'ę powinien znaleźć się w bloku try .. finally .. end:

AssignFile(Bmp, 'models\MinaLand.bmp');

try
  Reset(Bmp);
  Seek(Bmp, 1078);

  for x := 99 downto 0 do
    for y := 0 to 99 do
      Read(Bmp, PMina[1, X, Y]^);
finally
  CloseFile(Bmp);
end;
0

Ok dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1