Bitmap aus Speicher in DirectDraw Surface laden



  • Hallo Leute,

    Ich möchte gerne eine Bild für Bild Animation machen. Und damit ich nicht so viele Dateien habe, habe ich mir ein Format geschrieben, in dem die Animationsbilder hintereinander weg gespeichert sind. In meinem Programm lade ich mir dann die Bilder in den Speicher, und sie dann in ein Surface zu laden.

    Doch um ein Bild zu laden, kenne ich nur folge Funktion : "DDLoadBitmap".

    Da mein Bild aber im Speicher ist, brauche ich eine Funktion, die das Bild aus dem Speicher läd.

    Kennt nun jemand so eine Funktion , mit der ich bilder direkt von Speicher in ein Surface laden kann?

    Gruß Jan

    [Edit]
    PS.: Ich hab schon bei google und in der MSDN nach mögleichen Funktionen gesucht, bin aber nicht fündig geworden.



  • Surface erstellen und Daten reinkopieren.

    Bye, TGGC (Wähle deine Helden)



  • Schau dir mal Surface->Lock{Rect} und Unlock{Rect} an.

    Besonderes Augenmerk auf den in der Struktur zurückgelieferten Pitch legen!



  • ok wenn ich das richtig verstanden habe, dann soll ich das im Speicher liegende Bitmapt in das Surface kopieren.
    Ich gehe mal davon aus, das die Surface codierung im Speicher so aussieht, das die Farbcodes pro Pixel im SPeicher einfach hintereinander gespeichert sind.
    Der "lPitch" , den ich von der Methode Lock bekomme, gibt mir an, wievil Bits ich pro Pixel habe.

    Wenn ich nun eine Pixelfarbe ändern möchte, dann mache ich also:

    ZeigerAufSurfaceData [ (lPicth * Spalte) + (dwLinearSize * Zeile) ] = Farbcode

    habe ich es soweit Richtig verstanden?



  • Nein, lies einfach nochmal genau die Doku. Viel Spass.

    Bye, TGGC (Ein Jahr Helden)



  • ok lPitch zeigt die Bytes pro Zeile an.

    wenn ich doch nun ein paar Pixel auf Weiss setzen will, ginge das doch so:

    DDSURFACEDESC2 data;
    
    	lpddsBack->Lock(0, &data, DDLOCK_WAIT, 0);  //Null = Alles Locken
    	BYTE * z = (BYTE*) data.lpSurface;
    	for(int i = 0; i < 100; i++)
    	{
    		*z = 255;
    		z ++;
    	}
    	lpddsBack->Unlock(0);
    

    doch dabei stürtzt mein Programm ab, was ist daran Falsch?

    [Edit]
    Er kann den Backbuffer nicht SPerren? aber warum?



  • Weil "Der BackBuffer is ja ne ganz normale Surface"... 😎

    Bye, TGGC (Ein Jahr Helden)



  • also andere Surfaces kann ich so auch nicht Locken.

    Ich hab das nochmal mit dem hier getestet:

    //Surface "LPDIRECTDRAWSURFACE7	test" wurde global erstellt
    	memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
        ddsd.dwSize = sizeof(DDSURFACEDESC2);
        ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH ;
        ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |DDSCAPS_SYSTEMMEMORY;
        ddsd.ddsCaps.dwCaps2 = 0;
        ddsd.dwHeight = 200; 
        ddsd.dwWidth = 200;  
    
    	lpDirectDraw->CreateSurface( & ddsd, & test,0);
    
    	DDSURFACEDESC2 data;
    	RECT r;
    	SetRect(&r, 0, 0, 200, 200); 
    
    	if( test->Lock(&r, &data, DDLOCK_WAIT, 0) == DD_OK)
    	{
    		BYTE * z = (BYTE*) data.lpSurface;
    		for(int i = 0; i < 100; i++)
    		{
    			*z = 100;
    			z ++;
    		}
    		test->Unlock(&r);
    	}
    

    das muss an etwas anderem liegen, jemand eine Ahnung an was?



  • TGGC warum sagst nicht einfach die Antwort? 😃



  • Wenn du mir 100€ und deinen Code schickst, dann könnte ich es dir debuggen.

    Bye, TGGC (Wähle deine Helden)



  • Wenn du mir 100€ und deinen Code schickst, dann könnte ich es dir debuggen.
    Bye, TGGC (Wähle deine Helden)

    Ich möchte dies nur festhalten, bevor TGGC es editiert. 👎



  • Ich gehöre nicht zu den Leuten, die nachträglich etwas rauseditieren.

    Bye, TGGC (Wähle deine Helden)



  • TGGC schrieb:

    Weil "Der BackBuffer is ja ne ganz normale Surface"... 😎

    Besser ne späte Einsicht als garkeine. 👍



  • TGGC, ich poste Threads in dieses Forum, weil ich ein Problem habe und mir erhoffe von euere Erfahrung profitieren zu können.
    Ich bin dir und auch jeden anderem sehr dankbar der sich die Mühe macht, über mein Problem nachzudenken.
    Doch um eines möchte bitten, wenn du etwas mitzuteilen hast, dann mach es doch bitte nicht in einer herablassenden Art, sondern in einer vernüpftigen Weise, mit der jener Hilfsbedürftige etwas anfangen kann. Denn solltest du irgtentwann einmal ein Problem haben, so möchtest du bestimmt auch nicht solche Antworten hören.
    Solltest du demnächst nichts vernüpftigen zu sagen haben, so sage bitte gar nichts, denn niemand zwingt dich zu einer Antwort.
    Damit du mich nicht Falsch verstehst, ich bin dir und jedem anderen sehr dankbar, über die Hilfestellung die mir gegenüber geleistet wird.

    Gruß Jan



  • Das hat man davon, wenn man sich hearblässt und Hilfe anbietet.

    Bye, TGGC (Wähle deine Helden)



  • Back buffer surfaces, which may be accessed using the
    IDirect3DDevice9::GetBackBuffer and IDirect3DSwapChain9::GetBackBuffer
    methods, may be locked only if the swap chain was created with the Flags
    member of the D3DPRESENT_PARAMETERS structure set to include
    D3DPRESENTFLAG_LOCKABLE_BACKBUFFER.

    Hehe 😃



  • Das hat man davon, wenn man sich hearblässt und Hilfe anbietet.

    👎 ⚠



  • Erhard Henkes schrieb:

    Das hat man davon, wenn man sich hearblässt und Hilfe anbietet.

    👎 ⚠

    Sehe ich auch so.
    Wer es als Herablassung empfindet, anderen zu helfen, ist in diesem Forum falsch.
    Und nicht nur hier.

    Komische Einstellung. 🙄



  • SeppSchrot schrieb:

    Wer es als Herablassung empfindet, anderen zu helfen, ist in diesem Forum falsch.

    Also Chill0r, geh hier weg. Du bist falsch. Es ist nämlich garnicht herablassend, wenn ich dir helfen will!

    Bye, TGGC (Wähle deine Helden)



  • Schon arm, dass du mehr Meta-Diskussionen auslöst als Fragen konkret beantwortest.


Anmelden zum Antworten