Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Foto vom Irrlichtscreen in den Speicher ?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 17.10.2009, 11:26    Titel: Foto vom Irrlichtscreen in den Speicher ? Antworten mit Zitat

Hallo, unten mit dem Befehl kann ich ein Bild vom Irrlichtscreen ablegen als BMP.
Code:

If multikey( FB.SC_W ) Then   
    IrrDrawScene
    IrrSaveScreenShot("d:\test.bmp")
 End If


Nun möchte ich den Befehl irgendwie umleiten, das ich das Bild aus dem Speicher lesen kann.

So sieht die Declare aus von der Irrlicht.bi :
' save a screenshot out to a file
declare sub IrrSaveScreenShot CDECL alias "IrrSaveScreenShot" ( byval text as zstring ptr )

Wer kann da weiterhelfen?

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 17.10.2009, 11:45    Titel: Antworten mit Zitat

Mit dem Befehle geht's auf jeden Fall nicht. Da muss du dir mal die restlichen Deklarationen anschauen.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 17.10.2009, 13:13    Titel: Antworten mit Zitat

Wenn der Screen 18,32 aktiviert ist, kann ich mit der w-Taste ein : IrrSaveScreenShot("d:\test.bmp") machen. Das funktioniert.

Gruss

Code:

#include "IrrlichtWrapper.bi"
#include "fbgfx.bi"
USING FB

DIM MeshTexture as irr_texture
DIM TestNode as irr_node
DIM TestNode1 as irr_node
DIM OurCamera as irr_camera
Dim delta as single
DIM drehen as single
DIM drehe as single
Dim As Integer new_x, new_y

Screen 18,32
SCREENCONTROL SET_WINDOW_POS, 10,200

IrrStart( IRR_EDT_OPENGL, 400, 400, IRR_BITS_PER_PIXEL_32, _
        IRR_WINDOWED, IRR_NO_SHADOWS, IRR_CAPTURE_EVENTS )

IrrSetWindowCaption( "drehen-kindnodes" )

MeshTexture = IrrGetTexture( "./media/texture.jpg" )

TestNode = IrrAddTestSceneNode
IrrSetNodeMaterialTexture( TestNode, MeshTexture, 0 )
IrrSetNodeMaterialFlag( TestNode, IRR_EMF_LIGHTING, IRR_OFF )

TestNode1 = IrrAddTestSceneNode
IrrSetNodeMaterialTexture( TestNode1, MeshTexture, 0 )
IrrSetNodeMaterialFlag( TestNode1, IRR_EMF_LIGHTING, IRR_OFF )

OurCamera = IrrAddCamera( 0,0,-100, 0,0,0 )

IrrSetNodePosition( OurCamera, 10, 10, -35 )

IrrAddChildToParent( testnode1, testnode)
IrrSetNodePosition( testnode1, 0, 10, 0 )

WHILE IrrRunning
    Sleep 1
   
    IrrBeginScene( 255,255,0 )
   
    If multikey( FB.SC_W ) Then   
        IrrDrawScene
        IrrSaveScreenShot("d:\test.bmp")
    End If
   
    getmouse new_x, new_y
    drehe = drehe+new_x/5000
    drehen = drehen+new_y/5000
    Locate 1,1: print drehe
    Locate 2,1: print drehen

   IrrSetNoderotation( TestNode, 0,0,drehe)
   IrrSetNoderotation( TestNode1, drehen, 0,0 )
   
   IrrDrawScene
   IrrEndScene
Wend

IrrStop


Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 17.10.2009, 13:47    Titel: Antworten mit Zitat

Schau doch, ob es einen Befehl gibt, um an die Rohdaten zu kommen. Hier im Forum gibt's meines Wissens nach niemanden, der sich mit Irrlicht intensiv auseinander gesetzt hat. Da ist halt mal Eigeninitiative angesagt!
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 01.11.2009, 16:34    Titel: Antworten mit Zitat

