Tutorial
PNG-Bilder anzeigen und speichern
von Volta | Seite 3 von 5 |
Laden und anzeigen einer PNG-Grafik aus dem Speicherbereich.
Das Laden von PNG-Grafiken ist nicht viel anders als das Laden aus einer PNG-Datei.
Die Funktion png_load_mem läd eine PNG - Grafik aus dem Speicherbereich in ein Image.
Wie aber bekommt man eine PNG - Grafik in den Speicher?
Na, einfach Datei öffnen und in einen Buffer einlesen... ja aber dann kann ich doch gleich die Funktion png_load benutzen, die macht das selber.
Diese Funktion so zu nutzen macht wenig Sinn. Besser ist es die Grafik - Datei steckt schon beim Programmstart im Speicher, ist also als 'Resource' vorhanden.
Es gibt viele Möglichkeiten eine Binärdatei in ein Programm einzubinden.
Eine sehr einfache Methode, eine ganze PNG - Datei in unser Programm zu includen, bietet die Assembleranweisung '.incbin' .
Dazu brauchen wir für die Funktion png_load_mem noch einen Pointer auf den Anfang der Datei und die Dateilänge.
Mit einigen wenigen Asm - Befehlen ist das berechnet.
Dim As Any Ptr StartFile 'Pointer für den Anfang des Files
Dim As Uinteger LenFile 'Variable für die Länge des Files
Asm
.balign 16
jmp START_OF_PROG 'springe zum Label START_OF_PROG
.balign 4
START_OF_FILE: 'ab hier beginnt die eingebundene Datei
.incbin "./test.png"
END_OF_FILE: 'hier endet die eingebundene Datei
.balign 16
START_OF_PROG:
lea ebx, START_OF_FILE 'Lade die Adresse des Label START_OF_FILE nach ebx
mov dword Ptr [StartFile], ebx 'Speicher die Adresse im Pointer StartFile
lea eax, END_OF_FILE 'Lade die Adresse des Label END_OF_FILE nach eax
Sub eax, ebx 'berechne eax - ebx = Länge des Files
mov dword Ptr [LenFile], eax 'Speicher die Länge des Files in der Variablen LenFile
End Asm
#include "fbpng.bi" 'alle nötigen PNG-Routinen werden in unser Programm eingebunden.
Screen 18, 32 'erstellt ein Grafikfenster
Dim As Any Ptr img 'Pointer (Zeiger) auf das Image definieren
'die png_load_mem - Funktion benötigt 3 Angaben,
'einen Pointer auf den Anfang der Datei, die Dateilänge
'und ob das alte oder neue Imageformat benutzt wird.
img = png_load_mem( StartFile, LenFile, PNG_TARGET_FBNEW )
If img <> 0 Then 'wurde img eine Adresse mitgegeben?
Put( 0, 0 ), img 'ja, dann das Bild anzeigen
Deallocate( img ) 'den belegten Speicherbereich freigeben
Else
Print "Fehler beim laden der PNG-Grafik!"
End If
Dim As Integer hoch, breit 'damit fragen wir die Grafikgröße ab
png_dimensions_mem(StartFile, breit, hoch)
If breit > 0 And hoch > 0 Then
Print "Breite : "; breit; " Pixel"
Print "Hoehe : "; hoch; " Pixel"
Else
Print "Fehler, PNG-Datei beschaedigt oder nicht vorhanden!"
End If
Sleep
Wer sich über "./" vor dem Dateinamen wundert: unter ME verlangte der Linker nach der Pfadangabe für die Datei und unter XP stört es nicht (ist es nicht notwendig).
Hier habe ich auch gleich die Sub png_dimensions_mem mit eingebaut.
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|