Code-Beispiel
BMP-Bilder komfortabel laden und anzeigen
Screenshot ShowBMP-Beispiel
Dieses Code-Beispiel demonstriert, wie sich Bitmap-Bilder (BMP-Format) auf einfachem Wege in eigenen FreeBASIC-Programmen anzeigen lassen.
Um den Code in eigenen Programmen zu verwenden, muss lediglich das Unterprogramm bzw. die SUB ShowBMP in den eigenen Quelltext hineinkopiert werden. Der Aufruf des Unterprogramms erfolgt dann so, wie am Anfang des Code-Beispiels dargestellt (die drei Zeilen mit pizza.bmp usw.).
Wichtig: Damit das Code-Beispiel bei Ihnen funktioniert, müssen Sie zunächst die Beispielbilder herunterladen, die das Programm dann anzeigen soll. Sie finden die Dateien am Ende der Seite (bitte herunterscrollen). Speichern Sie die BMP-Dateien unbedingt im gleichen Verzeichnis, in dem auch Ihre BAS- und EXE-Dateien liegen.
Komplettes Code-Beispiel:
'Beispielprogramm zum komfortablen Laden und Anzeigen von BMP-/Bitmap-Bildern
'in FreeBASIC. Getestet mit FreeBASIC 0.23.0. (28.04.2012)
Declare Sub ShowBMP (ByVal x As Integer, ByVal y As Integer, Dateiname As String)
ScreenRes 800, 600, 24 'Grafikfenster der Groesse 800x600
WindowTitle "Fast Food" 'Benutzerdefinierter Titel des Fensters
Line (0,0)-(799,599), &HFFFFFF, BF 'Kompletten Bildschirm weiss malen
ShowBMP ( 50, 55, "pizza.bmp")
ShowBMP (295, 190, "hamburger-menu.bmp")
ShowBMP (560, 425, "bratwurst.bmp")
Sleep
End
'Bild aus der angegebenen Datei laden und auf dem Bildschirm an den Koordinaten (x,y) anzeigen
Sub ShowBMP (ByVal x As Integer, ByVal y As Integer, Dateiname As String)
Dim As Integer breite, hoehe 'Abmessungen des Bildes
Dim As Integer ff = Freefile 'Dateihandle
Open Dateiname For Binary As #ff 'Datei oeffnen
If (Lof(ff) < 32) Then 'Ist die Datei vielleicht viel zu kurz, als dass sie eine gueltige
'BMP-Datei sein koennte? Wenn ja, dann koennten wir gleich naemlich nicht
'die Header-Daten zu Breite und Hoehe fehlerfrei einlesen!
Close #ff 'Wenn dies hier ausgefuehrt wird, war die Datei zu kurz und wird wieder geschlossen.
Exit Sub 'Schliesslich Prozedur verlassen.
End If
Get #ff, 19, breite 'Breite aus der BMP-Datei auslesen
Get #ff, 23, hoehe 'Höhe aus der BMP-Datei auslesen
Close #ff 'Datei schliessen
hoehe = ABS(hoehe) 'Die Höhe kann in bestimmten Fällen auch als negative Zahl
'gespeichert sein. Daher bilden wir zunaechst den Betrag, d.h.
'"schneiden" ein etwaiges Vorzeichen ab.
'Bilder mit ungueltigen/exorbitanten Abmessungen im Header sind vermutlich
'defekt bzw. sowieso zu gross fuer gaengige Bildschirme.
If ((breite < 0) OR (breite > 2000) OR (hoehe > 2000)) Then Exit Sub
'Kommentarzeichen vor der folgenden Zeile kann zu Debugging-Zwecken entfernt werden:
'Print Dateiname & " (" & breite & "x" & hoehe & ")"
Dim bild As Any Ptr 'Zeiger erstellen, der die Bildadresse speichert
bild = ImageCreate(breite,hoehe) 'Berechnen und Reservieren des erforderlichen Speichers
Bload dateiname, bild 'Bilddaten aus der Datei in den Speicher laden
Put (x,y), bild, pset 'Das geladene Bild ab Position (x, y) im Fenster anzeigen
If (bild <> 0) Then ImageDestroy bild 'Speicher wieder freigeben
End Sub
Die SUB ShowBMP kann im Programm mit folgenden Parametern aufgerufen werden:
ShowBMP ( XKoordinate, YKoordinate, Dateiname )
Im Folgenden der Code des Unterprogramms zum Herauskopieren (ohne Beispiel "drumherum"):
'Bild aus der angegebenen Datei laden und auf dem Bildschirm an den Koordinaten (x,y) anzeigen
Sub ShowBMP (ByVal x As Integer, ByVal y As Integer, Dateiname As String)
Dim As Integer breite, hoehe 'Abmessungen des Bildes
Dim As Integer ff = Freefile 'Dateihandle
Open Dateiname For Binary As #ff 'Datei oeffnen
If (Lof(ff) < 32) Then 'Ist die Datei vielleicht viel zu kurz, als dass sie eine gueltige
'BMP-Datei sein koennte? Wenn ja, dann koennten wir gleich naemlich nicht
'die Header-Daten zu Breite und Hoehe fehlerfrei einlesen!
Close #ff 'Wenn dies hier ausgefuehrt wird, war die Datei zu kurz und wird wieder geschlossen.
Exit Sub 'Schliesslich Prozedur verlassen.
End If
Get #ff, 19, breite 'Breite aus der BMP-Datei auslesen
Get #ff, 23, hoehe 'Höhe aus der BMP-Datei auslesen
Close #ff 'Datei schliessen
hoehe = ABS(hoehe) 'Die Höhe kann in bestimmten Fällen auch als negative Zahl
'gespeichert sein. Daher bilden wir zunaechst den Betrag, d.h.
'"schneiden" ein etwaiges Vorzeichen ab.
'Bilder mit ungueltigen/exorbitanten Abmessungen im Header sind vermutlich
'defekt bzw. sowieso zu gross fuer gaengige Bildschirme.
If ((breite < 0) OR (breite > 2000) OR (hoehe > 2000)) Then Exit Sub
'Kommentarzeichen vor der folgenden Zeile kann zu Debugging-Zwecken entfernt werden:
'Print Dateiname & " (" & breite & "x" & hoehe & ")"
Dim bild As Any Ptr 'Zeiger erstellen, der die Bildadresse speichert
bild = ImageCreate(breite,hoehe) 'Berechnen und Reservieren des erforderlichen Speichers
Bload dateiname, bild 'Bilddaten aus der Datei in den Speicher laden
Put (x,y), bild, pset 'Das geladene Bild ab Position (x, y) im Fenster anzeigen
If (bild <> 0) Then ImageDestroy bild 'Speicher wieder freigeben
End Sub
Bitte beachten Sie, dass das Bild bei jedem Aufruf der SUB erneut aus der Datei, also von der Festplatte, geladen wird, wenn Sie es während der Programmausführung mehrmals anzeigen lassen. Bei performance-kritischen Anwendungen (z.B. bei Spielen) sollte das Bild stattdessen im Arbeitsspeicher verbleiben und mehrfach wiederverwendet werden, statt es immer wieder neu einzulesen.
Hinweis: Die Bilddateien, die im Beispiel oben benutzt werden, wurden von OpenClipart.org bezogen und stehen unter der CC0-PD-Lizenz zur Verfügung. Sie wurden vom Nutzer gnokii erstellt (Bsp.: hamburger-menu.svg). Im Folgenden können Sie alle drei Bilder als Bitmap-Dateien herunterladen:
Attachments zum Code-Beispiel |
---|
|
Zusätzliche Informationen und Funktionen |
- Das Code-Beispiel wurde am 28.04.2012 von Sebastian angelegt.
- Die aktuellste Version wurde am 28.04.2012 von Sebastian gespeichert.
|
|