So sieht der cpp-code aus, wurde mit Linux compiliert.
Ich weiss nicht, wie ich jetzt mit Freebasic ran komme?

Gruss
Code:

/* ----------------------------------------------------------------------------
save a screenshot out to a file
*/
void DLL_EXPORT IrrSaveScreenShot( const char * file )
{
   IImage* screenshot = driver->createScreenShot();
   if ( screenshot )
   {
      device->getVideoDriver()->writeImageToFile( screenshot, file );
      screenshot->drop();
   }
}


/* ////////////////////////////////////////////////////////////////////////////
all of the above functions are declared as C functions and are exposed without
any mangled names
*/
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 01.11.2009, 17:36    Titel: Antworten mit Zitat

Wie könnte man die Variable DIM pixels as uinteger ptr auslesen von:
pixels = IrrLockTexture( RenderTexture )
Es ist ja ein Zeiger wo irgendwie das Bild(Texture) drin ist.

Wer kann hier weiterhelfen?

Gruss

Code:

#include "IrrlichtWrapper.bi"

DIM MD2Mesh as irr_mesh
DIM MeshTexture as irr_texture
DIM RenderTexture as irr_texture
DIM TextureA as irr_texture
Dim TextureB as irr_texture
DIM SceneNode as irr_node
DIM CubeNode as irr_node
DIM StaticCamera as irr_camera
DIM FPSCamera as irr_camera
DIM pixels as uinteger ptr

IrrStart( IRR_EDT_OPENGL, 600, 300, IRR_BITS_PER_PIXEL_32, _
        IRR_WINDOWED, IRR_SHADOWS, IRR_IGNORE_EVENTS )

IrrSetWindowCaption( "Example 33: Rendering to a texture" )

IrrAddStaticText( "Zumlin model by Rowan 'Sumaleth' Crawford", 4,0,200,16, IRR_GUI_NO_BORDER, IRR_GUI_NO_WRAP )
MD2Mesh = IrrGetMesh( "./media/zumlin.md2" )


MeshTexture = IrrGetTexture( "./media/zumlin.pcx" )

RenderTexture = IrrCreateRenderTargetTexture ( 128, 128 )
TextureA = IrrGetTexture( "./media/Diagonal.bmp" )
TextureB = IrrCreateTexture( "merged", 128, 128, ECF_A8R8G8B8 )

SceneNode = IrrAddMeshToScene( MD2Mesh )

CubeNode = IrrAddCubeSceneNode( 30.0 )
IrrSetNodePosition( CubeNode, 0, 0, 100 )

IrrSetNodeMaterialTexture( SceneNode, MeshTexture, 0 )
IrrSetNodeMaterialTexture( CubeNode, RenderTexture, 0 )

IrrSetNodeMaterialFlag( SceneNode, IRR_EMF_LIGHTING, IRR_OFF )
IrrSetNodeMaterialFlag( CubeNode, IRR_EMF_LIGHTING, IRR_OFF )

IrrPlayNodeMD2Animation( SceneNode, IRR_EMAT_STAND )

StaticCamera = IrrAddCamera( 50,0,0, 0,0,0 )

FPSCamera = IrrAddFPSCamera
IrrSetNodePosition( FPSCamera, 40, 0, 110 )
IrrSetNodeRotation( FPSCamera, 160, -400.0, 0 )

IrrHideMouse

WHILE IrrRunning
   
    IrrSetActiveCamera ( StaticCamera )
    IrrDrawSceneToTexture ( RenderTexture )

    pixels = IrrLockTexture( RenderTexture )
    IrrBeginScene( 240, 255, 255 )
    IrrSetActiveCamera ( FPSCamera )
    IrrDrawScene
    IrrDrawGUI
    IrrEndScene
WEND

IrrStop
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 02.11.2009, 11:14    Titel: Antworten mit Zitat

