Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [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

Screenshots vom OpenGL-Fenster erstellen (und mit FreeImage speichern)

von MitglieddarkinsanitySeite 1 von 1

Hi, willkommen zu meinem sehr kleinen Tutorial. Ich werde euch hier erklären, wie ihr Screenshots eures OpenGL-Fensters erstellen und mit FreeImage speichern könnt.

An dieser Stelle auch ein großes Danke an volta, der mich auf eine Optimierungsmöglichkeit hingewiesen hat.

Warum wir hier FreeImage verwenden? Nunja, es ist eine prima Library. Sie unterstützt unzälige Formate, daher setze ich sie in meinen Programmen zum Laden von Texturen ein. Und wenn man sie schonmal eingebunden hat, kann man sie auch gleich zum Speichern verwenden, so muss man sich auch nicht selbst um das Format kümmern.
Der einzige Nachteil ist, dass die etwas große "FreeImage.dll" mitgeliefert werden muss.

Das erstellen des Screenshots ist ganz einfach, wenn man mal weiß wie es geht. Wir gehen folgendermaßen vor:
1. Wir lassen FreeImage ein neues Bild erstellen
2. Wir holen uns den Pointer auf den FreeImage-Bild-Puffer
3. Wir lesen den Inhalt des Fensters aus und speichern den Inhalt an der Stelle an die der Pointer zeigt
5. Wir speichern das FreeImage-Bild ab und geben den FreeImage-Puffer frei

Und hier kommt der Code:

#INCLUDE ONCE "FreeImage.bi"

sub TakeScreenshot (filename as STRING)
   dim bitmap as FiBitmap ptr
   dim FiDataPointer as any ptr

   bitmap = FreeImage_Allocate(xres, yres, bits) '// Bild erstellen
   FiDataPointer = FreeImage_GetBits(bitmap)   '// Pointer auf Bilddaten holen

   glReadPixels(0, 0, xres, yres, GL_BGRA, GL_UNSIGNED_BYTE, FiDataPointer) '// Pixel auslesen

   FreeImage_Save(FIF_PNG, bitmap, strptr(filename), PNG_DEFAULT) '// Bild als PNG speichern
   FreeImage_Unload(bitmap) '// Bild zerstören
end sub

So, wie man erkennen kann speichern wir hier als PNG. Das ist ein gutes Format, denn es ist komprimiert, aber ohne Qualitätsverlust.
Im Beispiel sind "xres", "yres" und "bits" globale integer-Variablen, die die Breite, Höhe und die Bits des Fensters beinhalten.

Das wars auch schon.
Euer darkinsanity

 

Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 04.08.2009 von Mitglieddarkinsanity angelegt.
  • Die aktuellste Version wurde am 12.07.2010 von Mitglieddarkinsanity gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen