SitemapInfoHomeTips und Tricks - Device Independent Bitmaps

Homepage

Software,
Download

Software-
entwicklung

  Tips und Tricks

Nachrichten-
technik

Internet

Aktuelles,
Sonstiges

Infos,
Kontakt

Sitemap


Mit der folgenden Funktion wird aus einer DIBSection eine gepackte DIB erzeugt.


#include "windows.h"

HANDLE DSToDIB(HBITMAP hBitmap, LPDIBSECTION pds)
{
   // Größe der DIB ermitteln
   DWORD dwDibSize = pds->dsBmih.biSize;
   if (pds->dsBmih.biCompression == BI_BITFIELDS)
      dwDibSize += 3 * sizeof(DWORD);
   if (pds->dsBmih.biClrUsed != 0)
      dwDibSize += pds->dsBmih.biClrUsed * sizeof(RGBQUAD);
   else if (pds->dsBm.bmBitsPixel <= 8)
      dwDibSize += (1 << pds->dsBm.bmBitsPixel) * sizeof(RGBQUAD);
   
   DWORD dwBitsSize = 0;
   if (pds->dsBmih.biSizeImage != 0)
      dwBitsSize = pds->dsBmih.biSizeImage;
   else
      dwBitsSize = 4 * pds->dsBm.bmHeight *
      ((pds->dsBm.bmWidth * pds->dsBm.bmBitsPixel + 31) / 32);
   dwDibSize += dwBitsSize;
   
   // Speicher für die DIB anfordern
   HANDLE hDIB = VirtualAlloc(NULL, dwDibSize,
      MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
   if (hDIB == NULL)
      return NULL;
   
   // BITMAPINFOHEADER kopieren
   LPBYTE pSrc = (LPBYTE)&pds->dsBmih;
   LPBYTE pDest = (LPBYTE)hDIB;
   DWORD dwLen = sizeof(BITMAPINFOHEADER);
   while (dwLen--)
      *pDest++ = *pSrc++;
   
   // Zeiger auf die Farbtabelle bzw. Farbmaske bestimmen
   LPRGBQUAD prgb = (LPRGBQUAD)((LPBYTE)hDIB +
      sizeof(BITMAPINFOHEADER));
   
   if (pds->dsBmih.biCompression == BI_BITFIELDS)
   {
      // Farbtmaske kopieren
      pSrc = (LPBYTE)pds->dsBitfields;
      pDest = (LPBYTE)prgb;
      dwLen = 3 * sizeof(DWORD);
      while (dwLen--)
         *pDest++ = *pSrc++;
      
      // Zeiger auf die Farbtabelle bestimmen
      prgb = (LPRGBQUAD)((LPBYTE)prgb + 3 * sizeof(DWORD));
   }
   
   // Farbtabelle kopieren
   int nNumColors = 0;
   if (pds->dsBmih.biClrUsed != 0)
      nNumColors = pds->dsBmih.biClrUsed;
   else if (pds->dsBm.bmBitsPixel <= 8)
      nNumColors = 1 << pds->dsBm.bmBitsPixel;
   if (nNumColors != 0)
   {
      HDC hdcMem = CreateCompatibleDC(NULL);
      HBITMAP hBmpOld = (HBITMAP)SelectObject(hdcMem, hBitmap);
      GetDIBColorTable(hdcMem, 0, nNumColors, prgb);
      SelectObject(hdcMem, hBmpOld);
      DeleteDC(hdcMem);
   }
   
   // Bildpunkte kopieren
   pSrc = (LPBYTE)pds->dsBm.bmBits;
   pDest = (LPBYTE)(prgb + nNumColors);
   dwLen = dwBitsSize;
   while (dwLen--)
      *pDest++ = *pSrc++;
   
   // Gepackte DIB zurückgeben
   return hDIB;
}

[ dstodib.cpp ]

[ << Vorheriger ] [ Übersicht ] [ Erster >> ]

TopHomepage » Softwareentwicklung » Tips und Tricks » Geräteunabhängige Bitmaps