@funkeld: Ich kenne mich mit irrlicht leider immer noch nicht aus, ABER: Bilder bzw. Bildpuffer haben in den meisten umsetzungen einen sehr ähnlichen aufbau. In der FBGFX gibts die "struktur" IMAGE. Sie zeigt einem den internen aufbau eines FBGFX-Bildpuffers.. da gibts (u.A) die breite, höhe, farbtiefe, pitch und dann den pixelbereich. (Dort bereichnet sich die position eines beliebigen Pixels innerhalb eines Bildpuffers nach p = pixdata + x + y * pitch)

Sowas ähnliches wird bei irrlicht bestimmt auch der Fall sein. Die Funktion IrrLockTexture() gibt dir einen Pointer auf eine Struktur wieder, die bestimmt immer den selben aufbau hat und mehr informationen enthält als die reinen pixel-daten.
Wie der Aufbau dieser Struktur genau ist und was er enthält kann ich dir leider nicht sagen. Da musst du mal in der Doku zu irrlicht stöbern!
Schau mal genau nach was IrrLockTexture zurückgibt!
Sollte da eine bestimmte Struktur dahinterstecken, musst du "pixels" mit dieser Struktur dimensionieren und nicht mit " uinteger ptr "

Ich glaub, wie du vielleicht gemerkt hast, richtige irrlicht experten wirst du hier eher nich finden... aber gute programmierer auf jeden fall zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 30.12.2009, 18:50    Titel: Antworten mit Zitat

Gibt es neue Erkenntnisse?
Ich komme einfach nicht weiter.

Vielleicht hat jemand eine Idee mit einem Pointer, den man dann irgendwie mit "Put" als Bild darstellen kann.

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
croco97



Anmeldungsdatum: 04.11.2005
Beiträge: 260

BeitragVerfasst am: 31.12.2009, 14:39    Titel: Antworten mit Zitat

Hi funkeld!

Ebenfalls keine Ahnung von Irrlicht. Aber nach den Vorabinfos: Das Heap-Image deines Screenshots steckt wohl in einem Bereich, auf den IImage ptr (Im C-Code: IImage*) zeigt.

Aufgabe 1: Den Pointer identifizieren und ansprechen können.

Aufgabe 2: Mach dir ein Testimage, nur zwei Farben (Schwarz-Weiss) und ein sehr regelmässiges Muster (z.B. Schachbrett, also immer eins schwarz, eins weiss....). Schaue perfekt planar mit der Kamera auf das Muster (in einer möglichst neutralen Szene, z.B. drumherum nur eine Farbe), wenn du den Screenshot machst. Lies dir dann den Image ptr-Bereich aus und schreibe ihn als Text (Spalte 1: Byte-Adresse, Spalte 2: Byte-Wert) in ein Textfile und schau, ob du das Schwarz/Weiss-Muster dort wiederfindest.

Wenn ja, kannst du dich Schritt für Schritt mit weiteren Testbildern an die Kodierung rantasten. Meistens ist die sehr einfach, also wie bei bmp-True-Color z.B.

Wenn nein, dann hast du Pech gehabt, dann ist das schon ein Kompressionsformat. Dann hilft nur noch Googeln, was das Zeug hält.

Aufgabe 3: Selbst eine Routine schreiben, die den IImage-Ptr-Bereich ausliest und ggf weiterverarbeitet.

VG!

Croco
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 31.12.2009, 18:23    Titel: Antworten mit Zitat

Vorerst muss ich sagen, dass ich mit Irrlicht bis jetzt noch nie was zu tun hatte - noch nicht einmal den Namen kannte.

Ich habe mir den Irrlicht Quellcode heruntergeladen und da die folgenden Funktion gefunden:
Code:
//! Returns an image created from the last rendered frame.
IImage* CD3D8Driver::createScreenShot()


Nun ist Irrlicht ja in C++ geschrieben. Gibts da eine Wrapper-Bibliothek für FB oder wie funktioniert das?
Denn auch Funktionen aus einer C++ DLL kann man ja meines Wissens von FB aus nicht zugreifen.

