Komplettes Bitmap von einem CBitmap-Objekt in Anderes kopieren

Meisterzunge

Mitglied
Ich möchte ein komplettes CBitmap-Objekt in ein Anderes kopieren. Mein (leider falscher) Code sieht im moment so aus:

Code:
	CBitmap	bBmp1, bBmp2;
	BITMAP	bBmpTmp; 

	// bBmp1 laden ...

	if (bBmp1.GetBitmap(&bBmpTmp) != 0)
		bBmp2.CreateBitmapIndirect(&bBmpTmp);

Was mache ich falsch ? 'bBmp1' wird korrekt initialisiert und geladen. Wenn ich 'bBmp1' zeiche, hab ich keine Probleme.
 
Hallo, GetBitmap() ist nur die halbe Miete. Du benötigst noch den Bitmap-Content via GetBitmapBits(), der dann auch entsprechend zugewiesen werden muss:
C++:
CBitmap bBmp1, bBmp2;
BITMAP bBmpTmp; 

// bBmp1 laden ...

if( bBmp1.GetBitmap(&bBmpTmp) != 0 )
{
    BYTE *pBuffer = new BYTE[bBmpTmp.bmWidthBytes * bBmpTmp.bmHeight];
    bitmap1.GetBitmapBits(bBmpTmp.bmWidthBytes * bmbBmpTmpbmHeight, pBuffer);

    bBmp2.CreateBitmapIndirect(&bBmpTmp);
    bBmp2.SetBitmapBits(bBmpTmp.bmWidthBytes * bBmpTmp.bmHeight, pBuffer);
    
    delete [] pBuffer;
    
    // ...
}
Gruß
MCoder
 
Danke für den (sehr guten) Vorschlag ;)

Das neue Bitmap-Objekt ist aber komplett schwarz (die Größe stimmt aber). Er führt die Funktionen komplett aus.

'SetBitmapBits()' liefert mir auch genau den Wert, der sich aus 'bBmpTmp.bmWidthBytes * bBmpTmp.bmHeight' ergibt, wird also korrekt ausgeführt.

Ich habe jetzt um sicher zu gehen einige *.bmp Dateien getestet, bei keinem hat es geklappt.

Nur woran kann es liegen ?
 
Keine Ahnung, warum es bei dir nicht geht. Ich habe mal schnell den Code in eine OnPaint()-Funktion geschrieben und da funktioniert's.
C++:
CPaintDC dc(this);

CBitmap bitmap1, bitmap2;
bitmap1.LoadBitmap(IDB_BITMAP1); // Bitmap aus Resource

BITMAP bm;

bitmap1.GetBitmap(&bm);
BYTE *pBuffer = new BYTE[bm.bmWidthBytes * bm.bmHeight];
bitmap1.GetBitmapBits(bm.bmWidthBytes * bm.bmHeight, pBuffer);

bitmap2.CreateBitmapIndirect(&bm);
bitmap2.SetBitmapBits(bm.bmWidthBytes * bm.bmHeight, pBuffer);

delete [] pBuffer;

CDC memDC1;
memDC1.CreateCompatibleDC(&dc);
CBitmap *pOldBitmap1 = memDC1.SelectObject(&bitmap1);
dc.BitBlt(10, 10, bm.bmWidth, bm.bmHeight, &memDC1, 0, 0, SRCCOPY);
memDC1.SelectObject(pOldBitmap1);

CDC memDC2;
memDC2.CreateCompatibleDC(&dc);
CBitmap *pOldBitmap2 = memDC2.SelectObject(&bitmap2);
dc.BitBlt(10, 80, bm.bmWidth, bm.bmHeight, &memDC2, 0, 0, SRCCOPY);
memDC2.SelectObject(pOldBitmap2);
Gruß
MCoder
 
Ich habe bis jetzt immer das Bitmap aus einer Datei gelesen. Zum testen habe ich auch eine Resource verwendet und es hat geklappt !?

Bei näherem Betrachten ist mir aufgefallen das die Bitmap auf der Datei 24 Bit hatte, die Resource-Bitmap hatte 32 Bit.

Ich bin mir nicht sicher ob es damit zusammenhängt, aber das ist mir als einziger Unterschied aufgefallen. Gibt es da etwas was man beim kopieren der Bitmap (egal ob aus Datei oder als Resource geladen) beachten sollte ?

In der MSDN steht dazu nichts
 
Wie lädst du denn die Datei? Ich habe mal folgendes in meinen zuletzt geposteten Code eingebaut und hatte keine Probleme, egal wie Farbtiefe des Bitmaps war:
C++:
HBITMAP hbm = (HBITMAP)LoadImage( AfxGetInstanceHandle(),
                                  _T("C:\\MeinBild.bmp"),
                                  IMAGE_BITMAP,
                                  0,
                                  0,
                                  LR_LOADFROMFILE );

CBitmap *pBitmap1 = CBitmap::FromHandle(hbm);

// ...
Gruß
MCoder
 
Da lag der Fehler ;)

ich habe neben dem 'LR_LOADFROMFILE'-Flag noch 'LR_CREATEDIBSECTION' benutzt.

Jetzt klappts bei mir wunderbar ;) Danke für deine Tatkräftige Unterstützung !!
 

Neue Beiträge

Zurück