//24,16,8,4位位图之间相互转换
//lpDest:颜色数据,目标图
//lpSrc:颜色数据,源图
//dbits:目标颜色数
//sbits:源颜色数
//w:宽度
//h:高度
void ConvBitCount(BYTE *lpDest, BYTE *lpSrc, UINT dbits, UINT sbits, UINT w, UINT h)
{
BITMAPINFOHEADER bmiHeader = {0};
BITMAPINFOHEADER* lpInfo = (BITMAPINFOHEADER*)lpDest;
HBITMAP hBmp, hOldBmp;
HDC hMemDC;
HPALETTE hPal = NULL;
// 创建DC和HBITMAP.
hMemDC = ::CreateCompatibleDC(NULL);
hBmp = ::CreateBitmap( w, h, 1, (UINT)sbits, lpSrc );
hOldBmp = (HBITMAP)::SelectObject( hMemDC, hBmp );
if(dbits < 16) hPal = (HPALETTE)::GetStockObject(DEFAULT_PALETTE);
bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmiHeader.biWidth = w;
bmiHeader.biHeight = h;
bmiHeader.biPlanes = 1;
bmiHeader.biBitCount = dbits;
bmiHeader.biCompression = BI_RGB;
// 得到位图BMP信息.
*lpInfo = bmiHeader;
if (dbits < 16) {
hPal = ::SelectPalette(hMemDC, hPal, FALSE);
::RealizePalette(hMemDC);
}
if (dbits == 4) {
lpInfo->biSizeImage = (w >> 1) * h;
::GetDIBits( hMemDC, hBmp, 0, (UINT)h,
(LPVOID)((BYTE*)lpInfo + bmiHeader.biSize + 16 * sizeof(RGBQUAD)),
(LPBITMAPINFO)lpInfo, DIB_RGB_COLORS );
}
else if (dbits == 8) {
lpInfo->biSizeImage = w * h;
::GetDIBits( hMemDC, hBmp, 0, (UINT)h,
(LPVOID)((BYTE*)lpInfo + bmiHeader.biSize + 256 * sizeof(RGBQUAD)),
(LPBITMAPINFO)lpInfo, DIB_RGB_COLORS );
}
else if (dbits == 16)
{
lpInfo->biSizeImage = w * 2 * h;
::GetDIBits( hMemDC, hBmp, 0, (UINT)h,
(LPVOID)((BYTE*)lpInfo + bmiHeader.biSize ),
(LPBITMAPINFO)lpInfo, DIB_RGB_COLORS );
}
else if (dbits == 24)
{
lpInfo->biSizeImage = w * 3 * h;
::GetDIBits( hMemDC, hBmp, 0, (UINT)h,
(LPVOID)((BYTE*)lpInfo + bmiHeader.biSize ),
(LPBITMAPINFO)lpInfo, DIB_RGB_COLORS );
}
// 释放资源.
if (dbits < 16) {
::SelectPalette(hMemDC, hPal, TRUE);
::RealizePalette(hMemDC);
}
::DeleteObject(hBmp);
::DeleteObject(hOldBmp);
::SelectObject(hMemDC, hOldBmp);
::DeleteDC(hMemDC);
}