Tutorial
Grafiken mit der FreeImage-Bibliothek laden
von csde_rats | Seite 1 von 2 |
In diesem Tutorial werde ich euch erklären, wie man mit FreeImage Grafiken laden und speichern kann.
Eins vorweg: FreeImage ist eine sehr sehr mächtige Bibliothek. Dieses kleine Tutorial kann nur einen sehr geringen Teil der möglichen Aspekte beleuchten.
Zuerst einmal wollen wir FreeImage einbinden:
#include "FreeImage.bi"
#include "crt.bi"
Die CRT-Erweiterung wird nur für die MemCpy-Funktion benötigt.
Um Bilder anzuzeigen und einen kompatiblen Puffer erzeugen zu können, muss zuerst der Bildschirm im 32-Bit-Modus initialisiert werden, zum Beispiel so:
ScreenRes 800, 600, 32
Mit der folgenden Funktion kann man fast jedes Bildformat einen FreeBASIC-Bildpuffer laden:
Function GetImage(Byval File As String, Format as integer, FormAttrib as integer) As Any Ptr
Dim Dib As FIBITMAP Ptr
Dim Dib32 as FIBITMAP Ptr
Dim SprWidth As Integer
Dim SprHeight As Integer
Dim Sprite As Any Ptr
Dim Bits As Any Ptr
' Bild laden:
Dib = FreeImage_Load(Format, File, FormAttrib)
' Wenn ein Fehler aufgetreten ist, hat der Device Context den Wert 0
If Dib = 0 Then Return 0
' Die Bilddaten werden von FreeImage auf den Kopf gestellt...
FreeImage_FlipVertical Dib
' Ab hier wird mit 32 Bit Farbtiefe gearbeitet
Dib32 = FreeImage_ConvertTo32Bits(Dib)
SprWidth = FreeImage_GetWidth(Dib32)
SprHeight = FreeImage_GetHeight(Dib32)
Sprite = ImageCreate(SprWidth, SprHeight)
Bits = FreeImage_GetBits(Dib32)
' Die Bilddaten kopieren...
MemCpy CPtr(Zstring Ptr, Sprite) + 32, Bits, SprWidth * SprHeight * 4
' Folgende Version mit alten FreeBASIC-Versionen oder -lang deprecated verwenden:
' MemCpy CPtr(Zstring Ptr, Sprite) + 4, Bits, SprWidth * SprHeight * 4
' Speicher wieder freigeben
FreeImage_Unload(Dib)
FreeImage_Unload(Dib32)
Return Sprite
End Function
Dazu gleich ein paar Beispiele:
#include "FreeImage.bi"
#include "crt.bi"
screenres 800, 600, 32
Declare Function GetImage(Byval File As String, Format As Integer, FormAttrib As Integer) As Any Ptr
Dim Pics(0 to 4) As Any Ptr
Pics(0) = GetImage("EinJPEG.jpg", FIF_JPEG, JPEG_DEFAULT)
Pics(1) = GetImage("EinPNG.png", FIF_PNG, PNG_DEFAULT)
Pics(2) = GetImage("EinTGA.tga", FIF_TARGA, TARGA_DEFAULT)
Pics(3) = GetImage("EinTIFF.tif", FIF_TIFF, TIFF_DEFAULT)
Pics(4) = GetImage("EinIcon.ico", FIF_ICO, ICO_DEFAULT)
For n As Integer = LBound(Pics) To UBound(Pics)
Cls
Put(0,0), Pics(n), PSet
Sleep
Next n
Um Schreibarbeit zu sparen, kann man den Ladevorgang auch in einem Makro ablegen:
#define GImage_JPG(Filename) GetImage(Filename, FIF_JPEG, JPEG_DEFAULT)
#define GImage_PNG(Filename) GetImage(Filename, FIF_PNG, PNG_DEFAULT)
#define GImage_TGA(Filename) GetImage(Filename, FIF_TARGA, TARGA_DEFAULT)
#define GImage_TIFF(Filename) GetImage(Filename, FIF_TIFF, TIFF_DEFAULT)
#define GImage_ICO(Filename) GetImage(Filename, FIF_ICO, ICO_DEFAULT)
Auf der nächsten Seite wird erklärt, wie man Bilder auch wieder abspeichert.
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|