gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:57:21 32 4
gpt4 key购买 nike

我将位图的 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);

最佳答案

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

关于c++ - 直接在对话框中绘制位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14737357/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com