动态加载位图

void CCreateRandomBMPDlg::OnBtnTest() { // TODO: Add your control notification handler code here HBITMAP hBmp;

CFileDialog dlg(TRUE, "bmp", NULL, 0, "位图文件 (*.bmp)|*.bmp||", this);

if (dlg.DoModal() != IDOK)
{
    return;
}

hBmp = (HBITMAP) LoadImage(NULL, dlg.GetPathName(), IMAGE_BITMAP, 0, 0,
                    LR_LOADFROMFILE | LR_CREATEDIBSECTION);

if (hBmp == NULL)
{
    return;
}

BITMAP bm;
PBITMAPINFO bmpInf;

if (GetObject(hBmp, sizeof(bm), &bm;) == 0)
    return ;

int nPaletteSize = 0;

if (bm.bmBitsPixel < 16)
    nPaletteSize = (int) pow(2, bm.bmBitsPixel);

bmpInf = (PBITMAPINFO) LocalAlloc(LPTR,
                        sizeof(BITMAPINFOHEADER) +
                        sizeof(RGBQUAD) * nPaletteSize);

//-----------------------------------------------
bmpInf->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInf->bmiHeader.biWidth = bm.bmWidth;
bmpInf->bmiHeader.biHeight = bm.bmHeight;
bmpInf->bmiHeader.biPlanes = bm.bmPlanes;
bmpInf->bmiHeader.biBitCount = bm.bmBitsPixel;
bmpInf->bmiHeader.biCompression = BI_RGB;
bmpInf->bmiHeader.biSizeImage = (bm.bmWidth + 7) /
    8 * bm.bmHeight * bm.bmBitsPixel;
bmpInf->bmiHeader.biXPelsPerMeter = 0;
bmpInf->bmiHeader.biYPelsPerMeter = 0;
bmpInf->bmiHeader.biClrUsed = 0;
bmpInf->bmiHeader.biClrImportant = 0;
//-----------------------------------------------

HDC hDC = ::GetWindowDC(NULL);
if (!::GetDIBits(hDC, hBmp, 0, (WORD) bm.bmHeight, NULL, bmpInf,
        DIB_RGB_COLORS))
{
    LocalFree(bmpInf);
    ::ReleaseDC(NULL, hDC);
    return ;
}

void* buf = (void*) new char[bmpInf->bmiHeader.biSizeImage];
if (buf == NULL)
{
    ::ReleaseDC(NULL, hDC);
    LocalFree(bmpInf);
    return ;
}

if (!::GetDIBits(hDC, hBmp, 0, (UINT) bm.bmHeight, buf, bmpInf,
        DIB_RGB_COLORS))
{
    ::ReleaseDC(NULL, hDC);
    delete[]buf;
    LocalFree(bmpInf);
    return ;
}

::ReleaseDC(NULL, hDC);

CString sMsg;
sMsg.Format("BitsPixel:%d,width:%d,height:%d", bm.bmBitsPixel, bm.bmWidth,
        bm.bmHeight);

AfxMessageBox(sMsg);

CClientDC dc(this);

if (bm.bmBitsPixel == 8)
{
    BYTE* pData = (BYTE*) buf;

    int nWidth = bm.bmWidth;
    while (nWidth % 4 != 0)
    {
        //Bmp每行数据都是4个字节的整数倍。
        nWidth++;
    }

    for (int i = 0; i < bm.bmHeight; i++)
    {
        for (int j = 0; j < bm.bmWidth; j++)
        {
            RGBQUAD rgbQ;
            rgbQ = bmpInf->bmiColors[pData[i * nWidth + j]];
            dc.SetPixel(j, bm.bmHeight - i,
                RGB(rgbQ.rgbRed, rgbQ.rgbGreen, rgbQ.rgbBlue));
        }
    }
}
else if (bm.bmBitsPixel == 16)
{
    BYTE* pData = (BYTE*) buf;

    int nWidth = bm.bmWidth*2;
    while (nWidth % 4 != 0)
    {
        nWidth++;
    }

    BYTE red, green, blue;

    for (int i = 0; i < bm.bmHeight; i++)
    {
        for (int j = 0; j < bm.bmWidth; j++)
        {
            blue = pData[i * nWidth + j * 2] & 0x1F;
            green = pData[i * nWidth + j * 2] >> 5;
            green |= (pData[i * nWidth + j * 2 + 1] & 0x03) << 3;
            red = (pData[i * nWidth + j * 2 + 1] >> 2) & 0x1F;

            WORD wRed = red*8;
            WORD wBlue = blue*8;
            WORD wGreen = green*8;

            red = min(255, wRed);
            blue = min(255, wBlue);
            green = min(255, wGreen);

            dc.SetPixel(j, bm.bmHeight - i, RGB(red, green, blue));
        }
    }
}
else if (bm.bmBitsPixel == 24)
{
    BYTE* pData = (BYTE*) buf;

    int nWidth = bm.bmWidth*3;
    while (nWidth % 4 != 0)
    {
        nWidth++;
    }

    for (int i = 0; i < bm.bmHeight; i++)
    {
        for (int j = 0; j < bm.bmWidth; j++)
        {
            dc.SetPixel(j, bm.bmHeight -
                i,
                RGB(pData[i * nWidth + j * 3 + 2],
                    pData[i * nWidth + j * 3 + 1],
                    pData[i * nWidth + j * 3]));
        }
    }
}
else if (bm.bmBitsPixel == 32)
{
    BYTE* pData = (BYTE*) buf;

    int nWidth = bm.bmWidth*4;

    for (int i = 0; i < bm.bmHeight; i++)
    {
        for (int j = 0; j < bm.bmWidth; j++)
        {
            dc.SetPixel(j, bm.bmHeight -
                i,
                RGB(pData[i * nWidth + j * 4 + 2],
                    pData[i * nWidth + j * 4 + 1],
                    pData[i * nWidth + j * 4]));
        }
    }
}

delete[]buf;

DeleteObject(hBmp);
LocalFree(bmpInf);

}

支持原创技术分享,据说打赏我的人,都找到了女朋友!