Satyria

Bilder anzeigen und speichern

In diesem Kapitel möchte ich ein Bild anzeigen lassen. Als Grundprogramm verwenden wird den Sourcecode „2.5.c„.

Da wir bereits ein Fenster anzeigen lassen konnten, werden wir dies nun einfach mit der Anzeige eines Bildes erweitern. Es gibt hierzu eine zusätzliche Bibliothek, SDL_Image, die wir dazu verwenden werden.
SDL selbst benötigt dazu einen Renderer. Dies ist eine Struktur, die viele Informationen über das Bild enthält, die SDL intern benötigt. Diese hängt an dem Fenster, welches wir erzeugt haben. Da wir diese Struktur später für vieles brauchen, legen wir dies global an. Das gleiche machen wir auch für das Bild, welches wir anzeigen möchten. Dieses wird allerdings in eine Texture abgelegt

Während der Initialisierung müssen wir noch ein paar Dinge tun. Zunächst initialisieren wir SDL_Image, da wir ein Bild laden wollen und diese Bibliothek uns hier in vieler Hinsicht unterstützt. Dies machen wir direkt nach der SDL-Initialisierung.

Damit der entsprechende Renderer da ist, müssen wir ihn mit CreateRender() mit Bezug auf unser Fenster erstellen.

Damit haben wir schon das System soweit vorbereitet und kommen auf das laden des Bildes.
Dazu erstellen wir zunächst eine neue Funktion „LadeBild“. In dieser Funktion laden wir das Bild mit der Funktion IMG_LoadTexture() und geben ihr das Ziel (bild) mit den Infos aus renderer und den Dateinamen an. Wenn es nicht funktioniert hat, wird NULL zurückgegeben und wir geben eine Fehlermeldung raus.

Kommen wir nun zum main(). Nach der Initialisierung laden wir zunächst das Bild. Danach wird es mit SDL_RenderCopy in den renderer kopiert und mit SDL_RenderPresent angezeigt. Das war es schon.

Sourcecode: 3.c
Bild: blume.png

Das Kompilieren des Programms

Da wir nun hier eine neue Bibliothek verwenden, müssen wir es beim Kompilieren auch angeben, dass es so ist. Dies wird mit diesem Aufruf gemacht:

gcc -o 5.exe 5.c -Ic:/msys64/mingw64/include -Lc:/msys64/mingw64/lib -lmsys-2.0 -lSDL2_image -lSDL2main -lSDL2 -mwindows

oder hier 32-Bit:

gcc -o 5.exe 5.c -Ic:/msys32/mingw32/include -Lc:/msys32/mingw32/lib -lmsys-2.0 -lSDL2_image -lSDL2main -lSDL2 -mwindows

Übrigens: Jetzt können Bilder in den Formaten: GIF, JPG, LBM, PCX, PNG, PNM, TGA, TIF, XCF, XPM und XV mit den entsprechenden Funktionen geladen werden.

Das Speichern eines Bildes

Da SDL eigentlich für die Programmierung von Spielen erstellt wurde, gibt es von SDL selbst nur ein speichern in unkomprimierten BMP-Format. SDL_Image bietet hier mehr Formate an, welches ich hier mal beschreibe. Nachteil ist immer der, dass es nur „Screenshots“ sind und wenig mit Grafikprogrammen zu tun hat. Aber wenigstens gibt es dazu einen Weg.

Wenn wir die Funktionen „IMG_Save…“ anschauen, benötigen wir ein surface. Dies ist eine alte Methode, die unter SDL1 Verwendung fand. SDL2 unterstützt es weiterhin, aber hier im Kurs haben wir nur Renderer und Texturen benutzt. Also brauchen wir ein Surface, auf dem die Pixel des Bildes abgelegt sind. Zunächst erzeugen wir mit SDL_CreateRGBSurfaceWithFormat ein entsprechendes Surface, welches unserem Fenster entspricht. Danach kopieren wir die Daten aus dem Renderer in dieses Surface mit SDL_RenderReadPixels. Jetzt sind die Daten dort, wo wir sie auch brauchen und können es mit z.B. IMG_SavePNG abspeichern.

Sourcecode: 3.5.c
Bild: blume.png

Als JPG speichern

Auch hier werden wir von SDL_Image unterstützt und wir verwenden die Funktion IMG_SaveJPG. Diese können wir einfach für IMG_SavePNG ersetzen. Allerdings wird hier ein weiterer Parameter übergeben, der die Komprimierung angibt. Dieser bedeutet bei einem Wert von 100, keine Komprimierung und je kleiner der Wert wird, um so höher wird sie. Allerdings verliert das Bild seine Qualität.

Sourcecode: 3.6.c
Bild: blume.png

<< Übersicht | < Das erste Programm | Zeichnen >