(1):复制元数据到 HBItmap
HBITMAP CAviTestDlg::BufferToHBITMAP(LPSTR m_pBMPBuffer)
{
HBITMAP hShowBMP;
LPSTR hDIB,lpBuffer = m_pBMPBuffer;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader;
DWORD bmfHeaderLen;
bmfHeaderLen = sizeof(bmfHeader);
strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);
if (bmfHeader.bfType != (*(WORD*)"BM")) return NULL;
hDIB = lpBuffer + bmfHeaderLen;//写入文件头
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
int m_bmW = bmiHeader.biWidth;
int m_bmH = bmiHeader.biHeight;
lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;
CClientDC dc(this);
hShowBMP = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
return hShowBMP;
}
(2):显示数据到控件
LPSTR m_buffer=NULL;
CBitmap m_bmp;
CRect rect;
DIBSECTION ds;
HBITMAP hbmp =BufferToHBITMAP(m_buffer);
if( hbmp == NULL )return ;
//该断程序用来取得加载的BMP的信息//
m_bmp.Attach( hbmp );
BITMAPINFOHEADER &bminfo = ds.dsBmih;
m_bmp.GetObject( sizeof(ds), &ds );
int cx=bminfo.biWidth; //得到图像宽度
int cy=bminfo.biHeight; //得到图像高度
/////////////得到了图像的宽度和高度后,我们就可以对图像大小进行适应,即调整控件的大小,让它正好显示一张图片///////////////////////////
GetDlgItem(IDC_SHOWPIC2)->GetWindowRect(&rect);
ScreenToClient(&rect);
GetDlgItem(IDC_SHOWPIC2)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小
//IDC_SHOWPIC2为我的控件ID
(3):我的代码实现!
void CAviTestDlg::BYTE2DC(BYTE* pArray, UINT ID)
//void CAviTestDlg::BitMatToDC(cv::Mat img, UINT ID)
{
//if(img.empty())return;
// 获得显示控件的 DC
CDC *cdc = GetDlgItem( ID ) ->GetDC();
CDC MemDC;//首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象
// 获取 HDC(设备句柄) 来进行绘图操作
//HDC hDC = cdc ->GetSafeHdc();///////pDC
CRect rect;
GetDlgItem(ID) ->GetClientRect( &rect );
Gdiplus::Bitmap bitmap(RGB_Width,RGB_Height,RGB_Width*3, PixelFormat24bppRGB, (BYTE*)pArray);//根据Mat矩阵创建一个GDI+中的Bitmap位图,imageMD.FullYRes()* 3
//随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(cdc);
//下面建立一个与屏幕显示兼容的位图,至于位图的大小,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(cdc, rect.Width(), rect.Height());
//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景 {MOD}将位图清除干净,可以用自己应该用的颜 {MOD}
MemDC.FillSolidRect(0,0, rect.Width(), rect.Height(),RGB(0,255,255));
//绘图
Gdiplus::Graphics g(MemDC.m_hDC);
Gdiplus::Image *ii = &bitmap;
g.DrawImage(ii, Gdiplus::Rect(0,0,rect.Width(),rect.Height()));
g.ReleaseHDC(MemDC.m_hDC);
//将内存中的图拷贝到屏幕上进行显
cdc->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0, 0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
ReleaseDC(cdc);
}
(4):微软官方帮助:
CBitmap Class
封装Windows图形设备接口(GDI)位图并提供成员函数操作位图。
class CBitmap : public CGdiObject
成员
公共构造函数
名称
|
说明
|
CBitmap::CBitmap
构造 CBitmap 对象。
公共方法
名称
|
说明
|
CBitmap::CreateBitmap
初始化具有指定的宽度、高度和位组合的设备相关的内存位图的对象。
CBitmap::CreateBitmapIndirect
初始化位图的对象与 BITMAP 结构(如果指定了)生成的宽度、高度和位组合。
CBitmap::CreateCompatibleBitmap
初始化使用位图的对象,以使其与指定的设备兼容。
CBitmap::CreateDiscardableBitmap
初始化与指定的设备兼容的一discardable位图的对象。
CBitmap::FromHandle
返回指向 CBitmap 对象,同时使处理Windows HBITMAP 位图。
CBitmap::GetBitmap
用有关位图的信息来加载一 BITMAP 结构。
CBitmap::GetBitmapBits
复制指定的位图的位到指定缓冲区。
CBitmap::GetBitmapDimension
返回位图的宽度和高度。 该高度和宽度假定由 SetBitmapDimension 成员函数之前设置。
CBitmap::LoadBitmap
通过填写命名位图资源从应用程序的可执行文件和附加位图初始化对象到对象。
CBitmap::LoadMappedBitmap
加载位图和映射颜 {MOD}设置为当前系统颜 {MOD}。
CBitmap::LoadOEMBitmap
通过加载预定义的Windows位图和附加位图初始化对象到对象。
CBitmap::SetBitmapBits
将位图的位到指定的位值。
CBitmap::SetBitmapDimension
分配宽度和高度到0.1个单位的位图。
公共运算符
名称
|
说明
|
CBitmap::operator
HBITMAP
返回Windows处理附加到 CBitmap 对象。