Programmierung

Visual C++ 6 – Bitmap transparent machen

Vor kurzem stand ich vor folgendem Problem: Ich hatte eine Bitmap, die ein Bild aufwieß, aber einen weißen Hintergrund hatte. Die Forderung war, dass man dieses Bild zwar anzeigt, jedoch ohne den weißen Hintergrund (das weiß sollte verschwinden und statt dessen sollte die Farbe angezeigt werden, die im Hintergrund war).

Was habe ich getan? Als ersten Schritt habe ich statt der weißen Farbe eine vollkommen andere Farbe als Hintergrund gewählt, sodass das Bild in meinem Fall auf blauem Hintergrund zu sehen war. Grund dafür war, dass das Bild selber auch weiße Pixel hatte und daher würde sich meine folgende Methode negativ auswirken.


Als nächsten Schritt bin ich durch etwas probieren und suchen auf folgende Methode gekommen:

HBITMAP MakeBitMapTransparent(HBITMAP hbmSrc)
{
   HDC hdcSrc, hdcDst;
   HBITMAP hbmOld, hbmNew;
   BITMAP bm;
   COLORREF clrTP, clrBK;
 
   if ((hdcSrc = CreateCompatibleDC(NULL)) != NULL) {
      if ((hdcDst = CreateCompatibleDC(NULL)) != NULL) {
         int nRow, nCol;
         GetObject(hbmSrc, sizeof(bm), &bm);
         hbmOld = (HBITMAP)SelectObject(hdcSrc, hbmSrc);
         hbmNew = CreateBitmap(bm.bmWidth, bm.bmHeight, bm.bmPlanes, bm.bmBitsPixel, NULL);
         SelectObject(hdcDst, hbmNew);
 
         BitBlt(hdcDst,0,0,bm.bmWidth, bm.bmHeight,hdcSrc,0,0,SRCCOPY);
 
         clrTP = GetPixel(hdcDst, 0, 0);
         clrBK = GetSysColor(COLOR_BTNFACE);
 
         for (nRow = 0; nRow < bm.bmHeight; nRow++)
         {
            for (nCol = 0; nCol < bm.bmWidth; nCol++)
            {
               if (GetPixel(hdcDst, nCol, nRow) == clrTP)
               {
                  SetPixel(hdcDst, nCol, nRow, clrBK);
               }
            }
         }
 
         DeleteDC(hdcDst);
      }
      DeleteDC(hdcSrc);
   }
   return hbmNew;
}

Diese Funktion macht folgendes: Es erstell ein neues Bitmap in derselben Größe wie die ursprüngliche Bitmap. Danach wird jedes Pixel in die neue Bitmap kopiert. Sobald aber eines der Pixel die Farbe hat, die man nicht anzeigen und durch eine andere Farbe ersetzen möchte, wird anstelle der alten Pixelfarbe die neue Pixelfarbe genommen. In meinem Fall war es das Grau eines normalen Fensterhintergrundes.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.