图形操作类CBitmap 把内存数据输出到PIC控件
(1):復(fù)制元數(shù)據(jù)到 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):顯示數(shù)據(jù)到控件
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; //得到圖像高度 /得到了圖像的寬度和高度后,我們就可以對(duì)圖像大小進(jìn)行適應(yīng),即調(diào)整控件的大小,讓它正好顯示一張圖片///GetDlgItem(IDC_SHOWPIC2)->GetWindowRect(&rect); ScreenToClient(&rect); GetDlgItem(IDC_SHOWPIC2)->MoveWindow(rect.left,rect.top,cx,cy,true);//調(diào)整大小//IDC_SHOWPIC2為我的控件ID(3):我的代碼實(shí)現(xiàn)!
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;//首先定義一個(gè)顯示設(shè)備對(duì)象 CBitmap MemBitmap;//定義一個(gè)位圖對(duì)象// 獲取 HDC(設(shè)備句柄) 來進(jìn)行繪圖操作 //HDC hDC = cdc ->GetSafeHdc();///pDC CRect rect; GetDlgItem(ID) ->GetClientRect( &rect ); Gdiplus::Bitmap bitmap(RGB_Width,RGB_Height,RGB_Width*3, PixelFormat24bppRGB, (BYTE*)pArray);//根據(jù)Mat矩陣創(chuàng)建一個(gè)GDI+中的Bitmap位圖,imageMD.FullYRes()* 3 //隨后建立與屏幕顯示兼容的內(nèi)存顯示設(shè)備 MemDC.CreateCompatibleDC(cdc); //下面建立一個(gè)與屏幕顯示兼容的位圖,至于位圖的大小,可以用窗口的大小 MemBitmap.CreateCompatibleBitmap(cdc, rect.Width(), rect.Height()); //將位圖選入到內(nèi)存顯示設(shè)備中 //只有選入了位圖的內(nèi)存顯示設(shè)備才有地方繪圖,畫到指定的位圖上 CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色將位圖清除干凈,可以用自己應(yīng)該用的顏色 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); //將內(nèi)存中的圖拷貝到屏幕上進(jìn)行顯 cdc->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0, 0,SRCCOPY); //繪圖完成后的清理 MemBitmap.DeleteObject(); MemDC.DeleteDC(); ReleaseDC(cdc); }(4):微軟官方幫助:
CBitmap Class
封裝Windows圖形設(shè)備接口(GDI)位圖并提供成員函數(shù)操作位圖。
class CBitmap : public CGdiObject ?成員公共構(gòu)造函數(shù)
| CBitmap::CBitmap | 構(gòu)造?CBitmap?對(duì)象。 |
公共方法
| CBitmap::CreateBitmap | 初始化具有指定的寬度、高度和位組合的設(shè)備相關(guān)的內(nèi)存位圖的對(duì)象。 |
| CBitmap::CreateBitmapIndirect | 初始化位圖的對(duì)象與?BITMAP?結(jié)構(gòu)(如果指定了)生成的寬度、高度和位組合。 |
| CBitmap::CreateCompatibleBitmap | 初始化使用位圖的對(duì)象,以使其與指定的設(shè)備兼容。 |
| CBitmap::CreateDiscardableBitmap | 初始化與指定的設(shè)備兼容的一discardable位圖的對(duì)象。 |
| CBitmap::FromHandle | 返回指向?CBitmap?對(duì)象,同時(shí)使處理Windows?HBITMAP?位圖。 |
| CBitmap::GetBitmap | 用有關(guān)位圖的信息來加載一?BITMAP?結(jié)構(gòu)。 |
| CBitmap::GetBitmapBits | 復(fù)制指定的位圖的位到指定緩沖區(qū)。 |
| CBitmap::GetBitmapDimension | 返回位圖的寬度和高度。?該高度和寬度假定由?SetBitmapDimension?成員函數(shù)之前設(shè)置。 |
| CBitmap::LoadBitmap | 通過填寫命名位圖資源從應(yīng)用程序的可執(zhí)行文件和附加位圖初始化對(duì)象到對(duì)象。 |
| CBitmap::LoadMappedBitmap | 加載位圖和映射顏色設(shè)置為當(dāng)前系統(tǒng)顏色。 |
| CBitmap::LoadOEMBitmap | 通過加載預(yù)定義的Windows位圖和附加位圖初始化對(duì)象到對(duì)象。 |
| CBitmap::SetBitmapBits | 將位圖的位到指定的位值。 |
| CBitmap::SetBitmapDimension | 分配寬度和高度到0.1個(gè)單位的位圖。 |
公共運(yùn)算符
| CBitmap::operator HBITMAP | 返回Windows處理附加到?CBitmap?對(duì)象。 |
總結(jié)
以上是生活随笔為你收集整理的图形操作类CBitmap 把内存数据输出到PIC控件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果拒绝英国政府监控要求,威胁在该国停止
- 下一篇: CImage类的使用介绍!