HomepageSoftware,
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
>> ]
|