Komplettes Bitmap von einem CBitmap-Objekt in Anderes kopieren



  • Ich habe in meiner Anwendung zwei CBitmap-Objekte. Eines enthält ein Bild was ich in meinem Dialogfeld zeichne.

    Jetzt möchte ich das komplette Bild in ein anderes CBitmap-Objekt kopieren.

    So in der Art wie:

    CBitmap bObj1, bObj2;
    
    // Bitmap in "bObj1" laden ...
    
    bObj2 = bObj1;      // Geht leider nicht
    

    ich meine nicht:

    CBitmap bObj1, *bObj2;
    
    bObj2 = &bObj1;
    

    Kann man das irgendwie hinkriegen ? Kenne leider keine geeigneten Funktionen für soetwas



  • ein einfacher Blick in die Hilfe bringt manchmal Wunder 🙂

    CBitmap bObj1, bObj2;
    BITMAP* copyBmp;
    
    // irgendwas mit bObj1 machen
    copyBmp = bObj1.GetBitmap(copyBmp);
    
    // BITMAP Struktur in zweites Obj laden
    bObj2.LoadBitmapIndirect(copyBmp);
    

    zumindest müsste es etwa so gehen 🙂



  • danke erst mal.

    da es LoadBitmapIndirect() nicht geibt, habe ich es mit CreateBitmapIndirect() ausprobiert, was aber auch fehlgeschlagen ist. mein code sieht so aus:

    CBitmap	bBmp1, bBmp2;
    	BITMAP	bBmpTmp; 
    
    	// bBmp1 laden ...
    
    	if (bBmp1.GetBitmap(bBmpTmp) != 0)
    		bBmp2.CreateBitmapIndirect(bBmpTmp);
    


  • CreateBitmapIndirect(..) ist richtig... da hatte ich mich verschrieben.
    Du musst aber die Variable bBmpTmp als Pointer benutzen.
    also:

    BITMAP* bBmpTmp;
    CBitmap    bBmp1, bBmp2;
    
    // bBmp1 laden ...
    
    if (bBmp1.GetBitmap(bBmpTmp) != 0)
        bBmp2.CreateBitmapIndirect(bBmpTmp);
    

    oder

    BITMAP     bBmpTmp;
    CBitmap    bBmp1, bBmp2;
    
    // bBmp1 laden ...
    
    if (bBmp1.GetBitmap(&bBmpTmp) != 0)
        bBmp2.CreateBitmapIndirect(&bBmpTmp);
    


  • Ach ja, klar mit dem Pointer -.-

    Aber es klappt leider nicht 😉
    Das neu Bitmap ist nur schwarz !?



  • was genau willst du denn machen? willst du die bilder anzeigen?



  • Wie währe folgendes

    BITMAP     bm;
    	::GetObject(hBitmapSrc,sizeof(BITMAP), (LPSTR)&bm);
    DWORD *pPixels = (DWORD*)new BYTE[ bm.bmWidthBytes*bm.bmHeight ];
    	LONG dwValue=::GetBitmapBits(hBitmapSrc,bm.bmWidthBytes*bm.bmHeight,pPixels);
    	if(dwValue == bm.bmWidthBytes*bm.bmHeight)
    	{
    		CBitmap::CreateBitmap(bm.bmWidth,bm.bmHeight,bm.bmPlanes,bm.bmBitsPixel,pPixels);
    	}
    	delete pPixels;
    

    ist zwar API aber sollte läßt sich mit wenig aufwand auf MFC (CBitmap) anpassen

    Gruß Matthias



  • danke, ist glaube ich eine gute lösung.

    nur lässt sich das bitmap so nicht erstellen. ich vermute das ich noch etwas anderes machen muss.

    bis in die klammer komme ich, das bitmap will ich so erzeugen:

    CBitmap *bDragImage = new CBitmap();
    
            bDragImage->CreateBitmap(bm.bmWidth, bm.bmHeight, bm.bmPlanes, bm.bmBitsPixel, pPixels);
    

    ich erhalte aber nur ein schwarzes bitmap !?



  • Mit folgendem code kann man ohne CDC eine kopie eines CBitmap-Objektes erzeugen:

    CBitmap BitmapSrc
    //TODO: BitmapSrc Initialisierung (Z.b. Durch Überladung von CBitmap.Create())

    BITMAP BitMap;

    BitampSrc.GetBitmap(&Bitmap);
    DWORD sz = Bitmap.bmHeight * Bitmap.bmWidthBytes;
    Bitmap.bmBits = malloc(sz);
    BitmapSrc.GetBitmapBits(sz, Bitmap.bmBits);

    CBitmap BitmapCopy;
    bmp.CreateBitmapIndirect(&Bitmap);

    free(Bitmap.bmBits);



  • Mit folgendem code kann man ohne CDC eine kopie eines CBitmap-Objektes erzeugen:

    CBitmap BitmapSrc
    //TODO: BitmapSrc Initialisierung (Z.b. Durch Überladung von CBitmap.Create())

    BITMAP BitMap;

    BitampSrc.GetBitmap(&Bitmap);
    DWORD sz = Bitmap.bmHeight * Bitmap.bmWidthBytes;
    Bitmap.bmBits = malloc(sz);
    BitmapSrc.GetBitmapBits(sz, Bitmap.bmBits);

    CBitmap BitmapCopy;
    BitmapCopy.CreateBitmapIndirect(&Bitmap);

    free(Bitmap.bmBits);


Anmelden zum Antworten