PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bilddateien einlesen


crazy23
03.04.2002, 14:51
Hallo, ich bin neu hier und habe mal eine Frage:
Wie kann ich Bilddateien in einem Pascal-Programm einlesen (z.B. BMP-Dateien)? Ich möchte ein Schachprogramm schreiben, will aber nicht die Figuren mit den Pascallbefehlen line etc. zeichnen. Habt ihr da eine Lösung parat?
Vielen Dank im Vorraus.


Patrik Graf
03.04.2002, 15:44
In ObjectPascal geht´s so:

Var Bitmap: TBitmap;
begin
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile(IrgentEinDateiname);
end;

Vieleicht hilft´s dir ja weiter...

Falls nicht, schau ich mal was ich machen kann...

Felix Kaiser
03.04.2002, 16:18
Wenn du die in Pascal einlesen willst, geht das einfach, musst aber das Format der Bitmap kennen. Der Header ist 58 Bytes groß. In dem findest du Höhe, Breite, Farbtiefe in Bit und noch einige andere Informationen. Kann dir ja mal die Struktur von dem Header raussuchen. Danach folgen bei 1-Bit, 4-Bit und 8-Bit Bitmaps die Palette. Das ist einfach ein Array mit LongInts der für z.B. ein 16-Farb Bitmap 16 LongInts enthält. Jedes LongInt enthält den 8-Bit Wert für Rot, Grün und Blau, eben eine RGB Palette. Bei 24 oder 32 Bit Bitmaps, also Echtfarben, folgt direkt nach dem Header das Bild. Bei den anderen erst nach der Palette. Das ist wiederum Zeile für Zeile gespeichert. Allerdings von unten nach oben (Microsoft Logik?). Die unterste Zeile ist eben zu erst gespeichert. Nun ist jede Zeile Pixel für Pixel aufgebaut. Bei 24-Bit Bitmaps besteht jedes Pixel aus 3 Bytes (Rot, Grün, Blau). Bei 32-Bit hat man einfach ein 0 Byte noch beigepackt, daher ist dann jedes Pixel 4 Byte groß. Bei 256-Farb Bitmaps ist jedes Byte ein Pixel. Den Farbcode entnimmst du der Farbpalette im Dateikopf. Bei 16-Farb Bitmaps ist jedes Byte eine Kompression aus 2 Pixels. Die unteren 4 Bits sind das erste Pixel, die oberen 4 Bits das zweite. Somit hast du den Farbindex (0 bis 15) und entnimmst den Farbcode ebenfalls der Palette. Bei Monochrom Bitmaps (1 Bit) entspricht jedes Pit einem Pixel. Ein Byte enthält folglich 8 Pixel. Bit gesetzt = Farbwert 1, nicht gesetzt = Farbwert 0. Welchem Farbcode das entspricht kannst du der Palette im Dateikopf entnehmen.

Alles klar? Dann viel Spaß mit Bitmaps unter Pascal! :)

crazy23
03.04.2002, 17:36
Oki, vielen Dank erstma für die Antworten - ich hab übrigens kein ObjectPascal.
Hat jemand zufällig n Stück funktionierenden Quelltext für normales Turbo Pascal 7.0, wo so ein Bild eingeladen wird (ich hab mir was gezogen, aber das funktioniert nicht)?
Wie immer, Danke im Vorraus =)

Diogenes
03.04.2002, 17:52
Was für ein Stück hast Du dir gezogen, wie Du schon so schön schreibst?

Guru hat das BMP-Format übrigens ganz nett beschrieben. Noch besser beschrieben ist es allerdings im Windows-API, Band 1, auf Seite 401.

Es gibt für die DOS-Versionen (TP) keine fertigen Routinen zum BMP lesen oder darstellen. Da wärst Du mit den Routinen aus der Graph wohl besser beraten...

freak182
05.09.2002, 09:56
gibt es keine einfachere möglichkeit bilder einzulesen?

@diogenes: von welchen routinen aus der graph.tpu redest du?

mfg,
timoK.

DerWolf
05.09.2002, 12:55
In Pascal gibt es keine fertigen Routinen für bmp's. Aber schreib dir doch einmal eine Routine und steck die in eine Unit und die kannste dann in jedem Programm benutzen. Außerdem isses ganz einfach :) musst dir aber bei komprimierten bitmaps aufpassen. Cu

freak182
05.09.2002, 13:24
danke erstmal. kann mir auch jmd sagen welche befehle ich dafür brauche? nur die befehle reichen mir schon. in die richtige reihenfolge versuche ich sie dann schon selbst zu bringen. ich frage nur damit ich einen anhaltspunkt habe wo ich anfangen kann...

