HBITMAP Helper_CreateBitmapFromBuffer(LPBYTE pBuffer, DWORD cbSize)
{
HBITMAP hBmp=NULL;
HDC hdc=NULL;
HPALETTE hPal=NULL,hOldPal=NULL;
BITMAPFILEHEADER *pbmfHeader=(BITMAPFILEHEADER *)pBuffer;
DWORD dwOffset=sizeof(BITMAPFILEHEADER);
// File type should be 'BM' BITMAPINFOHEADER *pbmiHeader = (LPBITMAPINFOHEADER)(pBuffer+dwOffset) ;
BITMAPINFO * pbmInfo = (LPBITMAPINFO)(pBuffer+dwOffset) ;
// If bmiHeader.biClrUsed is zero we have to infer the number
// of colors from the number of bits used to specify it.
int nColors = pbmiHeader->biClrUsed ? pbmiHeader->biClrUsed :
1 < < pbmiHeader->biBitCount; LPVOID lpDIBBits;
if (pbmfHeader->bfType != ((WORD) ('M' < < 8) | 'B')) return NULL;
if( pbmInfo->bmiHeader.biBitCount > 8 )
lpDIBBits = (LPVOID)((LPDWORD)(pbmInfo->bmiColors + pbmInfo->bmiHeader.biClrUsed) +
((pbmInfo->bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
else
lpDIBBits = (LPVOID)(pbmInfo->bmiColors + nColors); hdc=GetDC(NULL);
// Create the palette
if( nColors <= 256 )
{
UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
LOGPALETTE *pLP = (LOGPALETTE *) malloc(nSize);
int i;
pLP->palVersion = 0x300;
pLP->palNumEntries = nColors; for( i=0; i < nColors; i++)
{
pLP->palPalEntry[i].peRed = pbmInfo->bmiColors[i].rgbRed;
pLP->palPalEntry[i].peGreen = pbmInfo->bmiColors[i].rgbGreen;
pLP->palPalEntry[i].peBlue = pbmInfo->bmiColors[i].rgbBlue;
pLP->palPalEntry[i].peFlags = 0;
}
hPal=CreatePalette(pLP);
free(pLP);
hOldPal=(HPALETTE)SelectObject(hdc,hPal);
RealizePalette(hdc);
}
hBmp = CreateDIBitmap( hdc, // handle to device context
pbmiHeader, // pointer to bitmap size and format data
CBM_INIT, // initialization flag
lpDIBBits, // pointer to initialization data
pbmInfo, // pointer to bitmap color-format data
DIB_RGB_COLORS); // color-data usage
if( hPal )
{
SelectObject(hdc,hOldPal);
DeleteObject(hPal);
}
ReleaseDC(NULL,hdc);
return hBmp;
}
{
HBITMAP hBmp=NULL;
HDC hdc=NULL;
HPALETTE hPal=NULL,hOldPal=NULL;
BITMAPFILEHEADER *pbmfHeader=(BITMAPFILEHEADER *)pBuffer;
DWORD dwOffset=sizeof(BITMAPFILEHEADER);
// File type should be 'BM' BITMAPINFOHEADER *pbmiHeader = (LPBITMAPINFOHEADER)(pBuffer+dwOffset) ;
BITMAPINFO * pbmInfo = (LPBITMAPINFO)(pBuffer+dwOffset) ;
// If bmiHeader.biClrUsed is zero we have to infer the number
// of colors from the number of bits used to specify it.
int nColors = pbmiHeader->biClrUsed ? pbmiHeader->biClrUsed :
1 < < pbmiHeader->biBitCount; LPVOID lpDIBBits;
if (pbmfHeader->bfType != ((WORD) ('M' < < 8) | 'B')) return NULL;
if( pbmInfo->bmiHeader.biBitCount > 8 )
lpDIBBits = (LPVOID)((LPDWORD)(pbmInfo->bmiColors + pbmInfo->bmiHeader.biClrUsed) +
((pbmInfo->bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
else
lpDIBBits = (LPVOID)(pbmInfo->bmiColors + nColors); hdc=GetDC(NULL);
// Create the palette
if( nColors <= 256 )
{
UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
LOGPALETTE *pLP = (LOGPALETTE *) malloc(nSize);
int i;
pLP->palVersion = 0x300;
pLP->palNumEntries = nColors; for( i=0; i < nColors; i++)
{
pLP->palPalEntry[i].peRed = pbmInfo->bmiColors[i].rgbRed;
pLP->palPalEntry[i].peGreen = pbmInfo->bmiColors[i].rgbGreen;
pLP->palPalEntry[i].peBlue = pbmInfo->bmiColors[i].rgbBlue;
pLP->palPalEntry[i].peFlags = 0;
}
hPal=CreatePalette(pLP);
free(pLP);
hOldPal=(HPALETTE)SelectObject(hdc,hPal);
RealizePalette(hdc);
}
hBmp = CreateDIBitmap( hdc, // handle to device context
pbmiHeader, // pointer to bitmap size and format data
CBM_INIT, // initialization flag
lpDIBBits, // pointer to initialization data
pbmInfo, // pointer to bitmap color-format data
DIB_RGB_COLORS); // color-data usage
if( hPal )
{
SelectObject(hdc,hOldPal);
DeleteObject(hPal);
}
ReleaseDC(NULL,hdc);
return hBmp;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货