24,16,8,4位位图之间相互转换

  • Post author:
  • Post category:其他


//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);

}