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

本文介绍了一个函数,用于在不同位深度的位图之间进行转换,包括24位、16位、8位和4位位图。通过创建设备上下文、位图和调用GetDIBits函数来实现转换。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值