直接在对话框中绘制位图?

时间:2013-02-06 19:39:08

标签: c++ mfc bitmap

我有BITMAPFILEHEADER,BITMAPINFOHEADER,以及分别存储在名为bf,bi和imageData的变量中的位图的图像数据。当我将这些输出到.bmp文件时,我可以毫无问题地打开它并查看图像。我还可以编写一些代码来导入这个bmp文件并在我的对话框中显示它。

我的问题是:是否有一种简单的方法可以切断中间人并拿走我的BITMAPFILEHEADER,BITMAPINFOHEADER和图像数据,并将这些数据直接写入对话框中显示的24位图图像,而无需使用外部文件?

作为参考,这里是我现在用来输出到文件的代码,然后将这个文件输入到对话框中:

    //fileheader
    BITMAPFILEHEADER* bf = new BITMAPFILEHEADER;
    bf->bfType = 0x4d42;
    bf->bfSize = 6054400 + 54;
    bf->bfOffBits = 54;

    //infoheader
    BITMAPINFOHEADER* bi = new BITMAPINFOHEADER;
    bi->biSize = 40;
    bi->biWidth = 2752;
    bi->biHeight = -733;
    bi->biPlanes = 1;
    bi->biBitCount = 24;
    bi->biCompression = 0;
    bi->biSizeImage = 6054400;
    bi->biXPelsPerMeter = 2835;
    bi->biYPelsPerMeter = 2835;
    bi->biClrUsed = 0;
    bi->biClrImportant = 0;

    //image data
    unsigned char* imageData = new unsigned char[6054400];
    pFrame->GetImage(imageData);


    //////////////////////////////////////////////////////////////////////////
    //////////  Output to .bmp File   ////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////


    std::ofstream outFile;

    outFile.open("test.bmp", std::ios::binary|std::ios::out);

    outFile.write(reinterpret_cast<char *>(bf), sizeof(BITMAPFILEHEADER));
    outFile.write(reinterpret_cast<char *>(bi), sizeof(BITMAPINFOHEADER));
    outFile.write(reinterpret_cast<char *>(imageData), 6054400);

    outFile.close();

    //////////////////////////////////////////////////////////////////////////
    //////////  input .bmp and print to dialog box   /////////////////////////
    //////////////////////////////////////////////////////////////////////////

    CString szFilename ("C:/dev/NanoDev/TestApps/AVT_Testapp/test.bmp");
    HBITMAP hBmp = (HBITMAP)::LoadImage(NULL, szFilename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
    CBitmap bmp;
    bmp.Attach(hBmp);
    CClientDC dc(this);
    CDC bmDC;
    bmDC.CreateCompatibleDC(&dc);
    CBitmap *pOldbmp = bmDC.SelectObject(&bmp);
    BITMAP  bi;
    bmp.GetBitmap(&bi);
    dc.BitBlt(384,26,bi.bmWidth/3,bi.bmHeight,&bmDC,0,0,SRCCOPY);
    bmDC.SelectObject(pOldbmp);

1 个答案:

答案 0 :(得分:3)

您可以使用StretchDIBits function直接从内存中绘制到DC。您只需要将数据从BITMAPINFOHEADER转换为BITMAPINFO结构。