Buchempfehlung
MySQL kurz & gut
MySQL kurz & gut
Das preiswerte Taschen- buch stellt MySQL-rele- vante Inhalte systematisch und knapp dar, sodass es sich optimal zum Nach- schlagen beim Pro- grammieren eignet. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

PNG-Bilder anzeigen und speichern

von RedakteurVoltaSeite 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.

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  5  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 19.09.2007 von RedakteurVolta angelegt.
  • Die aktuellste Version wurde am 11.12.2013 von RedakteurSt_W gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen