// // HANDLE DSToDIB(HBITMAP, LPDIBSECTION); // // Erzeugt aus einer DIBSection eine gepackte DIB. // // Der Parameter hBitmap ist eine von der Funktion // CreateDIBSection erzeugte Bitmap. Der Parameter pds ist // eine mittels GetObject(hBitmap, sizeof(DIBSECTION), pds) // erzeugte DIBSection-Struktur. // // Nach Aufruf der Funktion wird die übergebene DIBSection in // der Regel nicht mehr benötigt und kann mittels DeleteObject // freigegeben werden. // Die erzeugte DIB muß mittels VirtualFree freigegeben werden. // #include "windows.h" HANDLE DSToDIB(HBITMAP hBitmap, LPDIBSECTION pds) { if (hBitmap == NULL || pds == NULL) return NULL; // 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++; // DIBSection freigeben. Dieses sollte in der Regel dort // geschehen, wo sie erzeugt wurde (außerhalb dieser Funktion). // DeleteObject(hBitmap); // Gepackte DIB zurückgeben return hDIB; }