mfg,
timoK.

Lord_Otter
05.09.2002, 14:28
Da musst du dir wohl Code selber schreiben.
Felix Kaiser hat dir erklärt, wie BMP-Dateien intern aufgebaut sind.
Du musst die mit BlockRead auslesen. Code habe ich leider nicht, aber ich kann dir welchen besorgen.
Ich werde mich mal nach Code umsehen und ihn hier posten.
Aber solange musst du dich noch gedulden...

freak182
05.09.2002, 14:58
jo, danke! wäre toll wenn du den code findest. aber sonst schaff ich den rest schon irgendwie. das von felix werde ich mir nochmal genau ansehen.

mfg,
timoK.

Lord_Otter
05.09.2002, 17:07
Falls ich es nicht finden sollte, kann ich dir aber auf jeden Fall Routinen geben, um PCX-Bilder zu laden.
Die hab' ich da.
Vielleicht reichen dir die ja.
Aber ich such noch mal.
Und zur Not kann werde ich nochmal selbst etwas basteln, was mit Felix' Beschreibung auch nicht das schwerigste ist (kann ich ja selbst gebrauchen ;) )

Lord_Otter
06.09.2002, 20:33
@Felix Kaiser:
OK, ich wollte jetzt eine lese-Routine schreiben, allerdings benötige ich dazu den Headeraufbau, den ich jetzt nicht weiß.
Kannst du mir einen Record basten ?
Etwa so ?

TBMPHeader = record
signatur: array[1..4]of char;
{ .... }
end;

An das mit dr Signatur kann ich mich noch schwach erinnern, glaube, das stimmt so.

DerWolf
07.09.2002, 14:41
TBMHeader = record
{BitmapFileHeader}
bfType: word; { $4D42 }
bfSize: longint;
res1, res2: word;
ImageOffset,
{BitmapInfoHeader}
biSize, { $28 }
width, height: longint;
Planes {1}, BitCount: word;
compression, SizeImage,
XPelsPerMeter, YPelsPerMeter,
ColorsUsed, ColorsImportant: longint;
farbe1, farbe2: longInt;
end;


Ihr müsst öfter mit google googlen :)
Hier is die Quelle wo ichs herhab:
http://www.tu-ilmenau.de/~robertw/bwinf2/bitmap.htm

Lord_Otter
07.09.2002, 21:27
Ah, hab' mich wohl geirrt, danke.
Darin steht ja auch eine Laderoutine...

Poison Nuke
31.10.2002, 20:01
in dem von Der_Wolf geposteten Link ist für mich leider nicht durchsichtig, wie die eingelesene BMP intern gespeichert und dann auch wieder ausgegeben wird...

denn ich möchte in einem Programm ein Routine einbauen, die eine BMP einliest (das funktioniert auch) und diese dann auf dem Monitor ausgibt. Die bisherige Ausgabe mit putpixel() ist extrem langsam, also würde ich es gerne per putimage machen, weiß aber nicht, wie ich (wegen der ungewöhnlichen Struktur einer BMP) die Daten für putimage() gerecht aufnehemen soll.

Kann mir da jmd. einen Ansatz bitte geben?

Felix Kaiser
01.11.2002, 11:20
Ich kenne die Struktur die PutImage jetzt nicht genau, aber wie ein Bitmap aufgebaut ist, weiß man fix. Wenn man den Header eingelesen hat (Headerstruktur sollte bekannt sein, ggf. Dr.Google fragen) kann man einfach die Pixeldaten einlesen und in einem Array speichern, wobei 256 Farbbitmaps am optimalsten sind, da jedes Pixel ein Byte ist (RGB Farben für Palette folgen dem Header!). Dann sollte man nur noch beachten, dass ein Bitmap von hinten nach vorne gespeichert ist, wie genau weiß ich aus dem Kopf nicht mehr, sieht man aber recht schnell, wenn man sich den Array mal auf den Bildschirm wirft (Move?).

Poison Nuke
01.11.2002, 14:06
hi, danke für deine Antwort.

Das mit dem blöden Aufbau ist mir bekannt, da ich ihn beim Bildaufbau mit putpixel() genau verfolgen konnte.

Nur das Problem liegt halt darin, das ich nicht weiß, wie ich die BMP-Daten in den Speicherbereich von putimage übertrage....

Diogenes
02.11.2002, 16:58
Ich glaube (weiß es aber nicht!), GetImage und PutImage benutzen Speicherauszüge.