@funkeld: Ich mag mir jetzt nicht die Arbeit machen mich komplett in Irrlicht einzuarbeiten, aber wenn du eine Testumgebung hochlädst bin ich gerne bereit mir das anzuschauen (also ein minimales Beispielprogramm inkl. der benötigten Bibliotheken, Includes, Wrapper, usw. sodass ich es mit dem Standard FB 0.20 kompilieren kann).
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 31.12.2009, 18:38    Titel: Antworten mit Zitat

Ich würde gern eine Zip hochladen. Wie geht das hier?

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 31.12.2009, 19:14    Titel: Antworten mit Zitat

Übers Forum direkt funktioniert das nicht, aber du kannst die Datei auf einem Datei-Hoster hochladen und dann hier den Link hineinschreiben.

Wenn du keine Datei-Hoster kennst kannst du dir einen aussuchen: http://uploaded.to/ oder http://netload.in/ oder http://megaupload.com/ oder ...
Aber bitte tue mir (und ws den andern auch) einen Gefallen und lade es nicht auf Rapidshare hoch. Wenn man dort einen (kostenpflichtigen) Premium Account hat mags ja ganz OK sein, aber für alle die das nicht haben gibts neben ewigen Wartezeiten, starken Geschwindigkeitsbegrenzungen, etc. auch noch Zeiten, wo man überhaupt nichts herunterladen kann.
Die oben genannten sind ganz OK (zwar auch kurze Wartezeiten o.ä., aber nicht so starke Einschränkungen wie bei Rapidshare). Zum Hochladen / Herunterladen musst du dich übrigens nirgends registrieren oder anmelden.

@Foren-Admins: Wie wärs mit einem FAQ Eintrag zu dem Thema "Wie lade ich Programme / Bilder hoch?" (oder so ähnlich), denn da gibts immer wieder Fragen, die man immer wieder erneut beantworten muss.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 31.12.2009, 19:36    Titel: Antworten mit Zitat

Ich bin mir sicher, wenn es dazu einen FAQ-Eintrag gäbe, müsste man die Frage trotzdem immer wieder beantworten ...
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 31.12.2009, 19:57    Titel: Antworten mit Zitat

@nemored: Dass sich die wenigsten Benutzer einen FAQ Eintrag durchlesen (bzw. diesen überhaupt finden) *bevor* sie fragen wie es funktioniert ist unbestritten. Aber es würde das Beantworten vereinfachen. So würde ein Link auf den entsprechenden FAQ-Eintrag genügen, anstatt jedes Mal einen kleinen Text schreiben zu müssen.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 01.01.2010, 12:43    Titel: Antworten mit Zitat

Zitat:

Ich bin mir sicher, wenn es dazu einen FAQ-Eintrag gäbe, müsste man die Frage trotzdem immer wieder beantworten ...


Das glaube ich auch. Weil man als Neuling nicht weiss, welche Bande sich hinter dem Servern befindet.
Und auch evtl die Dateien verhökert werden können.

Fazit : Ich Traue nur empfohlenden Servern.


GRuss


Zuletzt bearbeitet von funkeld am 01.01.2010, 16:38, insgesamt 3-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 01.01.2010, 13:17    Titel: Antworten mit Zitat

http://ul.to/kq6bz7 ist die IrrlichtWrapper.zip

Die "drehen-kindnodes.bas" kannst du sofort mit Freebasic 0.2 compilieren.

Wenn du mit der Maus auf dem linken Fenster klickst(aktivieren), kannste mit der Mausposition-xy auf dem Fenster die Drehung des Würfels im rechten Irrlichtfenster bestimmen.

Mit der Taste "w" kann man dann ein Bmp-Foto herstellen. Alle Datein von Irrlicht sind im Ordner zum verfolgen, was in Irrlciht drin ist.

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz