speichern einer Bitmap - was fehlt?



  • Hallo,
    mit folgendem Code, zusammengesetzt aus dem was ich so in Tutorials gefunden habe, möchte ich ein CBitmap Objekt "m_bmpBitmap" in einer Datei speichern, aber etwas entscheidendes fehlt. Es läuft, speichert aber ein leeres (schwarzes) Bitmap der korrekten Größe in Pixeln ab obwohl vorher eine Bitmap eingeladen wurde, die sich auch anzeigen, manipulieren etc, lässt. Wahrscheinlich mache ich irgend einen ganz dummen Fehler bei der Übergabe von "hdc"; vermutlich sind die Zeilen 12 und 13 auch Nonsens?.
    Ich weiß auch, daß es schöne fertige Bibliotheken für sowas gibt, aber trotzdem würde ich gerne wissen was ich hier falsch mache.
    Vielleicht kann mir ja jemand aus dem Forum auf die Sprünge helfen.

    void CMainFrame::OnDateiBitmapspeichern() 
    {
    
       //m_bmpBitmap vom Typ CBitmap enthält die zu speichernde Bitmap
       BITMAP bm; 
       m_bmpBitmap.GetBitmap(&bm);
    
       int width = bm.bmWidth;
       int height = bm.bmHeight;
    
       HDC hdc;
       hdc = CreateCompatibleDC(hdc);
       SelectObject(hdc, m_bmpBitmap);
    
       char* filename;
       filename = "C:/temp/testsave.bmp";
    
       DC2Bitmap(hdc, width, height, filename);
    
    }
    
    int CMainFrame::DC2Bitmap(HDC hdc, int width, int height, char *filename)
    {
    
       HDC hdc2; 
       HBITMAP aBmp;
    
       BITMAPINFO bi; 
       HGDIOBJ OldObj; 
       void *dibvalues; 
       HANDLE fileHandle; 
    
       BITMAPFILEHEADER bmfh; 
       BITMAPINFOHEADER bmih; 
       DWORD bytes_write; 
       DWORD bytes_written; 
    
       hdc2=CreateCompatibleDC(hdc); 
    
       ZeroMemory(&bmih,sizeof(BITMAPINFOHEADER)); 
       bmih.biSize=sizeof(BITMAPINFOHEADER); 
       bmih.biHeight=height; 
       bmih.biWidth=width; 
       bmih.biPlanes=1; 
       bmih.biBitCount=24; 
       bmih.biCompression=BI_RGB; 
       bmih.biSizeImage = ((((bmih.biWidth * bmih.biBitCount) + 31) 
                               & ~31) >> 3) * bmih.biHeight; 
    
       bmih.biXPelsPerMeter = 0; 
       bmih.biYPelsPerMeter = 0; 
       bmih.biClrImportant = 0; 
    
       bi.bmiHeader=bmih; 
    
       aBmp=CreateDIBSection(hdc,&bi,DIB_RGB_COLORS,(void**)&dibvalues,0,0);
    
       if(aBmp==NULL) 
       { 
           OutputDebugString("CreateDIBSection failed!\n"); 
           return 0; 
       } 
    
       OldObj=SelectObject(hdc2,aBmp); 
       BitBlt(hdc2,0,0,width,height,hdc,0,0,SRCCOPY); 
    
       ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER)); 
       bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); 
       bmfh.bfSize=(3*bmih.biHeight*bmih.biWidth)+sizeof(BITMAPFILEHEADER) 
                                                 +sizeof(BITMAPINFOHEADER); 
    
       bmfh.bfType=0x4d42; 
       bmfh.bfReserved1 = 0; 
       bmfh.bfReserved2 = 0; 
    
       fileHandle=CreateFile(filename,GENERIC_READ|GENERIC_WRITE,(DWORD)0,NULL, 
                            CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL); 
    
       if (fileHandle==INVALID_HANDLE_VALUE) 
       { 
           OutputDebugString("CreateFile failed!\n"); 
           return 0; 
       } 
    
       bytes_write=sizeof(BITMAPFILEHEADER); 
    
       if (!WriteFile(fileHandle,(void*)&bmfh,bytes_write,&bytes_written,NULL)) 
       { 
           OutputDebugString("WriteFile failed!\n"); 
           return 0; 
       } 
    
       bytes_write=sizeof(BITMAPINFOHEADER); 
    
       if(!WriteFile(fileHandle,(void*)&bmih,bytes_write,&bytes_written,NULL)) 
       { 
            OutputDebugString("WriteFile failed!\n"); 
           return 0; 
       }     
    
       bytes_write=bmih.biSizeImage; 
    
       if(!WriteFile(fileHandle,(void*)dibvalues, 
                  bytes_write,&bytes_written,NULL)) 
       { 
           OutputDebugString("WriteFile failed!\n"); 
           return 0; 
       } 
    
       CloseHandle(fileHandle); 
    
       DeleteObject(SelectObject(hdc2,OldObj)); 
       DeleteDC(hdc2); 
       return 1; 
    }
    


  • Versuchs mal in einem anderes Unterforum. z.B Grafik/Spieleprogrammierung, oder auch das WinAPI Unterforum.



  • polaris schrieb:

    mit folgendem Code, zusammengesetzt aus dem was ich so in Tutorials gefunden habe,

    Programmieren bedeutet nicht, etwas mit Copy&Paste zusammenzufügen, sondern selber was tippen und verstehen was man macht.



  • Rolf Imo schrieb:

    polaris schrieb:

    mit folgendem Code, zusammengesetzt aus dem was ich so in Tutorials gefunden habe,

    Programmieren bedeutet nicht, etwas mit Copy&Paste zusammenzufügen, sondern selber was tippen und verstehen was man macht.

    ...und Antworten in Foren bedeutet zum Thema schreiben, nicht dumme Kommentare - ein altes Foren Problem.
    Ok, wenns einige beruhigt, 95% des Gesamtprojektes (eher mehr) stammen aus der papiernen Literatur, sind eigenhändig eingetippt und abgewandelt, und funktionieren, aber mit dem speichern einer Bitmap kam ich halt nicht weiter. Dazu, daß ich Anfänger bin, stehe ich.
    Rolf, ich bin auf Deine Lösung gespannt - oder weißt Du es selber nicht?



  • polaris schrieb:

    Rolf, ich bin auf Deine Lösung gespannt - oder weißt Du es selber nicht?

    Zweifelst du etwa an meinen Highendüberpro Skills? Na dann zeig ich dir jetzt mal wie das geht.... lol, n billigerer Trick fällt dir nicht ein, um an die Lösung zu kommen.

    PS: Wer ist Rolf



  • PPS: Lies mal Dokus dazu und benutz nen Debugger. Oder Google solang weiter bis du ne funktionierende Lösung findest. 🙄



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten