BITMAP gestaucht speichern



  • Hi zusammen,

    ich lade ein Bitmap und will dieses nun stauchen und dann abspeichern. ALso wie man das Bitmap direkt abspeichert habe ich hinbekommen, und wie man es gestaucht darstellt üver "StretchBlt" auch.

    nur, wie kann ich z,b. dann von

    pDC->StretchBlt( 0, 0, 180, 178, &imageDC, 0, 0, bild_header.bmWidth, bild_header.bmHeight-220, SRCCOPY);
    

    das nun abspeichern. Danke für einen Tip. 👍



  • Wenn du VC++7 verwendest ist es ganz leicht Eine Variable Vin CImage anlegen,Bitmap reinkopieren, speichern fertig.

    CImage pic;
    pic.Attach(imageDc);
    pic.Save("C:\dahinsolls\soheissts.bmp");
    

    Ohne CImage wirds ne arge Krise



  • HI

    danke für deine Antwort, leider bin ich noch nicht so up to date dein Vorschlag klappt nicht. Aber evtl. komme ich drauf zurück, werde demnächst auf Net umstellen.
    Habe das Speichern Problem so wie da unten gelöst, kann da aber dann nur das BITMAP nutzen, würde das gerne über das imagedc machen ?????

    BOOL CMainDlgII::WriteBitmap(LPTSTR szFile, HBITMAP hbitmap, HDC memdc)
    {
    	 BITMAP  bmp; 
      //Informationen über die übergebene Bitmap sammeln, bmp ist der Zielpuffer der Infos 
      if(GetObject(hbitmap, sizeof(BITMAP), &bmp))   
      {     
        BITMAPINFOHEADER BmpInfoHdr;  //Struktur für Bitmap-Infoheader 
        BITMAPFILEHEADER BmpFileHdr;  //Struktur für Bitmap-Dateiheader 
        //jetzt werden die gesammlten Infos in bmp ausgewertet und in die Strukts umgeschrieben 
        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 ;   
    
        //Heap-Speicher für die ins DIB-Format zu konvertierende Bitmap organisieren 
        bmp.bmBits = (void*)GlobalAlloc(GMEM_FIXED, BmpInfoHdr.biSizeImage); 
    
        //Bitmap ins DIB-Format umwandeln, wenn erfolgreich wird die DIB geschrieben 
        if(GetDIBits(memdc, hbitmap, 0, BmpInfoHdr.biHeight, bmp.bmBits, 
            (BITMAPINFO*)&BmpInfoHdr, DIB_RGB_COLORS) == BmpInfoHdr.biHeight)       
        {     
          //Datei erzeugen über Win-API (ist performanter als fstream-Funktionen) 
        HANDLE hFile = CreateFile(szFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); 
          //Datei erzeugen erfolgreich? 
          if(hFile != INVALID_HANDLE_VALUE)  {           
            //hier wird die Anzahl der geschriebenen Bytes abgelegt, aber nicht ausgewertet 
            DWORD dwTmp;   
            //Bitmap-Dateiheader schreiben 
            WriteFile(hFile, &BmpFileHdr, sizeof(BITMAPFILEHEADER), &dwTmp, NULL);           
            //Bitmap-Infoheader schreiben 
            WriteFile(hFile, &BmpInfoHdr, sizeof(BITMAPINFOHEADER), &dwTmp, NULL);           
            //Bitmap-Pixeldaten schreiben 
            WriteFile(hFile, bmp.bmBits,  BmpInfoHdr.biSizeImage,   &dwTmp, NULL);         
            }   
          //Datei schliessen 
          CloseHandle(hFile);       
        }     
        //Heapspeicher freigeben 
        GlobalFree(bmp.bmBits); 
        return TRUE; 
      } 
      //Nicht erfolgreich gewesen, leider leider ... 
      return FALSE; 
    
    }
    

    P.S. Die Funkton ist aus irdendnem Forum!! 👍


Anmelden zum Antworten