CBitmap als bmp file speichern



  • hallo,

    zum laden von CBitmaps gibts ja direkt ne Memberfunktion... aber wie sieht es da mit dem speichern aus? hab ich das übersehen?

    danke schonmal

    mfg, TFTS



  • Yo also ich hab mir das ganz billig mal abkopiert, wa

    bool WriteBitmap(LPTSTR szFile, HBITMAP hbitmap, HDC memdc)
    {
    BITMAP  bmp;
      if(GetObject(hbitmap, sizeof(BITMAP), &bmp))
      {
        BITMAPINFOHEADER BmpInfoHdr;  //Struktur für Bitmap-Infoheader
        BITMAPFILEHEADER BmpFileHdr;  //Struktur für Bitmap-Dateiheader
        BmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER);
        BmpInfoHdr.biWidth = bmp.bmWidth;
        BmpInfoHdr.biHeight = bmp.bmHeight;
        BmpInfoHdr.biPlanes = bmp.bmPlanes;
        BmpInfoHdr.biBitCount = 24;
        BmpInfoHdr.biCompression    = BI_RGB;
        BmpInfoHdr.biSizeImage        = bmp.bmWidth*bmp.bmHeight*3;
        BmpFileHdr.bfType        = 0x4d42;
        BmpFileHdr.bfReserved1        = 0;
        BmpFileHdr.bfReserved2        = 0;
        BmpFileHdr.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
        BmpFileHdr.bfSize = BmpFileHdr.bfOffBits+BmpInfoHdr.biSizeImage;
    
        bmp.bmBits = (void*)GlobalAlloc(GMEM_FIXED, BmpInfoHdr.biSizeImage);
    
        if(GetDIBits(memdc, hbitmap, 0, BmpInfoHdr.biHeight, bmp.bmBits,
            (BITMAPINFO*)&BmpInfoHdr, DIB_RGB_COLORS) == BmpInfoHdr.biHeight)
        {
        HANDLE hFile = CreateFile(szFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL);
          if(hFile != INVALID_HANDLE_VALUE)  {
            DWORD dwTmp;
            WriteFile(hFile, &BmpFileHdr, sizeof(BITMAPFILEHEADER), &dwTmp, NULL);
            WriteFile(hFile, &BmpInfoHdr, sizeof(BITMAPINFOHEADER), &dwTmp, NULL);
            WriteFile(hFile, bmp.bmBits,  BmpInfoHdr.biSizeImage,   &dwTmp, NULL);
            }
          CloseHandle(hFile);
        }
        GlobalFree(bmp.bmBits);
        return TRUE;
      }
      return FALSE;
    }
    

    Der Aufruf den du dann zu tun hast, der gehet in etwa so!

    CBitmap bmpPicture <- ich will da rein (BILD)
    
    CFileDialog fdDialog(FALSE, ".bmp", NULL, 0, NULL);
    
    	if (IDOK == fdDialog.DoModal())
    	{
    		CString strPath = fdDialog.GetFileName();
    		CClientDC dc( this );
                    BITMAP bm;
                    bmpPicture.GetObject( sizeof( bm ), &bm );
                    CDC SpeicherDC;
                    SpeicherDC.CreateCompatibleDC( &dc );
                    SpeicherDC.SelectObject( &bmpPicture ); 
    		WriteBitmap(strPath.GetBuffer(MAX_PATH), bmpPicture,SpeicherDC );
    	}
    


  • Mit

    CBitmap bmpPicture;
    bmpPicture.LoadBitmap(IDB_BITMAP1);
    

    geht das ja wunderbar, aber wie kann man das mit
    einem Bitmapfile machen, das noch auf der Festplatte liegt?

    bmpPicture.LoadBitmap("c:\\test.bmp");
    

    ist ja nicht drin.



  • Niemand eine Idee?



  • ich dachte eigentlich bis vorhin dass es so geht wie du es beschrieben hast (bitmap.Load("C:\\test.bmp"))... nun steh ich vor dem selben problem ... wenn ich eine lösung hab schreib ich sie mit hier rein

    mfg, TFTS



  • Wäre nett, denn ich habe da auch noch keine Idee wie das laufen könnte.
    Muss man dann ggf. von CBitmap abweichen?



  • ::LoadImage, dann CBitmap::FromHandle.



  • CBitmap bmpPicture;
    //bmpPicture.LoadBitmap(IDB_BITMAP1);
    HBITMAP hBitmap;     
    hBitmap =(HBITMAP)::LoadImage( NULL , "c:\\test.bmp" ,IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE );
    bmpPicture.FromHandle(hBitmap);
    

    Führt zu einem Fehler sobald ich das Bild speichern will.
    Das Programm schmiert mir an der Stelle ab.



  • Riogrande schrieb:

    Führt zu einem Fehler sobald ich das Bild speichern will.
    Das Programm schmiert mir an der Stelle ab.

    FromHandle ist eine statische Methode. Der Rückgabewert - den du unter den Tisch fallen lässt - ist das interessante.



  • Danke, ich habe es jetzt fertig.



  • was ist daran falsch?

    HBITMAP hBitmap =(HBITMAP)::LoadImage( NULL , csFilePath ,IMAGE_BITMAP ,0 ,0 , LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE ); 
    	pCBitmap=CBitmap::FromHandle(hBitmap);
    	CSize dimension = pCBitmap->GetBitmapDimension();
    	*pWidth = dimension.cx;
    	*pHeight = dimension.cy;
    

    dimension.cx und dimension.cy sind immer 0 ... warum?

    mfg, TFTS



  • TFTomSun schrieb:

    dimension.cx und dimension.cy sind immer 0 ... warum?

    MSDN Library schrieb:

    If the bitmap width and height have not been set by using SetBitmapDimension, the return value is 0.

    Du suchst CBitmap::GetBitmap.



  • danke! ... hat zwar dann immer noch nich ganz geklappt, aber ich hab jetz einen weg gefunden.

    HBITMAP hBitmap =(HBITMAP)::LoadImage( NULL , csFilePath ,IMAGE_BITMAP ,0 ,0 , LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE ); 
    
    	if (pCBitmap->DeleteObject()) // War Bitmap vorhanden, lösen
    			pCBitmap->Detach();
    		// Aktuell geladenes Bitmap mit Bitmap-Objekt verbinden
    	pCBitmap->Attach(hBitmap);
    	//pCBitmap=CBitmap::FromHandle(hBitmap);
    
    	BITMAP bmBitmap;
    	pCBitmap->GetBitmap(&bmBitmap);
    	*pWidth = bmBitmap.bmWidth;
    	*pHeight = bmBitmap.bmHeight;
    


  • Habe euren Thread im Interesse verfolgt. 👍 Kann man damit auch große jpg bilder als mini bilder abspeichern? Danke.



  • nein aber schau dir das mal an:

    http://www.smalleranimals.com/jpegfile.htm

    da bekommst du einen Byte Pointer mit den RGB Daten (24Bit) zurück ... wenn du diese in BGR 32Bit konvertierst, kannst du sie dann zu nem CBitmap machen...

    mfg, TFTS


Anmelden zum Antworten