Bitmap aus Ressourcen auf Festplatte kopieren



  • Wie im Titel beschrieben möchte ich ein Bitmap das
    mit IDB_BITMAP1 bezeichnet ist auf "c:\\bilder" kopieren.

    Ich kenne mich leider mit dem Kopieren noch nicht so sonderlich aus.
    Mein Ansatz war daher zunächst CopyFile, was aber scheinbar nicht mit
    einer Ressource geht. 🙄

    Wie bekomme ich das IDB_BITMAP1 nun am einfachsten aus meiner
    Anwendung auf c: ?



  • Hi,

    wenn du das Handle mit LoadResource hast, dann rufst du LockResource auf und hast nun Zugriff auf den Entsprechenden Speicher, den du auf die Platte schreiben kannst.



  • Ich habe es nun mal mit diesem Code probiert, jedoch ist die
    Datei immer 0 kb groß. Wird also nicht wirklich geschrieben.

    HINSTANCE hApp = ::GetModuleHandle(0); 
    ASSERT(hApp); 
    
    HRSRC hResInfo; 
    hResInfo = ::FindResource(hApp,MAKEINTRESOURCE(IDB_BITMAP1),TEXT("Bitmap")); 
    HGLOBAL hRes = ::LoadResource(hApp, hResInfo);
    
    BYTE *PROG = (LPBYTE)::LockResource(hRes); 
    int PROG_SIZE = SizeofResource(hApp,hResInfo);
    
    CFile OutFile; 
    OutFile.Open("C:\\testbild.BMP",OF_CREATE|OF_WRITE,NULL); 
    OutFile.Write(PROG,PROG_SIZE); 
    OutFile.Close();
    


  • Der 3. Parameter von FindResource sieht mir komisch aus!?
    Nimm mal RT_BITMAP!

    Wie groß ist denn PROG_SIZE?



  • Hmm also PROG_SIZE ist immer 0.
    Habe das nochmal mit einem anderen Bitmap probiert das
    ich als IDB_BITMAP2 eingebunden habe. Auch null... 😕



  • Ich sehe noch imme rnicht durch wo das Problem bei dem Code liegt.
    IMHO ist doch alles richtig zugewiesen oder ?



  • Hast du denn meinen Hinweis mit dem 3. Parameter befolgt?



  • Hallo Sepp,

    ja den 3ten Paramter habe ich auf RT_BITMAP gesetzt.
    Es hat sich leider nichts weiter verändert.



  • Also bei mir gehts, wenn ich den 3. Parameter ändere.

    Vielleicht ist auch LoadBitmap/LoadImage ratsam.

    Aber auf jeden Fall geht das hier bei mir tadellos:

    HINSTANCE hApp = ::GetModuleHandle(0); 
    
    HRSRC hResInfo; 
    hResInfo = ::FindResource(hApp,MAKEINTRESOURCE(IDB_BITMAP1),RT_BITMAP); 
    HGLOBAL hRes = ::LoadResource(hApp, hResInfo);
    
    BYTE *PROG = (LPBYTE)::LockResource(hRes); 
    int PROG_SIZE = SizeofResource(hApp,hResInfo);
    


  • Ok, also ich habe been übersehen, dass die Datei nun zwar geschrieben wird
    und eine Größe von 285KB hat, was auch beim Original der Fall ist, allerdings
    kann ich diese Datei nicht öffnen e.g. mit Paint.
    Fehler: Die datei konnte nicht gelesen werden oder das Format wird nicht
    unterstützt ? Es ist aber als testbild.bmp auf c: ... 😕



  • Jo,

    ich habe es mir mal im HexEditor angeschaut.
    Es scheint, das Bitmap wird ohne BITMAPFILEHEADER geschrieben.

    Du musst also noch eine passende BITMAPFILEHEADER struct ausfüllen (Offset!!!), als erstes auf die Platte schreiben und dann gleich darauf die Daten schreiben.
    Dann sollte es passen.

    PS: Kann es sein, dass du ein wenig englischen Akzent hast? 😉



  • BITMAPFILEHEADER sagt mir absolut nichts.
    Kannst du mir hierbei etwas genauer beschreiben was
    ich machen soll ?

    Bzw. gibt es eine andere einfachere Möglichkeit die Ressource
    zu extrahieren ? Mit eine einfachen exe hat es mit obigem Code
    ohne Probleme funktioniert. 😞

    Diese Bitmaps bringen mich nochmal um 😃

    Gruß
    Mr. been 😃 😃



  • Ich hab doch geschrieben, dass du LoadBitmap/LoadImage nehmen sollst.
    Was BITMAPFILEHEADER betrifft: Habe ich alles in der MSDN gelesen, solltest du auch tun.


Anmelden zum Antworten